簡體   English   中英

Powershell不擴展Foreach-Object中的變量字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM