使用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
额外优化说明
- 将
-like替换为-contains:因为$_.AccessPaths是数组类型,-contains能更精准地匹配分区的访问路径,避免模糊匹配带来的错误。 - 添加
if ($SCSI)判断:避免因找不到对应磁盘时输出空值,改为返回"N/A",提升脚本的鲁棒性。
修改后通过Invoke-VMScript执行,应该会和本地执行得到一致的结果,正确显示每个卷对应的DiskID和SCSI编号。
内容的提问来源于stack exchange,提问作者Nash A
相关产品推荐
相关产品推荐

