Powershell Hyper-V 远程执行没有收到任何响应
Powershell Hyper-V remote execution receives no response
我有一台工作机器 (A) 和一台带有虚拟机的不同 Hyper-V 服务器 (B) 运行ning。
如果我使用 RDP 和 运行 Get-VM Where-Object {$_.State -eq 'Running'}
连接到 Hyper-V 服务器 B,我得到一个有效的答案:
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status
---- ----- ----------- ----------------- ------ ------
vm1 Running 2 2048 20:07:05 Operating normally
vm2 Running 0 1024 3.00:49:30 Operating normally
接下来,我在我的工作机器A上写了一个PS脚本到运行:
$sess = New-PSSession $SETTING_SESSION_HOST
$commandStr = "Get-VM | Where-Object { `$_.State -eq 'Running' }"
#or a simple version: $commandStr = "Get-VM"
[console]::writeline("Executing: [{0}]", $commandStr)
$commandBlock = [scriptblock]::Create($commandStr)
$job = Invoke-Command -Session $sess -ScriptBlock $commandBlock -AsJob
Wait-Job $job
$vml = Receive-Job $job
foreach($m in $vml)
{
[console]::writeline("Executing: [{0}]", $m.Name)
}
$g = Format-List -InputObject $vml
[console]::writeline("format list: [{0}]", $g)
我希望看到 2 行分别包含 "vm1" 和 "vm2"。但我得到一个空洞的回应:
Executing: [Get-VM | Where-Object { $_.State -eq 'Running' }]
format list: []
知道如何从远程作业获得远程响应吗?
此外,脚本的执行时间约为 6 秒(全部花费在 Wait-Job 中),而在服务器上它是瞬时 运行s。
编辑:添加了 -AsJob 参数
编辑:固定变量
我可以提出以下建议:
$sess = New-PSSession $SETTING_SESSION_HOST
$wml = Invoke-Command -Session $sess -ScriptBlock {Get-VM | where State -eq 'Running'}
$wml.Name
PS:在写这篇文章时,我注意到你将 $wml
设置为 Receive-Job $job
但随后你遍历了 $vml
所以它可能只是一个错字 v
w
经过一些调试,我找到了答案:当只有一台机器运行时,那么return结果是一个Microsoft.HyperV.PowerShell.VirtualMachine
类型的对象,所以这段代码很好用:
$vml = Invoke-Command -Session $sess -ScriptBlock {Get-VM | where State -eq 'Running'}
$vml.Name
但是,如果有超过 1 台机器 运行,那么结果是 Object[]
,我发现有效的代码是这样的:
$vml = Invoke-Command -Session $sess -ScriptBlock {Get-VM | where State -eq 'Running'}
$len = $vml.length
if ($len)
{
[console]::writeline("Machine count: [{0}]", $len)
for ($i=0; $i -lt $len; $i++)
{
$m = $vml[$i]
[console]::writeline("machine: [{0}]", $m.Name)
}
}
else
{
[console]::writeline("Machine: [{0}]", $vml.Name)
}
请注意,由于某些原因,foreach($m in $vml)
似乎不起作用。
我认为问题是该方法是 return 对象或数组。
我有一台工作机器 (A) 和一台带有虚拟机的不同 Hyper-V 服务器 (B) 运行ning。
如果我使用 RDP 和 运行 Get-VM Where-Object {$_.State -eq 'Running'}
连接到 Hyper-V 服务器 B,我得到一个有效的答案:
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status
---- ----- ----------- ----------------- ------ ------
vm1 Running 2 2048 20:07:05 Operating normally
vm2 Running 0 1024 3.00:49:30 Operating normally
接下来,我在我的工作机器A上写了一个PS脚本到运行:
$sess = New-PSSession $SETTING_SESSION_HOST
$commandStr = "Get-VM | Where-Object { `$_.State -eq 'Running' }"
#or a simple version: $commandStr = "Get-VM"
[console]::writeline("Executing: [{0}]", $commandStr)
$commandBlock = [scriptblock]::Create($commandStr)
$job = Invoke-Command -Session $sess -ScriptBlock $commandBlock -AsJob
Wait-Job $job
$vml = Receive-Job $job
foreach($m in $vml)
{
[console]::writeline("Executing: [{0}]", $m.Name)
}
$g = Format-List -InputObject $vml
[console]::writeline("format list: [{0}]", $g)
我希望看到 2 行分别包含 "vm1" 和 "vm2"。但我得到一个空洞的回应:
Executing: [Get-VM | Where-Object { $_.State -eq 'Running' }]
format list: []
知道如何从远程作业获得远程响应吗? 此外,脚本的执行时间约为 6 秒(全部花费在 Wait-Job 中),而在服务器上它是瞬时 运行s。
编辑:添加了 -AsJob 参数 编辑:固定变量
我可以提出以下建议:
$sess = New-PSSession $SETTING_SESSION_HOST
$wml = Invoke-Command -Session $sess -ScriptBlock {Get-VM | where State -eq 'Running'}
$wml.Name
PS:在写这篇文章时,我注意到你将 $wml
设置为 Receive-Job $job
但随后你遍历了 $vml
所以它可能只是一个错字 v
w
经过一些调试,我找到了答案:当只有一台机器运行时,那么return结果是一个Microsoft.HyperV.PowerShell.VirtualMachine
类型的对象,所以这段代码很好用:
$vml = Invoke-Command -Session $sess -ScriptBlock {Get-VM | where State -eq 'Running'}
$vml.Name
但是,如果有超过 1 台机器 运行,那么结果是 Object[]
,我发现有效的代码是这样的:
$vml = Invoke-Command -Session $sess -ScriptBlock {Get-VM | where State -eq 'Running'}
$len = $vml.length
if ($len)
{
[console]::writeline("Machine count: [{0}]", $len)
for ($i=0; $i -lt $len; $i++)
{
$m = $vml[$i]
[console]::writeline("machine: [{0}]", $m.Name)
}
}
else
{
[console]::writeline("Machine: [{0}]", $vml.Name)
}
请注意,由于某些原因,foreach($m in $vml)
似乎不起作用。
我认为问题是该方法是 return 对象或数组。