web-dev-qa-db-fra.com

PowerShell sortant toujours avec le code de sortie 1

Je dispose d'un problème sur plusieurs machines pour un client: lors de l'exécution d'un script PowerShell, le processus existe toujours avec SIXITCODE 1, sauf si un code de sortie est explicitement spécifié dans le script (par exemple, exit 0).

  • Autant que je sache, le processus devrait quitter avec la sortieCode 0 Lorsque le script a couru avec succès, et quand je l'exécute sur ma propre machine, ou n'importe quel serveur en dehors de ce client, le code de sortie est 0:
    > ver
      Microsoft Windows [Version 6.3.9600]
    
    > type test.ps1
      Write-Host testing
    
    > echo %ERRORLEVEL%
      0
    
    > powershell -NoProfile -NonInteractive -NoLogo ./test.ps1
      testing
    
    > echo %ERRORLEVEL%
      1
    

Est-ce que quelqu'un sait comment je peux résoudre ce problème?

1
ikkentim

Après la mise à jour de la dernière version de Powershell, la question a été résolue.

0
ikkentim

(continue de mon commentaire)

Ce sont deux choses complètement séparées:

  • > type test.ps1
      Write-Host testing
    
    > echo %ERRORLEVEL%
      0
    
    C'est juste en utilisant Get-Content (Si vous étiez dans la console PowerShell, pas cmd.exe) Pour afficher le texte dans le script: [.____]
    • ainsi, la commande est exécutée ici est Get-Content, pas votre code de script
    • sauf si vous faites cela à une invite CMD, il s'agit de la commande interne de type DOS, pas de PowerShell du tout

  • > powershell -NoProfile -NonInteractive -NoLogo ./test.ps1
      testing
    
    > echo %ERRORLEVEL%
      1
    
    • Ceci est en train d'exécuter le script en appelant powershell.exe à partir de cmd.exe, et n'est pas une comparaison des pommes à pommes, vous conduisant à de faux résultats.
    • Exécuter echo %ERRORLEVEL% dans une coquille PS n'a pas de sens, car le PS n'a aucune idée de ce que %ERRORLEVEL% est dans ce contexte d'utilisation; Pour voir la dernière erreur, vous utilisez les variables d'erreur système PS, pas CMD.exe/Dons trucs.

Le code que vous avez posté est de faire tout ce qui est dans cmd.exe, pas PowerShell; ver est la commande interne DOS, pas une commande PowerShell:

  • ver /?
    
      Displays the Windows version.
    
    Get-CimInstance -ClassName CIM_OperatingSystem
    
      SystemDirectory     Organization BuildNumber RegisteredUser SerialNumber            Version
      ---------------     ------------ ----------- -------------- ------------            -------
      C:\WINDOWS\system32              19043       Test00         00000-00000-00000-AAOEM 10.0.19043
    
  • Juste la version: [.____]
    (Get-CimInstance -ClassName CIM_OperatingSystem).Version
    
      10.0.19043
    

Voir aussi: Renvoyer un code de sortie d'un script PowerShell

1
postanote