Errore quando si chiama terzo partito eseguibile da PowerShell quando si utilizza un IDE

StackOverflow https://stackoverflow.com/questions/2095088

  •  21-09-2019
  •  | 
  •  

Domanda

Ho uno script PowerShell che utilizza du.exe ( Disk Usage originario di Sysinternals) per calcolare la dimensione di directory.

Se corro du c:\Backup nella console, funziona come previsto, ma la stessa linea di codice eseguito in ISE o PowerGUI dà il risultato atteso, più l'errore

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

Perché? Come evitare questo errore? Ho provato invoke-espressione, utilizzando &, ma non andare.

Grazie per l'aiuto.

È stato utile?

Soluzione

Per evitare questo è possibile reindirizzare stderr a null per esempio:.

du 2> $null

In sostanza l'host console e ISE (così come i servizi remoti) considerare il flusso stderr in modo diverso. Sull'host console è stato importante per PowerShell per supportare applicazioni come edit.com di lavorare insieme ad altre applicazioni che scrivono uscita colorata e gli errori sullo schermo. Se il flusso di I / O non viene reindirizzato su un host console, PowerShell dà il file EXE nativo una maniglia console di scrivere direttamente. Questo bypassa PowerShell in modo PowerShell non può vedere che ci sono errori scritti in modo che non possa segnalare l'errore tramite $ errori o scrivendo a flusso stderr di PowerShell.

ISE e servizi remoti non hanno bisogno di sostenere questo scenario in modo che fanno vedere gli errori in stderr e successivamente scrivere l'errore di errore e l'aggiornamento $.

Altri suggerimenti

Recentemente ho dovuto affrontare gli stessi problemi, ma vorrei ottenere l'output stderr diretta a stdout. Si potrebbe pensare che il seguente dovrebbe funzionare:

    & du 2>&1

Ma PowerShell sarà interpretare il reindirizzamento e di processo che dopo 'du' è completato. Il work-around che ho trovato è quello di richiamare utilizzando cmd.exe / c:

    & cmd /c 'du 2>&1'

Un altro modo per eliminare l'output NativeCommandError è quello di convertire i oggetti in cantiere per stringhe , come indicato in fondo a questa risposta :

du c:\Backup 2>&1 | %{ "$_" }

Prova:

du 2>&1 | %{ "$_" }

FIX precedente reindirizzerà gli errori, ma si potrebbe perdere un vero e proprio errore se per esempio il vostro nome utente o la password non è buono o se si utilizza l'autenticazione integrata, non si ha accesso.

Quindi, ecco un modo per implementare la gestione degli errori e ignorare l'errore specifico (che non è uno) sollevata dal PsExec.

 try{
            	psexec command .....
            }
            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
            }

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top