Скрипт Powershell завершается во время выполнения при выполнении выражения Invoke - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь выполнить приведенный ниже код, когда время выполнения достигает первого выражения invoke, сценарий завершается без выполнения оставшегося файла кода .ps1. Это происходит в Windows 7 с PowerShell v3. Любые указатели здесь приветствуются. Я пытался использовать Try {Invoke-expression ""} catch {$ _}, но в журналах показано, что скрипт завершается.

    $HardWares=@("abc","def")
    Write-Info ("Deleting device driver with $application")
    foreach ($HardWare in $HardWares){
        Write-Info ("working on hardware $HardWare")
        $DriverID = (Get-WmiObject -Class Win32_PnpSignedDriver | Where-Object {$_.hardwareID -eq $HardWare} | Select-Object InfName -ExpandProperty InfName | Select-Object -Unique)
        if ($DriverID){
            Write-Info ("Removing $HardWare and deleting $DriverID")
            $HardwareRemoveCmd = "D:\Users\App.exe remove $HardWare" 
            Invoke-Expression $HardwareRemoveCmd                              
            $Command= "D:\Users\App.exe dp_delete $DriverID -f"
            Invoke-Expression $Command
        } else {Write-Info "Could not find $DriverID file for $HardWare"}
    }

1 Ответ

0 голосов
/ 01 июля 2018

Возможно, проблема в том, что вы создали переменную с именем $ DriverID, но вы проверяете, возвращает ли $ Driverid значение true. Создание переменных чувствительно к регистру, поэтому у вас есть две разные переменные. Это вернет false, в результате чего скрипт будет пропущен в операторе else.

Если вы хотите, чтобы «не было найдено $ Driverid» для записи на дисплей, вам нужно поставить «Write-Host» перед ним.

Приведенная в порядок версия вашего кода.

{
    $Driverid = (Get-WmiObject -Class Win32_PnpSignedDriver | Where-Object 
    {$_.hardware -eq $HardWare} | Select-Object InfName -ExpandProperty InfName 
    | Select-Object -Unique)

    if($Driverid)
    {  
        Invoke-Expression "D:\Users\App.exe remove $HardWare" 
        $Command= "D:\Users\App.exe dp_delete $Driverid -f" 
        Invoke-Expression $Command
    }
    else
    {   
        Write-Host "did not find any $Driverid"
    }
}

Надеюсь, это поможет!

...