2015-02-10 69 views
0

我發現一個很老的線程here似乎回答了這個問題,但是當我試圖實現代碼時,我沒有得到預期的變量擴展。在此基礎上Powershell中的安全後期變量擴展

$Arguments = '$foo (Notepad.exe) bar' 
$foo = 'Foooooo' 
$InitSB = {$ExecutionContext.SessionState.Applications.Clear(); $ExecutionContext.SessionState.Scripts.Clear(); Get-Command | %{$_.Visibility = 'Private'}} 
$SafeStringEvalSB = {param($str) $str} 
$job = Start-Job -Init $InitSB -ScriptBlock $SafeStringEvalSB -ArgumentList $Arguments 
Wait-Job $job > $null 
Receive-Job $job 

我希望找回Foooooo(記事本)條

我有什麼錯嗎?並且v2和更高版本之間是否有區別? 我確實有這個工作使用$ ExecutionContext.InvokeCommand.ExpandString(),但它允許任意代碼執行以及我試圖避免。最終,我有大量不同的以XML存儲的字符串,變量中散佈着不同的變量排列,並且這些不同變量的實際值在運行時被分配。而且我需要將這些值推送到許多可能出現的特定字符串中。因爲有太多潛在的字符串和變量,我不能輕易使用簡單的格式方法。因此,最終我需要$ ExecutionContext.InvokeCommand.ExpandString()的功能,但實際上僅限於擴展變量,而沒有其他代碼執行。 任何幫助非常感謝。

回答

0

或者,您可以只替換文本。

Param($var1,$var2,$var3) 
$Content = Get-Content C:\Path\To\file.xml 
$Content -replace '\$var1', "$var1" -replace '\$var2', "$var2" -replace '\$var3', "$var3" 
0

正如你寫它,你不會得到你所期望的,純粹是因爲你必須在你的字符串單引號,你是分配給$參數,這意味着$ foo的不會反正視爲變量。

編輯:即使用雙引號仍然不會工作。在$ Arguments中引用它之前,必須將值賦給$ foo。

$foo = 'Foooooo' 
$Arguments = "$foo (Notepad.exe) bar" 
$InitSB = {$ExecutionContext.SessionState.Applications.Clear(); $ExecutionContext.SessionState.Scripts.Clear(); Get-Command | %{$_.Visibility = 'Private'}} 
$SafeStringEvalSB = {param($str) $str} 
$job = Start-Job -Init $InitSB -ScriptBlock $SafeStringEvalSB -ArgumentList $Arguments 
Wait-Job $job > $null 
Receive-Job $job 
+0

難道不這不是因爲在一次'$ arguments'聲明'$ foo'將工作'$ null' – Matt 2015-02-11 03:31:24

+0

它的工作原理,因爲它是寫的,我跑的代碼在本地,我在這裏粘貼。 – 2015-02-11 12:03:00

+0

嘗試在_new_會話中再次運行。這是我的輸出運行此代碼「(Notepad.exe)」 – Matt 2015-02-11 12:09:52