Flash info

"Those who forget to script are doomed to repeat their work."

Jeffery Hicks (PowerShell MVP)

 
Accueil arrow Forum

Bienvenue sur le forum PowerShell-Scripting.com

 
Zekicker
Utilisateur

PowerShelleur Débutant
Messages: 4
graphgraph
Karma: 0  
Redirection des erreurs avec MD - 14/09/07 10:16 Bonjour,

J'ai consulté le post sur les redirections d'erreurs mais je ne comprends pas un petit détail:

(il est impossible d'écrire sur d:. c'est ce que je veux tester)

1)
Code:

 dir d:\toto -errorvariable toto 2$null


$toto contient l'erreur générée par dir

Code:

 md d:\toto -errorvariable toto 2$null


$toto est vide ...
md ne renvoie aucune erreur.

2)
Je viens de réussir à faire ce que je veux mais je ne vois pas la différence entre la commande ci-dessus et

Code:

 $toto md d:\toto 2>&1



Quelqu'un pourrait-il m'éclairer.

Merci

Message édité par: Zekicker, à: 14/09/07 11:21
  | | L'administrateur a désactivé l'accés public en écriture.
Arnaud
Admin

Administrateur
Messages: 1319
graphgraph
Karma: 45  
Re:Redirection des erreurs avec MD - 14/09/07 13:37 Bonjour Zekicker et bienvenue sur le forum

Je vais tenter de te répondre simplement mais le sujet est assez vaste...

Lorsque l'on utilise la syntaxe 2>$null ou 2>&1 on fait de la redirection du flux d'erreur. On redirige le message d'erreur.
Bien que cela fonctionne, il est possible de faire mieux...

Je m'explique. PowerShell possède ce que l'on appelle des variables de préférence. Elles définissent le comportement global de PowerShell. Il en existe une qui dicte le comportement de PowerShell face aux erreurs. Il s'agit de $ErrorActionPreference. Par défaut, les erreurs s'affichent à l'écran et selon le type d'erreur rencontrée soit l'exécution s'arrete, soit elle continue. La valeur de $ErrorActionPreference vaut "Continue" par défaut. Si tu la passes à "SilentlyContinue" tu n'auras plus de message à l'écran (bien que l'erreur ait quand même eu lieu). Il faut savoir qu'il existe une autre variable, la variable $error qui consigne toutes les erreurs (ou plutot tous les objets de type erreur devrais-je dire pour etre plus précis) rencontrées depuis l'ouverture de la console.

Une technique consiste donc à examiner $error[0] pour savoir si une erreur s'est produite après une commande. Ceci étant si l'on veut juste savoir si une commande s'est bien exécutée, ce n'est pas toujours l'idéal. C'est pourquoi il existe une autre variable (appelée variable automatique), la variable $?. Celle-ci est une variable booléenne qui contient "VRAI" si une commande s'est bien exécutée et "Faux" dans le cas contraire. C'est donc la variable qu'il te faut !

Exemple:
Code:

  $ErrorActionPreference="SilentlyContinue" Get-ChildItem d:\toto if ($?) { Write-Host "OK" } else{ Write-Host "Une erreur s'est produite" } $ErrorActionPreference="Continue"



Sinon tu peux aussi sans toucher à la variable globale $ErrorActionPreference utiliser les "common parameters" en faisant :

Code:

  Get-ChildItem d:\toto -ErrorAction SilentlyContinue if ($?) { Write-Host "OK" } else{ Write-Host "Une erreur s'est produite" }



Sinon pour ton second problème "md ..." c'est un peu plus subtil... Alors qu'en utilisant DIR tu fais appel à un alias de cmdlet. Pas de problème.
En utilisant MD tu fais sans le savoir appel à une fonction qui passe un paramètre à la cmdlet New-Item. C'est pour cela que la redirection de l'erreur dans ta variable toto ne fonctionne pas.

Je t'encourrage donc vivement à utiliser les "commandelettes" natives de PowerShell. Les alias et fonctions ayant été fait dans le but de faciliter la transition CMD->PowerShell.

En espèrant avoir éclairé ta lanterne...

Arnaud
MVP PowerShell (depuis 2007)
Suivez moi sur Twitter !
  | | L'administrateur a désactivé l'accés public en écriture.
janel
Admin

Administrateur
Messages: 576
graphgraph
Karma: 31  
Re:Redirection des erreurs avec MD - 14/09/07 13:53 Pour compléter la réponse déjà très fouillée et très précise d'Arnaud, j'ajouterai que la commande...

Code:

 $toto md d:\toto 2>&1


... marche parce qu'ici le flux d'erreur est redirigé vers le flux standard, ce qui permet la récupération du résultat dans la variable $toto.

Au contraire, la commande simple...

Code:

 $toto md d:\toto


... émet un retour nul dans $toto (puisqu'aucun répertoire n'a pu être créé) et elle émet le message d'erreur sur son propre flux, à savoir la console par défaut.

Janel
  | | L'administrateur a désactivé l'accés public en écriture.
Zekicker
Utilisateur

PowerShelleur Débutant
Messages: 4
graphgraph
Karma: 0  
Re:Redirection des erreurs avec MD - 24/09/07 12:30 Merci beaucoup pour vos réponses.

Je pensais qu'en utilisant md, je me passerai de l'utilisation de new-item et que le comportement serait le même.

Au final, je vais utiliser

Code:

 new-item -type directory c:\toto



avec $?

Ps: désolé pour la réponse tardive, j'avais oublié mon post ...
  | | L'administrateur a désactivé l'accés public en écriture.
© 2020 PowerShell-Scripting.com