PowerShell : bases (échapement, commentaires, boucles...)

Source: http://my-powershell.fr/aide-memoire-powershell
PS v3

Séquences d’échappement : `

accent grave (`)

Méthodes de traitement d’objets

Pour traiter objects, par ex:

scinder un chaine de caractère: position du 1er "l"
Traiter des objects, par ex:
PS > $file = "fichier.txt"
PS> $file.split(".")[-1]
txt
PS> ("Hello").IndexOf("l")
2
2
   => compte à partir de 0

Autre ex de la méthode Split de la classe String: (source:  http://www.ehow.com/how_7719350_split-string-two-variables-powershell.html)

$text = "Windows PowerShell - Hello world!"
$split = $text.split("-")

echo $split[0]                                                      affiche Windows PowerShell
echo $split[1]                                                      affiche  Hello world!  (commence par un espace)
 
Note:  "Str"|Get-Member donne méthodes
 
fonction ex
Méthodes pour le traitement d’objets (fonction et ex)
CompareTo() PS > ("Hello").CompareTo("Hello")
0
PS > ("Hello").CompareTo("Hi")
-1
PS> ("Hello").CompareTo("Helllo")
1
PS>
Contains()
true si sous chaine ds chaine ou si sous chaine vide
PS > ("Hello").Contains("ll")
True
PS > ("Hello").Contains("10")
False
PS >  ("Hello").Contains("")
True
CopyTo()
cp partie d'une chaine dans une autre
PS > ("User!").CopyTo(0, , 6, 5)
-> erreur
EndsWith() PS > ("Hello").EndsWith("lo")
True
PS > ("Hello").EndsWith("ko")
False
...  

Chaines: guillemets simple (pas de calcul ni réso var) ou double (calcule et résout nom var)

$resultat  = 'Le resultat est : $(5+3)'
$resultat
Le resultat est : $(5+3)
$resultat  = "Le resultat est : $(5+3)"
$resultat
Le resultat est : 8

"Résout" ou 'non' les var.

Switch

$lang représente la valeur actuelle évaluée. Si un tableau est utilisé dans switch, chaque élément du tableau est testé. Erreur script dès la 1ere ligne

Boucles (Foreach-Object)

Source: http://powershell.com/cs/blogs/ebookv2/archive/2011/12/12/chapter-1-the-...

cmdlet Foreach-Object ou de son alias Foreach :

$valeurs = 1,2,3,4,5
Foreach($valeur in $valeurs){ "Le chiffre est $valeur"}

(1..10) | Foreach {"Le chiffre est $_"}

Entrées multilignes (>>) et commentaires (#)

Si oubli par ex d'un ", PS donne l'occasion de compléter. On voit >> faire deux fois entrée et PS lance la commande. CTRL+C annule la commande en cours (quand on voit >>). Ex:

PS > 2+
>> 6
>>
8

On peux donc écrire sur plusieurs lignes: "Ceci est une phrase (Enter)
>> vraiement très longue, sur plusieurs (Enter)
>> lignes.
"

Ce prompt >> (ajouté par ps) travaille en regardant  les caractères en début et fin des strings, comme [] et '. S'il en manque (oubli du 2e ]) alors le prompt >> continue de s'afficher. Si le dernière caractère d'une ligne est un back-tick, la ligne continuera - mais en pressant ` on la récupère.

Calculer et parenthèses

(Dir $env:windir\*.exe).Count (Enter)
12

@()  calcule et retourne un tableau
Si le dossier windows était vide ou avec 1 seul fichier alors (Dir $env:windir\*.exe).Count (Enter) ne renvoie pas le nb d'items.
Alors que @(Dir $env:windir\*.exe -ErrorAction SilentlyContinue).Count (Enter)  calcule toujours

$() est à utiliser à l'intérieur de strings pour insérer dans du texte le résultat de lignes de code.
"Number of EXE files in my windows folder: `
$(@(Dir $env:windir\*.exe -ErrorAction SilentlyContinue).Count)"(Enter)

Séparateur décimal : le point

Utiliser la virgule donne un autre résultat, car crée un tableau (dans l'ex le tableau a 2 éléments: 4 et 3).

4,3 + 2 (Enter)
4
3
2
tableau + 2 : crée un tableau à 3 valeurs

Calcul, unités de calcul, type de nombres

PS reconnait: KB, MB, GB, TB et petabyte (PT) ssi pas d'espace entre nombre et MB (mais peuvent etre en minuscules). Ex "combien de cv un dvd peut-il comporter?" 4GB / 720MB (Enter)  affiche 5.68888...

Préfixer les nombre en hexadécimal par 0x => 12 + 0xAF (Enter) affiche 187
vers une table d'équivalence nombres décimaux, hexadécimaux (et binaire) http://www.purebasic.com/french/documentation/reference/number_tab.html

Lancer des commandes externes

Saisir ipconfig ou notepad. Un commande comme ipconfig est de type texte, cad exe de facon syncrone (et la console attend que le commande soit terminée + on peux l'annuler avec CTRL+C), alors que notepad (ou autre appli) est asyncrone.

Avec ma cmdlet Start-Process on peux lancer une appli externe avec des options (autre login, ...), gérer la taille de la fenetre, demander que ps attende l'appli Windows.

Passer du dos à ps, du ps à dos : ise, powershell, cmd et exit + role du  & "string"

C:\ > powershell   -> de cmd à ps

PS > cmd
C:\Windows\system32>exit
PS C:\Windows\system32>

PowerShell traite les données entre " comme des strings et les affiche de suite. Préfixé par & on s'assure que PS exe le texte:
& "C:\programs\Windows NT\accessories\wordpad.exe"

Cd "C:\programs\Windows NT\accessories" ; wordpad.exe    affiche une erreur, car PS a besoin d'un chemin absolu ou relatif => il faut lancer avec  .\wordpad.exe

Pour ouvrir avec ISE un script créé: Ise $env:temp\test.ps1

Path

$env:Path  affiche la configuration des var d'env.

Ajout du dossier "myscripts" :   $env:path += ";C:\chemin-vers-rep\myscripts"  ne sera valable que dans cette session PS.

cmdlets, trouver et utiliser les paramètres

Get-Command -commandType cmdlet
Get-Command -verb get

Get-Help Get-Command -detailed
Get-Command *service* -CommandType cmdlet

Par ex, Get-ChildItem affiche le contenu du dossier courant. Voir les paramètres que peux prendre Get-ChildItem (et avec ex): Get-Help Get-ChildItem -Full

section "Parameters" d'un ou tous paramètres: Get-Help Get-ChildItem -Parameter *   -> voir en PJ  param.txt qui contient l'aide de : Exclude <string[]>, Filter <string[]>, Force <string[]>, Include <string[]>, LiteralPath <string[]>, Name <string[]>...

Utiliser des paramètres nommés

Les paramètres nommés fonctionnent comme une association clé/valeur. Le nom du paramètre nommé (qui doit commencer par trait d'union - hyphen en anglais) suivi d'un espace et la valeur.

Voir tous les fichiers .exe du dossier windows et de ses sous-dossiers: Get-ChildItem -path c:\windows -filter *.exe -recurse -name

On n'est pas obligé de tapper tous les caractères. Seuls quelques carcatères (qui permettent à ps de reconnaitre le param) suffisent: Get-ChildItem -pa c:\windows -fi *.exe -r -n
S'il n'y a pas assez de caractères pour que ps trouve la paramètre à coup sur, il affiche un message "the parameter name 'f' is ambiguous. Possible matches include: -Filter -Force."

Couper la reconnaissance des paramètres avec -- peux etre utile parfois

Ex: Write-Host -BackgroundColor
Write-Host : Missing an argument for parameter 'BackgroundColor'. Specify a parameter of type "System.consoleColor" and try again.

Bien sur, on peux utiliser Write-Host "-BackgroundColor"  mais on peux aussi faire:  Write-Host --BackgroundColor

Utiliser des paramètres switch (<SwitchParameter> dans l'aide)

Si le paramètre est du type oui/non : s'il est spécifié, il active une fonctionnalité, mais s'il est oublié alors la fonctionnalité n'est pas activée.
Par ex: -recursive dans l'ex "Get-ChildItem" précédent permet de parcourir les sous-rep (et non le rep indiqué via -path). -name est aussi un paramètre de type switch, qui sort juste les noms des fichiers sous forme de chaine de car (et non leur contenu et objets dossiers).

L'aide sur Get-ChildItem l'indique en ajoutant après le nom du paramètre <SwitchParameter>

Paramètres par postion

Pour certains paramètres fréquents, ps leur assigne une position, ce qui permet d'oublier de spécifier le nom du param et de tapper directement la valeur. PS lit la commande et ses paramètres, commence par identifier les paramètres nommés, et pour les autres paramètres (non-explicitement nommés), il utilise leur position.
Ex: Get-ChildItem c:\windows *.exe
En regardant le .txt joint on voit que le paramètre -path a la position 1 et est optionnelle, par défaut = dossier courant. -filter a la position position 2 donc est correctement interprété.

C'est utile et pratique, mais peu lisible. Mieux vaut nommer dans les scripts les paramètres, ne pas utiliser d'alias ou de nom abrégé des paramètres.

<CommonParameters>

se comportent de la meme facon, et qui existent pour un grand nombre (presque tous) de cmdlets.

De type "switch": -Verbose  et  -Debug  et de type "Valeur":  -ErrorAction, -ErrorVariable et -OutVariable()

Fonctions PS et tableau $args

Les alias ne peuvent pas utiliser d'arguments. On va créer une fonction qui simplifie un ping:   

# je fais tous les jours ce  Ping -n 1 -w 100 10.10.10.10
function quickping { ping -n 1 -w 100 $args }
Set-Alias qp quickping
# utiliser avec un simple  qp 10.10.10.10

Rappel: -w augmente ici le time-out

$args est un tableau (on pourra y passer des tas d'arguments, en nbre variable, et sans revenir modifier le script).

Utilisation de fichiers et de scripts

Il faut utiliser nom relatif ou absolu. Créer un ping.bat avec un echo, un pause et affichage d'infos sensibles (dir windows). En lancant simplement ping (sans ip) ps affiche l'aide de ping => pour lancer le script: ajouter .\ping
Alors qu'en dos : cmd puis ping 10.10.10.10   lance le .bat

DOS (je veux dire l'invite de commande classique: cmd) ne distingue pas les fichiers des commandes et cherche d'abord dans le dossier courant (et lance la commande).
PS dans ce cas est plus sécurisé : meme si un hacker a créé un ping.bat dans votre dossier courant, lancer un simple ping 192.168.1.1 ne pourra pas lancer son ping.bat.

Appel .vbs

Dans un fichier ex.vbs saisir :

result = InputBox("Enter your name")
WScript.Echo result

Le lancer:  Cscript.exe c:\samples\ex.vbs (Enter)
Une fenetre apparait, et l'entrée s'affiche (et est dc disponible) aussi dans PS.

On peux aussi récupérer dans une var PS le résultat d'un script vbs:    $name = cscript.exe c:\samples\test.vbs

Doc tek: 
Fichier attachéTaille
Plain text icon param.txt10.92 Ko