我发现了一个非常旧的线程here似乎回答了这个问题,但是当我尝试实现代码时,我没有得到预期的变量扩展。基于此
$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(Notepad.exe)吧
我在这里遇到了什么问题? v2和更高版本之间有什么区别吗? 我确实使用$ ExecutionContext.InvokeCommand.ExpandString(),但这也允许任意代码执行,我试图避免。最终,我有大量不同的字符串存储在XML中,不同的变量排列散布在字符串中,并且这些不同变量的实际值在运行时分配。而且我需要将这些值推送到许多可能的特定字符串中。因为有太多潜在的字符串和变量,所以我不能轻易使用简单的格式方法。所以最终我需要$ ExecutionContext.InvokeCommand.ExpandString()的功能,但实际上只是扩展变量,没有其他代码执行。 非常感谢任何帮助。
答案 0 :(得分:0)
或者你可以只替换文字。
Param($var1,$var2,$var3)
$Content = Get-Content C:\Path\To\file.xml
$Content -replace '\$var1', "$var1" -replace '\$var2', "$var2" -replace '\$var3', "$var3"
答案 1 :(得分:0)
正如你所写的那样,你不会完全得到你所期望的,因为你在字符串周围有单引号,你指的是$ Arguments,这意味着$ foo无论如何也不会被视为变量。
编辑:即使使用双引号仍然无法工作。必须在$ foo中引用它之前为$ 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