You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Invoke-VMScript查询WMI磁盘未获预期结果,请求技术指导

问题分析与解决:Invoke-VMScript执行时DiskID和SCSI编号无结果

你的问题核心在于在Invoke-VMScript的脚本块中嵌套使用Invoke-Command导致的变量作用域问题,以及不必要的冗余会话调用。

为什么本地执行正常,远程(Invoke-VMScript)执行失败?

在VM本地运行代码时,Invoke-Command默认在当前本地会话执行,外层的$Volume变量可以正常传递到嵌套的脚本块中。但通过Invoke-VMScript执行时,整个脚本已经在目标VM的guest环境中运行,嵌套的Invoke-Command会创建一个全新的本地会话,此时外层的$Volume变量无法跨会话访问,导致Get-Partition无法匹配到对应分区,最终返回空值。

而且这里完全不需要使用Invoke-Command——你已经通过Invoke-VMScript进入了目标VM的PowerShell环境,直接执行命令即可,不需要额外发起本地调用。

修改后的代码

移除嵌套的Invoke-Command,直接访问变量并执行命令:

$code = @'
$Volumes = Get-WmiObject Win32_Volume | Where-Object {$_.DriveType -eq "3" -and $_.Label -ne "System Reserved"}
ForEach ($Volume in $Volumes) {
    "" | Select-Object -Property @{N="Caption";E={$Volume.Caption}},
    @{N="Disk";E={(Get-Partition | Where-Object {$_.AccessPaths -contains $Volume.Caption}).DiskNumber}},
    @{N="SCSI Id";E={
        $Disk = (Get-Partition | Where-Object {$_.AccessPaths -contains $Volume.Caption}).DiskNumber
        $SCSI = Get-WmiObject -Class Win32_DiskDrive | Where-Object {$_.Index -eq $Disk}
        if ($SCSI) { "$($SCSI.SCSIPort):$($SCSI.SCSITargetID)" } else { "N/A" }
    }}
}
'@
Invoke-VMScript -ScriptText $code -vm DBS103 -GuestUser 'user' -GuestPassword 'usrpw' -ScriptType Powershell

额外优化说明

  1. 将-like替换为-contains:因为$_.AccessPaths是数组类型,-contains能更精准地匹配分区的访问路径,避免模糊匹配带来的错误。
  2. 添加if ($SCSI)判断:避免因找不到对应磁盘时输出空值,改为返回"N/A",提升脚本的鲁棒性。

修改后通过Invoke-VMScript执行,应该会和本地执行得到一致的结果,正确显示每个卷对应的DiskID和SCSI编号。

内容的提问来源于stack exchange,提问作者Nash A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:03:07