Question Redirection des erreurs avec MD

Plus d'informations
il y a 17 ans 3 semaines #941 par Olivier
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:1]dir d:\toto -errorvariable toto 2> $null[/code:1]
$toto contient l'erreur générée par dir

[code:1]md d:\toto -errorvariable toto 2> $null[/code:1]
$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:1]$toto = md d:\toto 2>&1[/code:1]

Quelqu'un pourrait-il m'éclairer.

Merci<br><br>Message édité par: Zekicker, à: 14/09/07 11:21

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 semaines #942 par Arnaud Petitjean
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&gt;$null ou 2&gt;&amp;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 \&quot;Continue\&quot; par défaut. Si tu la passes à \&quot;SilentlyContinue\&quot; 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 \&quot;VRAI\&quot; si une commande s'est bien exécutée et \&quot;Faux\&quot; dans le cas contraire. C'est donc la variable qu'il te faut !

Exemple:
[code:1]
$ErrorActionPreference=\&quot;SilentlyContinue\&quot;
Get-ChildItem d:\toto
if ($?) {
Write-Host \&quot;OK\&quot; }
else{
Write-Host \&quot;Une erreur s'est produite\&quot;
}
$ErrorActionPreference=\&quot;Continue\&quot;
[/code:1]

Sinon tu peux aussi sans toucher à la variable globale $ErrorActionPreference utiliser les \&quot;common parameters\&quot; en faisant :

[code:1]
Get-ChildItem d:\toto -ErrorAction SilentlyContinue
if ($?) {
Write-Host \&quot;OK\&quot; }
else{
Write-Host \&quot;Une erreur s'est produite\&quot;
}[/code:1]

Sinon pour ton second problème \&quot;md ...\&quot; 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 \&quot;commandelettes\&quot; natives de PowerShell. Les alias et fonctions ayant été fait dans le but de faciliter la transition CMD-&gt;PowerShell.

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

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 semaines #943 par Jacques Barathon
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:1]$toto = md d:\toto 2&gt;&amp;1[/code: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:1]$toto = md d:\toto[/code:1]
... é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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 2 semaines #984 par Olivier
Réponse de Olivier sur le sujet Re:Redirection des erreurs avec MD
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:1]new-item -type directory c:\toto[/code:1]

avec $?

Ps: désolé pour la réponse tardive, j'avais oublié mon post ...:blush:

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.106 secondes
Propulsé par Kunena