gpt4 book ai didi

powershell - Powershell PSSession变量上下文

转载 作者:行者123 更新时间:2023-12-02 23:29:02 25 4
gpt4 key购买 nike

我正在使用New-PSSession通过Invoke-Command在远程计算机上运行命令。例如,假设我运行命令FROM的计算机称为FROM-MACHINE,而我运行命令TO的计算机称为TO-MACHINE。

$session = New-PSSession -ComputerName TO-MACHINE
$script = ScriptBlock::Create("Write-Host Machine name is $env:COMPUTERNAME")
Invoke-Command -session $session -scriptBlock $script

我希望这能输出:
Machine name is TO-MACHINE

但是,它实际上输出
Machine name is FROM-MACHINE

在文件路径的情况下也会发生这种情况-如果我想在“C:\ myprogram.exe”中运行程序,powershell将尝试在“\\ FROM-MACHINE \ c $ \ myprogram.exe”中找到myprogram.exe。

我的问题是:有什么方法(除了使用psexec之外)真正运行远程命令,变量和所有命令?我在这里缺少简单的东西吗?

最佳答案

发生这种情况是因为您在脚本块创建中使用了双引号引起来的字符串。在创建脚本块之前,将$ env:COMPUTERNAME扩展为本地计算机名称。如果您使用单引号引起来的字符串,则$ env:COMPUTERNAME将作为原义文本在脚本块中传递,并且在远程计算机上执行扩展之前不会进行扩展。因此,当您从字符串中创建脚本块以在远程计算机上执行时,当您要在脚本块中使用局部变量时,我们使用可扩展(双引号)字符串,而当您要使用时使用非扩展(单引号)字符串远程计算机上的变量。

$session = New-PSSession -ComputerName TO-MACHINE
$script = [ScriptBlock]::Create('$env:COMPUTERNAME')
Invoke-Command -session $session -scriptBlock $script

如果要在同一脚本块中混合使用,请使用可扩展字符串,然后使用反引号对所有远程变量引用中的$进行转义:
$session = New-PSSession -ComputerName TO-MACHINE 
$script = [ScriptBlock]::Create(" Write-output $env:Computername; Write-Output `$env:COMPUTERNAME ")
Invoke-Command -session $session -scriptBlock $script

关于powershell - Powershell PSSession变量上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com