Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
sysadmin:windows:cli:introduction_a_powershell [2023/06/21 19:04] – supprimée - modification externe (Date inconnue) 127.0.0.1 | sysadmin:windows:cli:introduction_a_powershell [2024/03/13 13:17] (Version actuelle) – Ajout référence yoann | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | : | ||
+ | |||
+ | ====== PowerShell ====== | ||
+ | |||
+ | **PowerShell** est une solution d’automatisation, | ||
+ | * Le shell ou interpréteur en ligne de commande ; | ||
+ | * Le langage de script ; | ||
+ | * Un framework de gestion de la configuration désigné **DSC**((**D**esired **S**tate **C**onfiguration)). | ||
+ | |||
+ | Conçu initialement pour automatiser les tâches d' | ||
+ | |||
+ | Powershell possède des fonctionnalités communes à la plupart des shells : | ||
+ | * Historique de ligne de commande ; | ||
+ | * Autocomplétion : saisie semi-automatique via la touche Tab et prédiction ; | ||
+ | * **Système d'aide intégrée**; | ||
+ | * **Système de pipeline** permettant le chaînage des commandes; | ||
+ | * Prise en charge des**alias** ou noms alternatifs pour les commandes et les paramètres rendant les appels aux traitements similaires à d' | ||
+ | |||
+ | Powershell a cependant quelques spécificités : | ||
+ | * Il opère sur des objets .NET encapsulant le texte. Les commandes manipulent des objets. Cela évite beaucoup de traitements et d' | ||
+ | * Les commandes partagent un runtime commun et son désignée commandlets ou applets. Ce parti pris de conception permet d' | ||
+ | * Il existe de nombreux types de commandes : natif, cmdlet, fonction, script, alias. | ||
+ | |||
+ | Pour interagir avec PowerShell, on utilise une application qui héberge le moteur de PowerShell comme : | ||
+ | * La console PowerShell ; | ||
+ | * L' environnement d’écriture de scripts intégré **ISE**((PowerShell **I**ntegrated **S**cript **E**nvironment)). | ||
+ | |||
+ | |||
+ | ===== Commentaires ===== | ||
+ | |||
+ | Les commentaires sont introduits par le caractère < | ||
+ | |||
+ | < | ||
+ | # Ceci est un commentaire | ||
+ | </ | ||
+ | |||
+ | Les commentaires permettent d' | ||
+ | |||
+ | ===== Généralités sur les commandes ===== | ||
+ | |||
+ | Une applet est une commande compilée. Le nom de l' | ||
+ | |||
+ | <code powershell> | ||
+ | Get-Verb | ||
+ | </ | ||
+ | |||
+ | Trois commandes permettent d' | ||
+ | * **Get-Command** : lister/ | ||
+ | * **Get-Help** : appelle l'aide intégrée d'une commande (alias help); | ||
+ | * **Get-Member** : détaille les attributs d'un objet. | ||
+ | |||
+ | <code powershell> | ||
+ | # Affiche l'aide générale Powershell | ||
+ | Help | ||
+ | |||
+ | # L' alias Help permet d' obtenir l'aide paginée de la commande Get-Random | ||
+ | Help Get-Random | ||
+ | |||
+ | # En général les commandes bénéficient d'une aide plus détaillée en ligne | ||
+ | Get-Help Get-Random -Online | ||
+ | |||
+ | |||
+ | # Rechercher les commandes ayant pour verbe get et " | ||
+ | Get-Command -Verb Get -Noun *network* | ||
+ | </ | ||
+ | |||
+ | ==== Appel d'une cmdlet ==== | ||
+ | |||
+ | On peut invoquer une cmdlet via son nom, un alias ou son nom pleinement qualifié : | ||
+ | <code powershell> | ||
+ | # Exécution de la cmdlet via son nom usuel | ||
+ | Get-Childtem | ||
+ | |||
+ | # Exécution de la même cmdlet via un de ses alias | ||
+ | ls | ||
+ | |||
+ | # Exécution de la cmdlet via son nom pleinement qualifié (module\cmdlet) | ||
+ | Microsoft.PowerShell.Management\Get-ChildItem | ||
+ | </ | ||
+ | |||
+ | ==== Paramètres ==== | ||
+ | |||
+ | Des paramètres peuvent être spécifiés lors de l' | ||
+ | * Le nom du paramètre commence par un tiret < | ||
+ | * La valeur du paramètre est placée après le nom, elle est séparée par un espace ; | ||
+ | * Si la valeur contient des espace elle doit être placée entre guillemets ; | ||
+ | * Si le paramètre accepte plusieurs valeurs elles sont séparées par des virgules < | ||
+ | |||
+ | <code powershell> | ||
+ | # Exemple d' | ||
+ | Verbe-Substantif -Param1 " | ||
+ | </ | ||
+ | |||
+ | === Les commutateurs === | ||
+ | |||
+ | Le commutateur (Switch) est un cas particulier de variable booléenne : sa valeur est définie à $True uniquement si le commutateur est inclus lors de l’exécution de la commande. | ||
+ | |||
+ | ===== Aide ===== | ||
+ | |||
+ | Les fichiers d'aide peuvent être mis à jour, ils sont alors téléchargés. Si Powershell est lancé depuis un système Mac ou Linux il faut préciser | ||
+ | |||
+ | <code bash> | ||
+ | # Préciser les locales pour Linux/MacOS | ||
+ | Update-Help -UICulture fr-FR -Verbose | ||
+ | |||
+ | # Sur un système Windows, les locales sont définies | ||
+ | Update-Help | ||
+ | </ | ||
+ | |||
+ | L'aide est standardisées, | ||
+ | ^ NAME | Mnémonique de la commande. | ||
+ | ^ SYNTAX | ||
+ | ^ ALIASES | ||
+ | ^ REMARKS | ||
+ | ^ PARAMETERS | détail des paramètres : types, description, | ||
+ | |||
+ | <code powershell> | ||
+ | |||
+ | # Inclus la section paramètres à la réponse standard | ||
+ | Help File-Hash -Detailed | ||
+ | |||
+ | # Affiche l' aide complète | ||
+ | Help File-Hash -Full | ||
+ | |||
+ | # Seulement des exemples | ||
+ | Help File-Hash -Examples | ||
+ | |||
+ | # Informations sur un paramètre désigné | ||
+ | Help Get-FileHash -Parameter Algorithm | ||
+ | |||
+ | </ | ||
+ | |||
+ | Des pages d'aide génériques sont également disponibles : | ||
+ | |||
+ | <code powershell> | ||
+ | Get-Help about* | ||
+ | |||
+ | # Equivalent | ||
+ | Get-Help -Category HelpFile | ||
+ | </ | ||
+ | |||
+ | ===== Version ===== | ||
+ | |||
+ | Il existe deux principales plateformes pour PowerShell : | ||
+ | * **Windows PowerShell** fournit avec l'OS et bénéficiant des mêmes licence, contrat de support et cycle de vie que l'OS. Les versions de PowerShell jusqu' | ||
+ | * **PowerShell** (initalement désigné PowerShell Core) fourni, installé et configuré séparément de Windows offrant une prise en charge multiplateformes (Windows, macOS et GNU/Linux) : binaire pwsh.exe. | ||
+ | |||
+ | Ces versions peuvent coexister sur un même système Windows. | ||
+ | |||
+ | La variable **$PSVersionTable** stocke les informations de version de Powershell | ||
+ | |||
+ | < | ||
+ | $PSVersionTable | ||
+ | |||
+ | # On peut accéder à la valeur d' un attribut de l' | ||
+ | $PSVersionTable.PSVersion | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Introspection des objets ===== | ||
+ | |||
+ | Les commandes retournent des objets. La réponse fournie par la commande est une mis en forme par défaut ne présentant pas forcément l' | ||
+ | |||
+ | On utilise Get-Member à la suite d'une commande pour obtenir les informations sur les objets retournés: | ||
+ | |||
+ | <code powershell> | ||
+ | # Affiche attributs et méthodes de l' objet retourné par la commande Get-Process | ||
+ | Get-Process -Name " | ||
+ | |||
+ | # Afficher les attributs de l' | ||
+ | Get-Process -Name " | ||
+ | |||
+ | # Affiche les méthodes de l' | ||
+ | Get-Process -Name " | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | En entête de la réponse, **Get-Member** indique le **type de l' | ||
+ | |||
+ | <code powershell> | ||
+ | # Lister les commandes manipulant des objets System.Diagnostics.Process | ||
+ | Get-Command -ParameterType Process | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Les objets peuvent contenir de nombreux attributs, le filtre **Select-object** permet de filtrer/ | ||
+ | |||
+ | <code powershell> | ||
+ | # Sélectionne et affiche les propriétés ProcessName et Description de l' | ||
+ | # Process retourné par la commande Get-Process | ||
+ | Get-Process -Name " | ||
+ | </ | ||
+ | |||
+ | ===== Sortie par défaut ===== | ||
+ | |||
+ | Lorsque qu'une commande s' | ||
+ | |||
+ | <code bash> | ||
+ | # Commande saisie | ||
+ | Get-Process -Name " | ||
+ | |||
+ | # Commande exécutée par Powershell | ||
+ | Get-Process -Name " | ||
+ | </ | ||
+ | |||
+ | La vue par défaut associée à l' | ||
+ | |||
+ | Les commandes **Format-*** permettent d' | ||
+ | |||
+ | ===== Tri ===== | ||
+ | |||
+ | La commande **Sort-Object** permet d' | ||
+ | |||
+ | <code powershell> | ||
+ | # Tri décroissant sur les attributs Name puis CPU des objets Process | ||
+ | Get-Process | Sort-Object -Descending -Property Name, CPU | ||
+ | </ | ||
+ | |||
+ | ===== Bonnes pratiques ===== | ||
+ | |||
+ | Filtrer à gauche, c'est a dire introduire un **filtre au plus tôt** dans le pipeline de traitement afin de limiter la quantité d' | ||
+ | |||
+ | - Utiliser les options de filtrages intégrées aux applets si elles existent; | ||
+ | - Utiliser les applets de filtrage **Where-Object** et **Select-Object** au plus tôt. | ||
+ | |||
+ | Terminer par la mise en forme : Le traitement de mise en forme modifie la structure des objets, l' | ||
+ | |||
+ | Ne pas utiliser d' | ||
+ | * Les alias peuvent être supprimés ou redéfinis dans par le script de profil; | ||
+ | * Les alias rendent le code plus difficile à maintenir. | ||
+ | |||
+ | |||
+ | ===== Exécution des scripts ===== | ||
+ | |||
+ | De manière générale powershell tente de limiter les exécutions involontaires de la part des utilisateurs de deux façons : | ||
+ | * Un script ne peut être exécuté qu'en précisant son chemin d' | ||
+ | * L' | ||
+ | |||
+ | |||
+ | La stratégie d’exécution s' | ||
+ | |||
+ | < | ||
+ | La stratégie d' | ||
+ | </ | ||
+ | |||
+ | Les stratégies d' | ||
+ | |||
+ | * **Restricted** : Aucun script ne peut être exécuté ; | ||
+ | * **AllSigned** : Des scripts ne peuvent être exécutés que s’ils sont signés numériquement ; | ||
+ | * **RemoteSigned** : Des scripts téléchargés ne peuvent être exécutés que s’ils sont signés numériquement ; | ||
+ | * **Unrestricted** : Tous les scripts peuvent être exécutés, mais une invite de confirmation s’affiche lors de l’exécution de scripts non signés qui sont téléchargés ; | ||
+ | * **Bypass** : Tous les scripts sont exécutés sans invite ; | ||
+ | * **Undefined** : La stratégie n'est pas définie. | ||
+ | |||
+ | <code powershell> | ||
+ | # Retourne la stratégie d' | ||
+ | Get-ExecutionPolicy | ||
+ | |||
+ | # Retourne les étendues d' | ||
+ | Get-ExecutionPolicy -List | ||
+ | |||
+ | # Retourne la stratégie associée à l' | ||
+ | Get-ExecutionPolicy -Scope CurrentUser | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | Si la stratégie effective est **undefined** la stratégie d’exécution la plus restrictive est appliquée (**Restricted**). | ||
+ | </ | ||
+ | |||
+ | La documentation officielle en ligne détaille les différentes [[https:// | ||
+ | |||
+ | Pour changer la politique d’exécution seulement pour le processus courant : | ||
+ | <code powershell> | ||
+ | Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned | ||
+ | </ | ||
+ | |||
+ | Cette modification est transitoire, | ||
+ | |||
+ | <code powershell> | ||
+ | # Autorise l’exécution des scripts définis localement pour l' | ||
+ | Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned | ||
+ | |||
+ | # Autorise tous les scripts pour l' | ||
+ | Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | Certaines applications peuvent marquer les fichiers de script comme provenant d' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Extensions des scripts ===== | ||
+ | |||
+ | |||
+ | ^ .ps1xml | ||
+ | ^ .psm1 | Modules de scripts PowerShell | ||
+ | ^ .ps1 | Scripts PowerShell | ||
+ | |||
+ | |||
+ | ===== Variables ===== | ||
+ | |||
+ | |||
+ | Les variables ne sont pas uniquement destinées aux scripts et peuvent être définies via la console dans l' | ||
+ | |||
+ | ==== Lister les variables ==== | ||
+ | |||
+ | <code powershell> | ||
+ | # Lister les variables en consultant le lecteur PowerShell " | ||
+ | Get-ChildItem Variable: | ||
+ | |||
+ | # Equivalent | ||
+ | Get-Variables | ||
+ | </ | ||
+ | |||
+ | PowerShell n'est pas sensible à la casse : les noms de variables $avar, $aVar ou $AVAR sont considérés identiques | ||
+ | |||
+ | Par convention on utilise le CamelCase pour les labels des variables, ce n'est pas recommandé mais le nom de variable peut contenir certains caractères spéciaux. Pour créer une variable avec un nom contenant un espace utiliser la notation '' | ||
+ | |||
+ | ==== Affectation/ | ||
+ | |||
+ | L' | ||
+ | <code powershell> | ||
+ | $aNumber = 10 | ||
+ | |||
+ | $aService = Get-Service -ServiceName sshd | ||
+ | |||
+ | # La cmdlet ' | ||
+ | Set-Variable -Name anotherNumber -Value 5 | ||
+ | </ | ||
+ | |||
+ | Pour supprimer le contenu d'une variable on peut lui affecter la valeur $null ou utiliser la cmdlet Clear-Variable : | ||
+ | <code powershell> | ||
+ | aNumber = $null | ||
+ | |||
+ | Clear-Variable anotherNumber | ||
+ | |||
+ | # Pour supprimer la variable on peut utiliser la cmdlet Remove-Item | ||
+ | Remove-Item -Path Variable: | ||
+ | </ | ||
+ | |||
+ | ==== Typage des variables ==== | ||
+ | |||
+ | A l' affectation PowerShell détermine automatiquement le type de la variable. Pour lever les ambiguïtés il est possible de spécifier le type attendu. Lors de l' | ||
+ | |||
+ | <code powershell> | ||
+ | # Définition de la variable PI avec la valeur 3.14 (typage automatique) | ||
+ | $PI = 3.14 | ||
+ | |||
+ | # On peut spécifier le type souhaité d'une variable | ||
+ | [float] $PI = 3.14 | ||
+ | |||
+ | [DateTime] $today = Get-Date | ||
+ | |||
+ | # Pour afficher/ | ||
+ | $PI.GetType() | ||
+ | |||
+ | # Pour afficher les attributs et méthodes de l' | ||
+ | $aVar | Get-Member | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Interpolation ==== | ||
+ | |||
+ | Les valeurs des variables peuvent être insérées dans des chaînes de caractères : c'est l' | ||
+ | |||
+ | <code powershell> | ||
+ | [float] $PI = 3.14 | ||
+ | |||
+ | # Pas d' | ||
+ | # entourées par des simples guillements | ||
+ | Write-Host 'Pas d interpolation ici.' | ||
+ | |||
+ | # Entre double guillemets les variables sont interpolées | ||
+ | # le caractère backcote permet d' | ||
+ | Write-Host "`$PI vaut $PI" | ||
+ | |||
+ | # L' | ||
+ | Write-Host "`$PI vaut $($PI + 1)" | ||
+ | </ | ||
+ | |||
+ | ==== Portée ==== | ||
+ | |||
+ | Les étendues s' | ||
+ | |||
+ | Par défaut les éléments (variables ou fonctions) sont visibles dans l' | ||
+ | |||
+ | Les éléments ne peuvent être modifiés que dans l' | ||
+ | |||
+ | |||
+ | ===== Les modules ===== | ||
+ | |||
+ | Le module permet de regrouper/ | ||
+ | |||
+ | Pour utiliser les cmdlets d'un module, celui-ci doit être préalablement chargé via la commande **Import-Module**. A partir de Windows PowerShell 3 et supérieur, lors du premier usage d'une cmdlet le module est automatiquement chargé si toutefois il se trouve dans un des dossier de **'' | ||
+ | |||
+ | <code powershell> | ||
+ | # Afficher les dossiers de recherche des modules | ||
+ | $env: | ||
+ | </ | ||
+ | |||
+ | |||
+ | Afficher le module de la cmdlet " | ||
+ | <code pawoershell> | ||
+ | # Le module est afficher dans la colonne " | ||
+ | Get-Command -Name Get-DnsClientCache | ||
+ | |||
+ | CommandType | ||
+ | ----------- | ||
+ | Function | ||
+ | </ | ||
+ | |||
+ | Retourner le nom du module associé à la commande | ||
+ | <code powershell> | ||
+ | Get-Command -Name Get-DnsClientCache | Select-Object ModuleName | ||
+ | </ | ||
+ | |||
+ | <code powershell> | ||
+ | # lister les commandes du module " | ||
+ | Get-Command -Module Dism | ||
+ | </ | ||
+ | |||
+ | ===== PowerShell Gallery ===== | ||
+ | |||
+ | PowerShell Gallery est un dépôt centralisé dédié aux technologies PowerShell. A partir de Windows PowerShell 5.0 le module PowerShellGet permet de rechercher et d' | ||
+ | |||
+ | Les principales cmdlets pour rechercher dans PowerShell Gallery : | ||
+ | ^ Find-Command | | | ||
+ | ^ Find-Script | ||
+ | ^ Find-Module | ||
+ | |||
+ | ===== Références ===== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * [[https:// |