Powershell代码在编辑器中工作,但在Powershell cmd中却没有吗?

时间:2011-10-15 14:55:08

标签: powershell cmd xp-mode

当我在编辑器中运行此代码时,它完美地运行: (不是一个错误)

$vm = 0
$vpc=new-object –com VirtualPC.Application –Strict
foreach ($vm in $vpc.VirtualMachines){}
$broken = Get-WmiObject Win32_PnPEntity | where {$_.ConfigManagerErrorCode -ne 0}
$usbDevice = $vpc.USBDeviceCollection | ? {$_.DeviceString -eq $usb} | select -first 1
$vm.AttachUSBDevice($usbDevice)

当我把这段代码放在一行时;最后:

$vm = 0; $vpc=new-object –com VirtualPC.Application –Strict; foreach ($vm in $vpc.VirtualMachines){}; $broken = Get-WmiObject Win32_PnPEntity | where {$_.ConfigManagerErrorCode -ne 0}; $usbDevice = $vpc.USBDeviceCollection | ? {$_.DeviceString -eq $usb} | select -first 1; $vm.AttachUSBDevice($usbDevice)

它给我0×80020005错误:

Exception calling "AttachUSBDevice" with "1" argument(s): "Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_T
YPEMISMATCH))"
At line:1 char:293
+ $vpc=new-object -com VirtualPC.Application -Strict; $vm = $vpc.findVirtualMachine("Windows XP Mode"); $broken = Get-W
miObject Win32_PnPEntity | where {$_.ConfigManagerErrorCode -ne 0}; $usbDevice = $vpc.USBDeviceCollection | ? {$_.Devic
eString -eq $usb} | select -first 1; $vm.AttachUSBDevice <<<< ($usbDevice)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

有人知道如何解决这个问题吗?

(我知道代码有点奇怪但不是重点:))

1 个答案:

答案 0 :(得分:1)

您的代码存在许多问题,它可能只是在您的编辑器中工作,因为您的编辑器运行空间中设置了一些变量等,这些变量在代码中没有。即使它应该在编辑器中工作,也可能不是你想要发生的事情或者你期望它做什么。

例如,$usb未在代码中的任何位置定义。所以基本上$usbDevice将会出现空白,并且在下一个命令中,您必然会遇到类型不匹配。

其他更正/建议:

$vm = 0 - 您不必“声明”变量。 Powershell是一种动态语言。

foreach ($vm in $vpc.VirtualMachines){} - 这一行有什么意义?最后,您将$vm拥有$vpc.VirtualMachines

中的最后一个虚拟机

为什么要将它们放在一行?如果需要,您可以复制行并粘贴到控制台中。或者,您可以将它们放在脚本中并运行脚本。