web/nec/moocs/powershell.org
2022-04-02 17:47:23 +02:00

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

Plus d'informations sur le formatage de string.

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