demande de rappel immédiat

Powershell : Passage d'arguments à un script depuis la ligne de commande

Posted by Jean-Paul Blanc Monday, January 18, 2010 11:47:00 AM
Rate this Content 0 Votes

 

 

Pour des raisons de sécurité les fichiers d'exention .PS1 ne sont pas soumis par défaut à l'interpréteur de commande qu'est Powershell. Conséquence j'ai été confronté aux difficultées de passage d'argument à un script PS1 depuis une ligne de commande CMD.EXE illustrés par les trois cas de test du petit script suivant.

Ce script prend deux paramètres : un nom de fichier et une chaine de caractère et ajoute la chaine au fichier :

param ([string]$fic, [string]$chaine)

Add-Content$fic$chaine

 Voici trois cas de test qui révèlent des comportements explicables, mais qui posent néanmoins des problèmes :

C:\silogix>powershell -command .\testparam.ps1 fic.txt Ajout1_dans_fic1.txt
C:\silogix>type fic.txt
Ajout1_dans_fic1.txt
C:\silogix>powershell -command .\testparam.ps1 fic.txt "Ajout2 dans fic1.txt"
C:\silogix>type fic.txt
Ajout1_dans_fic1.txt
Ajout2
C:\silogix>powershell -command .\testparam.ps1 fic.txt Ajout3_été_interdit
C:\silogix>type fic.txt
Ajout1_dans_fic1.txt
Ajout2
Ajout3_ÚtÚ_interdit

 

  1. Dans le premier appel, tout ce passe bien, on constate d'une part que le fichier fic.txt est bien créé et d'autre part qu'il contient la bonne chaîne "Ajout1_dans_fic1.txt".
  2.  Dans le second appel le second paramètre est une chaine contenant des espaces les doubles cotes " permettent d'agréger les trois mots en un paramètre pour l'interpréteur de commande CMD.EXE, mais c'est à nouveau trois mots qui sont passés à l'interpréteur Powershell qui voit donc quatre paramètres. Ce qui explique l'ajout de la simple chaine "Ajout2". Powershell V2 apporte une solution avec une nouvelle option -file.

    C:\silogix>powershell -file .\testparam.ps1 fic.txt "Ajout2 dans fic1.txt"
    C:\silogix>type fic.txt
    Ajout1_dans_fic1.txt
    Ajout2
    Ajout3_ÚtÚ_interdit
    Ajout2 dans fic1.txt
  3. Dans le troisème appel, c'est bien un seul mot mais il comporte des caractères accentués. La commande "type" affiche le contenu du fichier fic.txt les acaractères accentués semble corrompus. Cependant si j'édite le fichier avec notepad.exe je me rend compte que les caractères OEM ont transformés en caractères ANSI


    Ceci peut être pratique car si on rejoue les mêmes commandes sous l'interpréteur Powershell le résultat est cohérent :
    PS C:\silogix> type .\fic.txt
    Ajout1_dans_fic1.txt
    Ajout2
    Ajout3_été_interdit
    Ajout2 dans fic1.txt
    PS C:\silogix> Get-Content .\fic.txt | where {$_ -match "été"}
    Ajout3_été_interdit
    PS C:\silogix>



    Maintenant on peut vouloir aussi insérer de l'OEM dans le fichier, mais il faut alors changer le script comme suit :

    param ([string]$fic, [string]$chaine)
    Out-File$fic-EncodingOEM-InputObject$chaine-Append

    Ce qui entaine le comportement suivant :

    C:\silogix>powershell -file .\testparam.ps1 fic.txt "Ajout4 l'été arrive"
    C:\silogix>type fic.txt
    Ajout4 l'été arrive

     

 

     
Comments are closed on this post.