12 KiB
Powershell
Avant-propos
Sources : Mooc Powershell sur Skilleos
Les commandes n'ont pas pu être testées dans le cadre de ce Mooc.
Je m'appuie quelques fois sur le Bash pour expliquer comment marche une commande.
Introduction
Les commandes DOS marchent sous Powershell. Les commandes
Powershell sont appelées des cmdlets. Ces commandes peuvent
être système, utilisateur ou créées par l'utilisateur. Elles sont
insensibles à la casse, contrairement à Bash, et séparées par un
;
. Elles retournent et affichent leur résultats sous la forme
d'objets ou de tableaux.
Une commande Powershell se découpe en 2 parties :
verbe-nom
. Elles sont séparées par un -
. Il existe différents
verbes (liste non exhaustive) :
Verbe | Action générique |
---|---|
Get | récupérer |
Set | définir |
Start | exécuter |
Stop | arreter |
Out | sortir quelque chose |
New | créer quelque chose |
Exemple de commandes :
- Get-Help : affiche l'aide
- Get-ChildItem : affiche les objets enfants
- Clear-Host : nettoie la console (= clear en bash)
Il existe des alias pour certaines commandes, Clear-Host
= cls
par exemple. Pour pouvoir voir la liste des alias existants :
Get-Alias
.
Powershell dispose de son propre IDE. Il se lance avec la commande
ise
.
Opérateurs de comparaison
Nombres et String
On retrouve les mêmes opérateurs que Bash pour les comparaisons
mathématiques : -eq
, -ne
, -gt
, -lt
…
Opérateur | Type | Effet |
---|---|---|
-eq | int | == |
-ne | int | != |
-lt | int | < |
-le | int | <= |
-ge | int | >= |
-gt | int | > |
-eq | string | Vérifie si 2 strings sont égales, ne prend pas en compte la casse |
-ceq | string | Idem mais prend en compte la casse |
-like | string | Comparaison avec une regex |
Connecteurs logiques
Les opérateurs logiques sont tous simplement -and
et -or
.
TODO Pipeline
Elle s'utilise comme en Bash, avec |
entre les commandes.
ps basé sur le modèle objet
get-printer | get-member : montre les attributs et méthode de la classe printer
get-printer | select-object attribut,… : affiche uniquement les attributs dans la liste
$_ utilisable pour avoir l'objet courant dans une boucle get-printerdriver | where-object {$_ .Manufacturer -eq "HP"} pour avoir les drivers de chez HP
-filterscript
Sécurité
Il est possible d'avoir un filtre de sécurité pour interdire l'exécution de scripts téléchargés sur des sites non officiels.
On peut vérifier le niveau de la politique d'exécution avec
Get-ExecutionPolicy
. ELle peut être de plusieurs niveaux :
Politique | Effet |
---|---|
Unrestricted | On exécute tout |
Restricted | Bloque tout |
RemoteSigned | Demande la signature numérique de l'éditeur de script (par défaut) |
Bypass | aucune restriction |
Script
Les commentaires sur une ligne se font comme en Bash, avec un #.
Pour les blocs de commentaires, ils sont entourés par
<# commentaires #>
.
Variables
Les variables se déclarent et s'utilisent comme en Bash. Les espaces
peuvent cependant être mis lors de l'affectation de la variable :
$variable = 5
.
Il est possible de multiplier les strings, comme en Python, pour
pouvoir avoir X fois une string : "coucou " * 5
donne
"coucou coucou coucou coucou coucou".
Pour faire des retours à la ligne : `n
dans la string.
Pour déclarer des blocs de textes, il faut utiliser des here-strings.
$variable = @"
Bloc de texte
sur plusieurs lignes
"@
Typage
Il est possible de typer des variables lorsqu'on les déclare :
[type] $variable
On peut remplacer type
par string
ou int
.
Constante
La déclaration des constantes se fait avec une commande :
New-Variable
. Il faut lui préciser le nom ainsi que la valeur :
New-Variable -name variable -value 1 -option Constant
.
Il faut utiliser Remove-Variable
pour supprimer les constantes
créées.
Caste
Si la variable est typée, il est possible de la caster.
Pour caster en int : [convert]::ToInt32($variable, string, int)
Formatage de string
Pour pouvoir facilement formatter des strings, il existe
l'opérateur -F lors de la déclaration de la string :
"String 1 : {0} et une variable X : {1}" -F $val,$value
Comme en C, il est possible de préciser des formats de valeurs à
afficher comme de l'héxadécimal à partir du décimal ou un certain
nombres de chiffres après la virgule. Exemple
pour avoir 2 chiffres après la virgule :
"2 chiffres après la virgule: {0:n2}" -F 3.1419
Instructions
La structure du if est classique, on y utilise les opérateurs de comparaisons.
# le if et les else
if (variable -le val) {
# instructions
} elseif (variable -gt val ) {
# instructions
} else {
# instructions
}
# le switch
switch (value) {
{$_ -le val} {
# instructions;
break
} default {
# instructions
}
}
Tableaux
Un tableau se déclare avec comme une variable. Ses différents
éléments sont séparés par une virgule : $tableau =
"elem1","elem2"
. Pour initialiser un tableau vide, il faut lui
assigner @()
.
Un tableau est un objet et on peut récupérer par exemple sa taille
via l'attribut Count
: $tableau.Count
.
On accède à un élément comme un tableau en Python ou en Java :
$tableau[index]
et on modifie une valeur de la même manière :
$tableau[index] = val
. Une autre méthode pour sélectionner le
premier object consiste à passer par un pipe :
$tableau | Select-Object -First 1
.
Pour ajouter une valeur : $tableau += val
.
Il existe quelques fonctions dans l'objet des tableaux :
Fonction | Effet | Paramètre | Valeur de retour |
---|---|---|---|
clear | vide le tableau | ||
contains | vérifie si une valeur est présente dans le tableau | value | true si la valeur est présente, false sinon |
Pour pouvoir trouver un élément ressemblant à une regex ou à une
valeur : $tableau -like regex
. Il retourne l'élément
correspondant.
Exemple de boucle pour itérer sur tous les éléments d'un tableau :
for ($i = 0; $i -le ($tableau.Count - 1); $i = $i + 1) {
# instructions
}
foreach ($i in $tableau) {
# instructions
}
Fonctions
Si vous utilisez l'éditeur de Powershell, il faut enregistrer puis recharger le script pour pouvoir exécuter les fonctions.
Contrairement au Bash, il faut déclarer les attributs en début de
fonction. Il est aussi possible de rajouter des contraintes sur ces
paramètres (juste sur un champ de valeur, obligatoire…). Les
paramètres peuvent avoir des alias qui seront utilisés comme des
arguments. Par exemple, un paramètre avec l'alias nombre :
fonction -nombre 1
.
Il est possible de rajouter certaines fonctionnalités aux
fonctions. [cmdletbinding()]
va permettre l'ajout d'options
automatiques liés aux cmdlet, comme l'option -Verbose
qui permet
d'afficher les commentaires lors de l'exécution de la fonction. Ça
appelle automatiquement la méthode Write-Verbose
.
Comme dans AWK, on peut préciser des blocs d'instructions qui seront exécutés tout le temps en début et fin de fonction. Ils sont cependant optionnels et il est possible d'écrire une fonction sans aucun bloc spécial.
Nom du bloc | Exécution |
---|---|
BEGIN | Au début de la fonction |
END | À la fin de la fonction |
PROCESS | Corp de la fonction |
Une fonction avec des arguments non obligatoires, qui est appelée sans, va utiliser des valeurs vides à la place.
function foo {
[cmdletbinding()]
param (
[parameter (mandatory=$true)] # le paramètre est obligatoir
[string]$var,
[validaterange (0, 10)] # le paramètre doit être compris entre 0 et 10
[alias ("nombre")] # et a pour alias nombre
[int]$val,
[int]$bar # paramètre classique
)
BEGIN {
# instructions
}
PROCESS {
# instructions
}
END {
# instructions
}
}
Liste de commandes
Il s'agit juste de montrer leur utilité, pas les arguments. Je vous conseille de vérifier en premier comme la commande s'utilise avant de l'exécuter.
Commande | Fonctionnalité | Paramètres possibles |
---|---|---|
Get-Help | Affiche l'aide | |
Get-Service | Liste des services | |
Get-Command | Liste de toutes les commandes | Regex pour filtrer les commandes |
Get-Alias | Liste de tous les alias | alias pour n'avoir les informations que sur celui-ci (et Regex) |
New-Alias | Créer un nouveau alias | |
Get-ChildItem | Affiche les objets enfants | |
Clear-Host | Clear en Bash | |
Write-Output | Echo en Bash | |
Write-Host | Idem | -foregroung pour changer la couleur du texte |
Out-File | Ecrit dans un fichier |