【问题标题】:Safe late variable expansion in PowershellPowershell 中的安全后期变量扩展
【发布时间】:2015-02-10 23:40:03
【问题描述】:

我发现了一个非常老的线程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() 的功能,但仅限于实际上只是扩展变量,没有其他代码执行。 非常感谢任何帮助。

【问题讨论】:

    标签: variables powershell expansion


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      正如你所写的那样,你不会得到你所期望的,因为你在分配给 $Arguments 的字符串周围有单引号,这意味着 $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
      

      【讨论】:

      • 这行不通,因为在$arguments 被声明为$foo 时将是$null
      • 它按它写的那样工作,我在本地运行我粘贴在这里的代码。
      • 尝试在 new 会话中再次运行。这是我运行此代码“(Notepad.exe)栏”的输出
      • 你是对的,我一定是之前设置了变量,它不再起作用了。无论哪种方式,正如最初的问题所代表的那样,它无论如何都不会起作用,因为使用了单引号。
      猜你喜欢
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多