powershell - Powershell Hyper-V 远程执行没有收到响应
问题描述
我有一台工作机 (A) 和一台不同的 Hyper-V 服务器 (B) 运行着虚拟机。
如果我使用 RDP 连接到 Hyper-V 服务器 B 并运行,Get-VM Where-Object {$_.State -eq 'Running'}
我会得到一个有效的答案:
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
接下来,我编写了一个 PS 脚本在我的工作机器 A 上运行:
$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 中),而在服务器上它是即时运行的。
编辑:添加 -AsJob 参数编辑:固定变量
解决方案
经过一番调试,我找到了答案:当只有 1 台机器在运行时,返回结果是一个 type 的对象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)
由于某种原因,执行 a 似乎不起作用。
在我看来,问题在于该方法要么返回一个对象,要么返回一个数组。
推荐阅读
- python - 在 python 中使用 ARIMAX 中的外生变量进行预测
- json - 解析嵌套的 JSON 对象 Flutter
- app-lab - Code.org 的 AppLab readRecords 功能问题
- python - 资源最少的线性规划解决方案
- android - 如何解释 NDK 展开
- sql - 如何在 Oracle SQL 中查找 col 具有特殊字符或数字(连字符、撇号和空格除外)的行
- sql - SQL 计数:不稳定的行为
- angular - 找不到模块“@angular-persian/material-date-picker”或其相应的类型声明
- javascript - Javascipt 正则表达式获取两个字符之间的字符串,除了转义而不向后看
- react-native - 基于json索引的反应原生映射/循环多维数组?