for ($i=1; $i -lt 3; $i ){
$tT=$i
$ExecutionContext.InvokeCommand.ExpandString($o0)
echo $o0
echo $tT
}
$o0="weird${tT}";
輸出:怪異2怪異2 1怪異2怪異2 2
這是為什么?我期待
奇怪的 1 奇怪的 1 1 奇怪的 2 奇怪的 2 2
我怎樣才能讓事情發揮作用?
uj5u.com熱心網友回復:
您當前的回圈不會更改$o0. 如果您在干凈的 PS 會話中執行代碼,它只會輸出空行,后跟一和二。因為只有$tT一個值。
您需要$o0在回圈中包含以在運行時實際列印它。
for ($i=1; $i -lt 3; $i ){
$tT=$i
$o0="weird${tT}";
echo $o0
echo $tT
}
$ExecutionContext.InvokeCommand.ExpandString($o0)與您目前擁有的相比,這并不是那么有用。
uj5u.com熱心網友回復:
實際上我被 Powershell ISE 欺騙了。顯然,“運行腳本”并沒有清除以前的背景關系,這就是為什么輸出可能非常具有誤導性。正如 Seth 指出的,上述腳本的正確輸出實際上不包含“weird2”,而只包含“1”和“2”。
uj5u.com熱心網友回復:
您的代碼附帶的問題是您正在定義您的字串模板,$o0只有在您嘗試使用它之后。
這個問題被 ISE 的有效點源腳本呼叫的不幸行為所掩蓋。即在重復呼叫期間在同一范圍內執行它們,這可能會產生副作用。
順便說一句:PowerShell ISE不再積極開發,有理由不使用它(底部),特別是無法運行 PowerShell (Core) 6 。提供最佳 PowerShell 開發體驗的積極開發的跨平臺編輯器是帶有PowerShell 擴展的Visual Studio Code。
您的代碼的概念性問題是您錯誤地使用可擴展(雙引號)字串 ( "...")來定義字串模板,這會導致即時擴展(插值)。
使用的要點$ExecutionContext.InvokeCommand.ExpandString()是向它傳遞一個帶有未擴展變數參考和子運算式的字串值,以便按需擴展它們,以及當時的變數值和運算式結果。
要創建這樣一個未擴展的字串值,您需要一個逐字(單引號)字串 ( '...')。
因此,您的代碼應該是:
# Define the string template
# *as a verbatim string*, i.e. *single-quoted*
$o0='weird${tT}'
for ($i=1; $i -lt 3; $i ) {
# (Re)define $tT
$tT=$i
# Use on-demand expansion of the value of $o0,
# which uses the current value of $tT
$ExecutionContext.InvokeCommand.ExpandString($o0)
}
輸出:
weird1
weird2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/415801.html
標籤:
上一篇:用于從文本檔案復制檔案夾/檔案的Powershell腳本
下一篇:從csv檔案頭值替換AD屬性值
