Код Powershell работает в редакторе, но не в PowerShell.

Когда я запускаю этот код в редакторе, он работает отлично: (ни одной ошибки)

$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 ответ

Решение

Есть много проблем с вашим кодом, и он может просто работать в вашем редакторе из-за некоторых переменных и т. Д., Установленных в пространстве выполнения вашего редактора, которых нет в коде. И даже когда он предположительно работал в редакторе, это может быть не тем, что вы хотели, или тем, что вы ожидали.

Например $usb не определено нигде в вашем коде. Так в основном $usbDevice выйдет пустым, и в следующей команде вы обязательно получите несоответствие типов.

Другие исправления / предложения:

$vm = 0 - Вам не нужно "объявлять" переменные. Powershell - это динамический язык.

foreach ($vm in $vpc.VirtualMachines){} - какой смысл этой линии? В конце концов вы получите $vm имея последнюю виртуальную машину из $vpc.VirtualMachines

Почему вы хотите, чтобы они были в одной строке? Вы можете скопировать строки и вставить в консоль, если хотите. Или вы можете поместить их в скрипт и запустить скрипт.

Другие вопросы по тегам