Cet article rassemble quelques rappels concernant Powershell pour se remettre en mémoire les instructions principales de ce langage. D’autres fonctionnalités sont détaillées davantage dans Powershell en 10 min.
Quelques remarques en préambule:
- Powershell n’est pas sensible à la casse
- Pour commenter du code, il faut utiliser le caractère
#
# Code Powershell commenté
Variables
Généralement le type n’est pas indiqué explicitement mais le type est déterminé par le type de la valeur d’initialisation:
$var=65
$var2="class string"
On peut forcer un typage particulier de cette façon:
[string]$var = 65 # $var est une chaîne de caractères
Raccourcis pour indiquer explicitement le type
D’autres types peuvent être indiqués de cette façon:
Raccourci | Type de données |
---|---|
[datetime] |
Date ou heure |
[string] |
Chaîne de caractères |
[char] |
Un seul caractère |
[double] |
Nombre flottant double précision |
[single] |
Nombre flottant simple précision |
[int] |
Entier 32 bits |
[Boolean] |
Valeur True ou False (Vrai ou Faux) |
Typage avec des types .NET
On peut indiquer un typage .NET avec une syntaxe de ce type:
[System.Int32]$var = 5
Utilisation des variables
Quelques exemples d’utilisation de variables:
$var="powershell"
Write-Host "classic $var string" # $var est remplacé par sa valeur
# à cause des double quotes " "
$var2='classic $a string' # $var2 n'est pas interprété car
# on utilise de simples quotes ' '
Write-Host $var2
On peut aussi utiliser le caractère accent grave ([AltGr] + [7]):
$var2="classic `$a string"
Write-Host $var2
“Cmdlets” principales
Affiche de l’aide
D’une façon générale, pour avoir de l’aide concernant une cmdlet (i.e. command let):
Get-Help <nom de la commande>
Quelques “cmdlets”
Cmdlet | Raccourcis | Explications | Exemples |
---|---|---|---|
Get-Location |
pwd |
Permet d’avoir le répertoire courant | Get-Location |
Set-Location |
cd |
Permet de changer le répertoire courant | Set-Location "C:\Directory" |
Copy-Item |
copy |
Copie un élément | Copy-Item "C:\Directory\file.txt" -Destination "C:\OtherDirectory" |
Move-Item |
move |
Déplace et/ou renomme un élément | Move-Item -Path C:\Directory\file.txt -Destination C:\OtherDirectory\otherFile.txt |
Remove-Item |
del |
Supprime des éléments | Remove-Item -Path C:\Directory\file.txt |
Rename-Item |
rni |
Renomme un élément | Rename-Item -Path "C:\Directory\file.txt" -NewName "new_file.txt" |
New-Item |
Permet de créer un nouvel élément | New-Item -Path "C:\Directory" -Name "NewDirectory" -ItemType "directory" New-Item -ItemType "file" -Path "C:\Directory\NewDirectory\file.txt" |
|
Get-ChildItem |
dir |
Permet d’afficher le contenu d’élément enfant à l’intérieur d’un élément (par exemple les fichiers d’un répertoire) | Get-ChildItem |
Write-Host |
Permet d’afficher une erreur sur la console | Write-Error "Une erreur est survenue." |
|
Clear-Host |
cls |
Permet d’effacer le contenu de la console | Clear-Host |
Get-History |
h |
Affiche l’historique de la console | Get-History |
Get-Content |
cat |
Affiche le contenu d’un fichier | Get-Content -Path "C:\Directory\file.txt" |
Set-Content |
sc |
Ecrit ou remplace le contenu d’un fichier avec un nouveau contenu | Set-Content -Path "C:\Directory\file.txt" -Value "Nouveau contenu" |
Add-Content |
Permet d’ajouter un contenu à un fichier | Add-Content -Path "C:\Directory\file*.txt" -Exclude "Log*" -Value "Nouvelle valeur" |
Utilisation de “cmdlets” avec un “pipe”
Le pipe permet d’exécuter des instructions successivement, par exemple:
Get-ChildItem | Where-Object { $_.Length -gt 100kb } # Affiche les fichiers de plus de 100kb
Effectuer un traitement sur chacun des éléments listés:
Get-Process | ForEach-Object {$_.ProcessName}
Pour écrire les résultats dans un fichier:
Get-Process | Out-File -filepath C:\Directory\process.txt
PowerShell Module Browser
Microsoft a mis en place un browser capable d’afficher de l’aide sur toutes les commandes Powershell suivant la version: PowerShell Module Browser.
Pour vérifier la version de Powershell, il faut taper:
$PSVersionTable.PSVersion
Instructions
if…then…else
$var = 2
if ($var -eq 1)
{
Write-Host "OK"
}
else
{
Write-Host "KO"
}
On peut aussi écrire l’instruction en ligne:
$var = 2; if ($var -eq 1) { Write-Host "OK" } else { Write-Host "KO" };
Opérateurs de comparaison
Opérateur | Signification | Commentaires |
---|---|---|
-eq |
Comparateur d’égalité | |
-ne |
“not equal to” | La valeur est True si les opérandes ne sont pas égales |
-ge |
“greater than or equal” | La valeur est True si l’opérande de gauche est supérieure ou égale à l’opérande de droite |
-gt |
“greater than” | La valeur est True si l’opérande de gauche est strictement supérieure à l’opérande de droite |
-le |
“less than or equal” | La valeur est True si l’opérande de gauche est inférieure ou égale à l’opérande de droite |
-lt |
“less than” | La valeur est True si l’opérande de gauche est strictement inférieure à l’opérande de droite |
-like et -notlike |
Permet d’effectuer des comparaisons d’égalité de chaines de caractères en utilisant des wildcards:
Par exemple: |
|
-match et -notmatch |
Permet de vérifier si une chaine de caractères respecte une expression régulière. Par exemple: $string -match "\w" |
|
-contains et -notcontains |
Permet de tester si une valeur se trouve dans une liste. Par exemple: $names = "val1", "val2", "val3" $names -Contains "val2" |
|
-is et -isnot |
Permet de tester le type d’une variable .NET (même opérateur qu’en C#). Par exemple: $stringToTest = "chaine de caracteres" ($stringToTest -is [System.String]) |
Variables automatiques
Les variables les plus importantes:
Variable | Signification |
---|---|
$FALSE |
Faux |
$TRUE |
Vrai |
$NULL |
Valeur nulle |
$PWD |
Chemin du répertoire courant |
Il existe d’autres variables automatiques: About Automatic Variables.
Boucle “foreach”
Par exemple:
$array = 1, 2, 3, 4
foreach ($item in $array)
{
"`$item = $item"
}
Autre exemple:
foreach ($file in Get-ChildItem)
{
break # Permet d'arrêter l'exécution de la boucle.
# On peut aussi utiliser continue comme en C#
}
Try…Catch…Finally
On peut utiliser un bloc try...catch...finally
comme en C#:
Try
{
$arg= 3/0
}
Catch
{
Write-Host "Une erreur est survenue"
}
En spécialisant l’erreur pour un type précis d’exception:
Try
{
$arg= 3/0
}
Catch [System.DivideByZeroException]
{
Write-Host "Division par 0"
}
Catch
{
Write-Host "Une erreur est survenue"
}
Une autre syntaxe est possible en utilisant le mot clé: trap
.
Fonctions
Une fonction se définit avec le mot-clé function
:
function NomFonction()
{
Write-Host "Executed"
}
Avec des paramètres, on peut utiliser cette syntaxe:
function ExecuteMe
{
param( $parameter1, $parameter2 )
Write-Host "Executed with parameter: $parameter1 $parameter2"
}
Pour lancer l’exécution avec la syntaxe précédente:
ExecuteMe -parameter1 "Value1" -parameter2 "Value2"
Ou une autre syntaxe est possible:
function ExecuteMe( $parameter1, $parameter2)
{
Write-Host "Executed with parameter: $parameter1 $parameter2"
}
Pour lancer l’exécution, il ne faut pas utiliser de parenthèses:
ExecuteMe "Value1" "Value2"
Return
Pour retourner une valeur dans une fonction:
function ReturnValue( [int]$parameter1, [int]$parameter2)
{
return $parameter1 + $parameter2
}
Pour lancer l’exécution:
$returnedValue = ReturnValue 2 3
Lancer l’exécution d’instructions
A partir d’une ligne de commandes classique
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass
-NoLogo –NoProfile -Command "& '<Fichier PS1 ou commandes Powershell>'"
En 32 bits, il faut utiliser le chemin: %windir%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
.
Pour exécuter un fichier:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass
–NoLogo –NoProfile -File "<Chemin du fichier PS1>"
A partir d’une console Powershell
D’autres syntaxes sont utilisables à partir de la console Powershell:
."\\c$\Directory\file.ps1"
&"\\c$\Directory\file.ps1"
Pour exécuter directement des instructions (utilisation de script-blocks):
& { <Instructions Powershell> }
Passage d’arguments à un script Powershell
On peut passer des arguments à un script Powershell en déclarant dans le fichier du script:
param([Int32]$parameter1=1, [Int32]$parameter2=3) # Doit être à la 1ère ligne du script
Write-Host $parameter1
Write-Host $parameter2
Le lancement du script se fait de cette façon:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass
–NoLogo –NoProfile -File "<Chemin du fichier PS1>" -parameter1 3 –parameter2 6
On peut utiliser une syntaxe plus simple sans nommer les arguments:
$parameter1=$args[0]
$parameter2=$args[1]
Write-Host $parameter1
Write-Host $parameter2
Pour lancer l’exécution:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass
–NoLogo –NoProfile -File "<Chemin du fichier PS1>" 3 6
- About Automatic Variables: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1
- PowerShell Basic Cheat Sheet: http://ramblingcookiemonster.github.io/images/Cheat-Sheets/powershell-basic-cheat-sheet2.pdf
- Stackoverflow.com: How to run a PowerShell script from a batch file: https://stackoverflow.com/questions/19335004/how-to-run-a-powershell-script-from-a-batch-file
- Stackoverflow.com: How to run a PowerShell script?: https://stackoverflow.com/questions/2035193/how-to-run-a-powershell-script/2035209
- PowerShell Tutorial – Try Catch Finally and error handling in PowerShell: https://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell
- Introduction à PowerShell: https://www.it-connect.fr/introduction-a-powershell%EF%BB%BF/
- Stackoverflow.com: How to pass an argument to a PowerShell script?: https://stackoverflow.com/questions/5592531/how-to-pass-an-argument-to-a-powershell-script
Quelques liens intéressants:
Plusieurs méthodes pour lancer un exécutable dans du powershell:
https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
Escape characters:
https://ss64.com/ps/syntax-esc.html