[英]Powershell Not Expanding Variable String inside Foreach-Object
我正在嘗試使用Powershell字符串擴展來模擬一些字符串。 當我使用字符串文字時它很好,但是當我將字符串作為變量傳遞時它不起作用。 我需要做些什么不同的事情?
$list = Get-Process
# this works fine
$list | ForEach-Object {"$($_.ProcessName)"}
# this doesn't
$template = "$($_.ProcessName)"
$list | ForEach-Object {$template}
你不能只用普通的字符串來做這件事。 但是,您可以將字符串放在scriptblock中 ,然后使用call運算符&
調用它:
$template = {"$($_.ProcessName)"}
$list | ForEach-Object {&$template}
在$template
中生成字符串時, $_
不存在。 因此,您將獲得一個空字符串。
你最好使用:
$template = "{0}"
$list | ForEach-Object { $template -f $_.ProcessName }
這使用.NET的string.Format模板。 傳遞給-f
的參數是一個對象數組,所以如果你想要更多,你可以用逗號分隔它們:
"{0}-{1}" -f "One", "Two"
讓我們從第一個問題開始吧。
在運行$template = "$($_.ProcessName)"
您希望$template
的值為字符串$($_.ProcessName)
但事實並非如此。
> $template = "$($_.ProcessName)"
> "[" + $template + "]"
[]
評估雙引號中的表達式(並成為空字符串)。
您需要使用單引號來防止這種情況。
> $template = '$($_.ProcessName)'
> "[" + $template + "]"
[$($_.ProcessName)]
好。 那么讓我們在你的foreach循環中嘗試一下嗎?
> $list = Get-Process
> $template = '$($_.ProcessName)'
> $list | ForEach-Object {$template}
$($_.ProcessName)
$($_.ProcessName)
$($_.ProcessName)
$($_.ProcessName)
...
嗯......不是我們想要的。 那是因為powershell沒有將字符串作為表達式進行評估。 所以我們需要強迫它這樣做。
您可以使用Invoke-Expression
。
> $list = Get-Process
> $template = '$($_.ProcessName)'
> $list | ForEach-Object {Invoke-Expression $template}
procA
procB
procC
...
(您也可以使用腳本塊,因為iCodez在他們的答案中指出。我不能評論一種方法相對於另一種方法的相對優點。我認為腳本塊可能更具可擴展性和有用性。)
您還可以強制進行字符串擴展。 您需要使用單引號定義字符串,以便在此時不展開,然后在循環中使用:
$ExecutionContext.InvokeCommand.ExpandString($template)
對於你正在做的事情,其他答案可能更可取。 如果我不知道模板中的變量是什么,我使用這個,所以使用-f實際上不是一個選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.