Erreur lors de l'appel exécutable 3ème partie de Powershell lorsque vous utilisez un IDE

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

  •  21-09-2019
  •  | 
  •  

Question

J'ai un script PowerShell qui utilise du.exe ( Utilisation du disque à l'origine de Sysinternals) pour calculer la taille des répertoires.

Si je lance du c:\Backup dans la console, cela fonctionne comme prévu, mais la même ligne de code execute ISE ou PowerGUI donne le résultat attendu, plus l'erreur

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

Pourquoi? Comment puis-je éviter cette erreur? J'ai essayé Invoke-expression, en utilisant &, mais pas aller.

Merci pour l'aide.

Était-ce utile?

La solution

Pour éviter cela, vous pouvez rediriger stderr à null par exemple:.

du 2> $null

Essentiellement l'hôte de la console et ISE (ainsi que Remoting) traiter le flux stderr différemment. Sur l'hôte de la console, il était important pour PowerShell pour soutenir des applications telles que edit.com de travailler avec d'autres applications qui écrivent la sortie de couleur et des erreurs à l'écran. Si le flux d'E / S n'est pas redirigé sur l'hôte de la console, PowerShell donne l'EXE natif une poignée de console pour écrire directement. Cela permet de contourner PowerShell afin PowerShell ne peut pas voir qu'il ya des erreurs écrites il ne peut pas signaler l'erreur par erreur $ ou en écrivant au flux stderr PowerShell.

et ISE Remoting ne ont pas besoin de soutenir ce scénario afin qu'ils ne voient les erreurs sur stderr, puis écrire l'erreur et la mise à jour de l'erreur $.

Autres conseils

J'ai récemment été confronté aux mêmes problèmes, mais je voudrais obtenir la sortie stderr dirigée vers stdout. On pourrait penser que ce qui suit fonctionnerait:

    & du 2>&1

Mais PowerShell interprete la redirection et traiter après « du » est terminé. Le travail que je trouve autour est d'invoquer à l'aide de cmd.exe / c:

    & cmd /c 'du 2>&1'

Une autre façon de supprimer la sortie de NativeCommandError est de convertir les objets dans le pipeline à chaînes comme il est indiqué au bas de cette réponse :

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

Essayez:

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

FIX précédent redirigera les erreurs, mais vous risquez de perdre une véritable erreur si par exemple votre nom d'utilisateur ou mot de passe est bon ou si vous utilisez l'authentification intégrée, vous n'avez pas accès.

Voici donc un moyen de mettre en œuvre la gestion des erreurs et contourner l'erreur spécifique (qui est pas) soulevée par 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
            }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top