如何在 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 或空的参数,然后重试该命令
如果你想使用参数-
param([type]$p1 = , [type]$p2 = , ...)
或:
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 .
我想将变量传递给新控制台,但我不知道如何。
$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 或空的参数,然后重试该命令
如果你想使用参数-
param([type]$p1 = , [type]$p2 = , ...)
或:
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
. 的值而失败
- 虽然一个脚本块被接受,但它只是字符串化,这导致它的逐字[=78] =] 内容作为参数传递(没有
因此,为了合并调用者作用域中的变量值,您必须使用字符串插值,使用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