Błąd podczas wywoływania programu wykonywalnego innej firmy z Powershell podczas korzystania z IDE

Mam skrypt PowerShell, który używa du.exe (Użycie dysku pochodzi z Sysinternals) do obliczania wielkości katalogów.

Jeśli uruchamiam du c:\Backup w konsoli, działa to zgodnie z oczekiwaniami, ale ta sama linia kodu uruchamiana w ISE lub PowerGui daje oczekiwany wynik plus błąd

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Dlaczego? Jak uniknąć tego błędu? Próbowałem wywołać wyrażenie, używając &, ale nie udało się. Dzięki za pomoc.
Author: darthbith, 2010-01-19

4 answers

Aby tego uniknąć Możesz przekierować stderr do null np.:

du 2> $null

Zasadniczo host konsoli i ISE (jak również remoting) traktują strumień stderr inaczej. Na serwerze konsoli ważne było, aby PowerShell obsługiwał takie aplikacje jak edit.com do pracy z innymi aplikacjami, które zapisują kolorowe dane wyjściowe i błędy na ekranie. Jeśli strumień We/Wy nie jest przekierowywany na host konsoli, PowerShell daje macierzystemu EXE uchwyt konsoli do bezpośredniego zapisu. To omija PowerShell więc PowerShell nie widzi, że są napisane błędy, więc nie może zgłosić błędu przez $error lub zapisując do strumienia stderr PowerShell.

ISE i remoting nie muszą obsługiwać tego scenariusza, więc widzą błędy na stderr, a następnie piszą błąd i aktualizują $error.

 50
Author: Keith Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 18:04:48

Ostatnio borykałem się z tymi samymi problemami, ale chciałbym, aby wyjście stderr zostało przekierowane na stdout. Można by pomyśleć, że zadziała:

    & du 2>&1

Ale PowerShell zinterpretuje przekierowanie i przetworzy je po zakończeniu 'du'. Obejście, które znalazłem, polega na wywołaniu go za pomocą cmd.exe / C:

    & cmd /c 'du 2>&1'
 46
Author: Simon Ejsing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-30 09:41:20

Innym sposobem na powstrzymanie wyjścia NativeCommandError jest konwersja obiektów w Potoku na ciągi znaków , Jak przedstawiono na dole ta odpowiedź :

du c:\Backup 2>&1 | %{ "$_" }
 37
Author: sschuberth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:41

Poprzednia poprawka spowoduje przekierowanie błędów, ale możesz stracić prawdziwy błąd, jeśli na przykład nazwa użytkownika lub hasło nie jest dobre lub jeśli za pomocą zintegrowanego uwierzytelniania, nie masz dostępu.

Oto sposób na zaimplementowanie obsługi błędów i ominięcie określonego błędu (który nie jest jednym) podniesionego przez psexec.

try {
    whoami # powershell commands
}
catch [System.Management.Automation.RemoteException] {
    if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe") {
        $error.Remove[$Error[0]]
    }
    else {
        Throw
    }
}        
catch {
    throw
}
 2
Author: Patrick Larose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-09 19:45:52