如何在 Powershell 中将变量传递给新控制台 window

How to pass a variable to new console window in Powershell

我想将变量传递给新控制台,但我不知道如何。

$server = "server_name"
Start-Process Powershell {
      $host.ui.RawUI.WindowTitle = “Get-Process”
      Invoke-Command -ComputerName $server -ScriptBlock {
             Get-Process
      }
cmd /c pause
}

错误信息:

Invoke-Command:无法验证参数 'ComputerName' 的参数。参数为 null 或空。提供一个不为 null 或空的参数,然后重试该命令

如果你想使用参数-

info

param([type]$p1 = , [type]$p2 = , ...)

或:

info

param(
[string]$server 
)

Write-Host $a

./Test.ps1 "your server name"
  • Start-Process only accepts (one or more) strings as arguments, not a script block ({ ... }).

    • 虽然一个脚本块被接受,但它只是字符串化,这导致它的逐字[=78] =] 内容作为参数传递(没有 {}),这意味着 $server 被保留 as-is(不是展开),并且运行您的命令的子进程没有定义该名称的变量,导致 Invoke-Command 由于未收到 -ComputerName.
    • 的值而失败
  • 因此,为了合并调用者作用域中的变量值,您必须使用字符串插值,使用expandable (double-quoted) string ("...") 对所有参数进行编码:[1]

$server = "server_name"
# Parameters -FilePath and -ArgumentList are positionally implied.
# For the resulting powershell.exe call, -Command is implied.
Start-Process powershell "
  $host.ui.RawUI.WindowTitle = 'Get-Process'
  Invoke-Command -ComputerName $server -ScriptBlock { Get-Process }
  pause
"

计算机名称($server,在您的例子中)不包含空格,但任何包含空格的变量值都需要 embedded 在整个 "..." 字符串,例如 \`"$someVar\`"`" 在 PowerShell 中将 " 转义到 "..." 字符串中,另外还需要 \ 来转义PowerShell CLI, powershell.exe).

的逐字结果 "

为了完全稳健,另外将整个字符串值(隐含的 -Command 参数)包含在嵌入的 "..." 引号 ("`"...`"") 中。

您可以使用 here-string 形式的可扩展字符串 (@"<newline>...<newline>"@) 使这更容易一些,您不需要在其中转义 " 个字符。

完全可靠的调用示例[​​=86=]:

$someVar = 'A value with   spaces'
Start-Process powershell @"
  -NoProfile -Command "
    # Echo the value of $someVar
    Write-Output \"$someVar\"
    pause
  "
"@

请注意在 -Command 之前使用 -NoProfile,它会抑制 profile files 的加载,从而加快调用速度并提供更可预测的执行环境。


[1] 从技术上讲,-ArgumentList 接受一个 数组 参数,并在传递 pass-through 个参数时 individually 在概念上可能更可取,long-standing bug unfortunately makes it better to encode all arguments in a single string - see .