Powershell FR
Powershell FR
#powershell
Table des matières
À propos 1
Remarques 2
Versions 2
Examples 2
Installation ou configuration 2
les fenêtres 2
Autres plates-formes 3
Autoriser les scripts stockés sur votre machine à s'exécuter sans signature 3
Commentant 6
Introduction 9
Examples 9
Chapitre 3: Alias 14
Remarques 14
Examples 15
Get-Alias 15
Alias Set 15
Examples 17
Chapitre 5: Anonymiser les adresses IP (v4 et v6) dans un fichier texte avec Powershell 19
Introduction 19
Examples 19
Syntaxe 21
Remarques 21
Examples 21
Introduction 23
Examples 23
Script simple pour le test d'intégration des boîtes noires des applications de la console 23
Chapitre 8: Boucles 24
Introduction 24
Syntaxe 24
Remarques 24
Pour chaque 24
Performance 25
Examples 25
Pour 25
Pour chaque 25
Tandis que 26
ForEach-Object 27
Utilisation de base 27
Utilisation avancée 27
Faire 28
Méthode ForEach () 28
Continuer 29
Pause 29
Introduction 31
Examples 31
Méthodes et propriétés 31
Surcharge du constructeur 33
Introduction 35
Examples 35
Verbes 35
Des noms 35
Introduction 36
Examples 36
Introduction 37
Examples 37
Utilisation de REST avec des objets PowerShell pour obtenir et mettre des données individu 37
Utilisation de REST avec des objets PowerShell pour GET et POST de nombreux éléments 38
Examples 39
TCP listener 39
TCP expéditeur 39
Introduction 41
Remarques 41
Examples 41
Sortie anticipée 41
Examples 45
Examples 47
Les fonctions 47
Syntaxe 48
Remarques 48
Examples 48
Chaîne 48
Chaîne littérale 48
Format chaîne 49
Chaîne multiligne 49
Chaîne de caractères 49
Chaîne de caractères 49
Littéral ici-chaîne 50
Chaînes concaténantes 50
Utiliser l'opérateur + 50
Introduction 52
Remarques 52
Examples 52
Introduction 55
Remarques 55
Examples 55
Commutateur simple 55
Introduction 60
Paramètres 60
Examples 61
Examples 63
Applications de console 63
Applications GUI 63
Flux de console 63
Codes de sortie 64
Syntaxe 65
Examples 65
Match unique 65
Utilisation de Select-String 66
Remplacer 67
Plusieurs correspondances 70
Utilisation de Select-String 70
Introduction 72
Remarques 72
Examples 72
Introduction 74
Examples 74
Paramètres de base 74
Paramètres obligatoires 75
Fonction avancée 76
ValidateSet 77
ValiderRange 78
ValidatePattern 78
ValidateLength 78
ValidateCount 78
ValidateScript 78
Introduction 80
Examples 80
Introduction 82
Examples 82
Encrypter 83
Stockage des informations d'identification sous forme chiffrée et transmission en tant que 84
Examples 85
Remarques 87
Examples 87
Introduction 90
Paramètres 90
Remarques 90
Examples 91
C # Exemple 91
Exemple VB.NET 91
Remarques 93
Examples 93
Syntaxe 95
Remarques 95
Examples 95
Contour de base 95
Exemple FormatTaskName 95
ContinueOnError 96
Introduction 97
Examples 97
Parameterset pour imposer l'utilisation d'un paramètre lorsqu'un autre est sélectionné. 97
Introduction 99
Examples 99
Types d'erreur 99
Introduction 101
Examples 101
Mélanger les types d'opérandes: le type de l'opérande gauche détermine le comportement. 103
Paramètres 105
Examples 106
Syntaxe 109
Remarques 109
Examples 109
Négation 110
Introduction 112
Remarques 112
Examples 112
Module 112
Utilisateurs 112
Groupes 113
Objets 113
Introduction 115
Syntaxe 115
Paramètres 115
Remarques 116
Examples 116
Introduction 117
Examples 117
Introduction 118
Examples 118
Examples 119
Chargement du composant logiciel enfichable SharePoint 119
Obtenez toutes les fonctionnalités installées sur une collection de sites 119
Introduction 121
Examples 121
Introduction 124
Examples 124
Fonction 124
Démo 124
Scénario 125
Démo 125
Module 126
Démo 126
Remarques 130
Examples 130
Examples 132
Introduction 133
Syntaxe 133
Examples 133
Remarques 138
Examples 138
Examples 141
Introduction 143
Remarques 143
Examples 143
Chapitre 50: PowerShell "Streams"; Debug, Verbose, Warning, Error, Output et Information 146
Remarques 146
Examples 146
Remarques 148
Examples 148
Une bonne pratique pour nettoyer automatiquement les sessions PSSession 152
Remarques 153
Examples 154
Introduction 155
Examples 155
Introduction 156
Syntaxe 156
Examples 156
Introduction 158
Examples 158
Introduction 160
Paramètres 160
Remarques 160
Examples 162
SQLExample 162
SQLQuery 162
Remarques 164
Examples 165
Examples 168
Calcul des codes de hachage d'une chaîne via la cryptographie .Net 168
Chapitre 59: Service de stockage simple Amazon Web Services (AWS) (S3) 169
Introduction 169
Paramètres 169
Examples 169
Introduction 171
Remarques 171
Examples 171
Examples 174
Modèles 179
Profit 181
Améliorations 181
Examples 182
Introduction 187
Syntaxe 187
Remarques 187
Examples 187
Remarques 190
Examples 190
Remarques 197
Examples 197
Introduction 199
Examples 199
Introduction 201
Examples 201
Syntaxe 204
Paramètres 204
Remarques 204
Examples 204
Introduction 207
Syntaxe 207
Examples 207
$ pid 207
$ null 207
$ OFS 208
$ _ / $ PSItem 208
$? 209
$ erreur 209
Introduction 210
Remarques 210
Examples 210
$ PSVersionTable 210
Examples 211
Les variables d'environnement Windows sont visibles en tant que lecteur PS appelé Env: 211
Examples 212
Portée 212
Tableaux 214
Introduction 216
Examples 216
$ PSScriptRoot 216
$ Args 216
$ PSItem 216
$? 217
$ erreur 217
Remarques 218
Examples 219
Crédits 224
À propos
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: powershell
It is an unofficial and free PowerShell ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official PowerShell.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/fr/home 1
Chapitre 1: Démarrer avec PowerShell
Remarques
Windows PowerShell est un composant de shell et de script de Windows Management
Framework, une structure de gestion de l'automatisation / configuration de Microsoft basée sur
.NET Framework. PowerShell est installé par défaut sur toutes les versions prises en charge des
systèmes d'exploitation client et serveur Windows depuis Windows 7 / Windows Server 2008 R2.
Powershell peut être mis à jour à tout moment en téléchargeant une version ultérieure de
Windows Management Framework (WMF). La version "Alpha" de PowerShell 6 est multi-
plateforme (Windows, Linux et OS X) et doit être téléchargée et installée à partir de cette page .
Ressources additionnelles:
Versions
Examples
Installation ou configuration
les fenêtres
https://riptutorial.com/fr/home 2
PowerShell est inclus avec Windows Management Framework. L'installation et la configuration ne
sont pas requises sur les versions modernes de Windows.
Les mises à jour de PowerShell peuvent être effectuées en installant une version plus récente de
Windows Management Framework.
Autres plates-formes
La version "Beta" de PowerShell 6 peut être installée sur d'autres plates-formes. Les packages
d'installation sont disponibles ici .
Par exemple, PowerShell 6, pour Ubuntu 16.04, est publié pour empaqueter les référentiels afin
de faciliter l’installation (et les mises à jour).
# Update apt-get
sudo apt-get update
# Install PowerShell
sudo apt-get install -y powershell
# Start PowerShell
powershell
Après avoir enregistré le référentiel Microsoft en tant que superutilisateur, il vous suffit d’utiliser
sudo apt-get upgrade powershell pour le mettre à jour. Alors lancez simplement powershell
Autoriser les scripts stockés sur votre machine à s'exécuter sans signature
Pour des raisons de sécurité, PowerShell est configuré par défaut pour autoriser uniquement
l'exécution des scripts signés. L'exécution de la commande suivante vous permettra d'exécuter
des scripts non signés (vous devez exécuter PowerShell en tant qu'administrateur pour ce faire).
Set-ExecutionPolicy RemoteSigned
Une autre façon d’exécuter des scripts PowerShell consiste à utiliser Bypass comme
ExecutionPolicy :
https://riptutorial.com/fr/home 3
Set-ExecutionPolicy Bypass Process
Une solution de contournement temporaire pour la stratégie d'exécution peut également être
obtenue en exécutant le fichier exécutable Powershell et en transmettant toute stratégie valide en
tant que paramètre -ExecutionPolicy . La stratégie est en vigueur uniquement pendant la durée de
vie du processus, de sorte qu'aucun accès administratif au registre n'est nécessaire.
Plusieurs autres stratégies sont disponibles et les sites en ligne vous encouragent souvent à
utiliser Set-ExecutionPolicy Unrestricted . Cette stratégie reste en place jusqu'à ce qu'elle soit
modifiée et diminue la position de sécurité du système. Ceci n'est pas conseillé. L'utilisation de
RemoteSigned est recommandée car elle permet de stocker et d'écrire du code en local et requiert
que le code acquis à distance soit signé avec un certificat provenant d'une racine approuvée.
Veillez également à ce que la stratégie d'exécution soit appliquée par la stratégie de groupe, de
sorte que la stratégie de groupe, même modifiée, Unrestricted pour l'ensemble du système
(généralement 15 minutes). Vous pouvez voir la stratégie d'exécution définie sur les différentes
étendues à l'aide de Get-ExecutionPolicy -List
Documentation TechNet:
Set-ExecutionPolicy
about_Execution_Policies
Dans PowerShell, il existe plusieurs manières d'obtenir le même résultat. Ceci peut être bien
illustré avec l'exemple simple et familier de Hello World :
Utilisation de Write-Host :
Utilisation de Write-Output :
Il est à noter que bien que Write-Output & Write-Host écrivent tous deux sur l'écran, il y a une
différence subtile. Write-Host écrit uniquement dans stdout (c.-à-d. L'écran de la console), alors
que Write-Output écrit à la fois sur stdout AND et sur le flux de sortie [success] permettant la
redirection . La redirection (et les flux en général) permet de diriger la sortie d'une commande en
entrée vers une autre, y compris l'affectation à une variable.
https://riptutorial.com/fr/home 4
Ces fonctions similaires ne sont pas des alias, mais peuvent produire les mêmes résultats si l'on
veut éviter de "polluer" le flux de réussite.
'Hello world'
Hello world
Un autre exemple d'alias dans PowerShell est le mappage commun des commandes d'invite de
commandes plus anciennes et des commandes BASH aux applets de commande PowerShell.
Tous les éléments suivants produisent une liste de répertoires du répertoire en cours.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Enfin, vous pouvez créer votre propre alias avec l'applet de commande Set-Alias! Par exemple,
testons Test-NetConnection , qui est essentiellement l'équivalent PowerShell de la commande ping
de l'invite de commandes, pour "ping".
Maintenant, vous pouvez utiliser ping au lieu de Test-NetConnection ! Sachez que si l'alias est déjà
utilisé, vous écraserez l'association.
L'alias sera vivant jusqu'à ce que la session soit active. Une fois que vous fermez la session et
essayez d'exécuter l'alias que vous avez créé lors de votre dernière session, cela ne fonctionnera
pas. Pour résoudre ce problème, vous pouvez importer tous vos alias depuis Excel dans votre
session une fois, avant de commencer votre travail.
L'une des premières questions que se posent les utilisateurs lorsqu'ils commencent à utiliser
PowerShell pour créer des scripts est la manipulation de la sortie d'une applet de commande pour
effectuer une autre action.
Le symbole du pipeline | est utilisé à la fin d'une applet de commande pour prendre les données
exportées et les transmettre à la cmdlet suivante. Un exemple simple consiste à utiliser Select-
Object pour afficher uniquement la propriété Name d'un fichier affiché dans Get-ChildItem:
https://riptutorial.com/fr/home 5
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
L'utilisation plus avancée du pipeline nous permet de canaliser la sortie d'une applet de
commande dans une boucle foreach:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
Notez que l'exemple ci-dessus utilise la variable automatique $ _. $ _ est le court alias de $
PSItem qui est une variable automatique qui contient l'élément en cours dans le pipeline.
Commentant
Vous pouvez également avoir des commentaires sur plusieurs lignes en utilisant <# et #> au début
et à la fin du commentaire, respectivement.
<#
This is a
multi-line
comment
#>
Get-ChildItem
Les méthodes de bibliothèque .Net statiques peuvent être appelées à partir de PowerShell en
encapsulant le nom de classe complet dans le troisième cadre et en appelant ensuite la méthode
en utilisant ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
Les méthodes statiques peuvent être appelées à partir de la classe elle-même, mais l'appel de
méthodes non statiques nécessite une instance de la classe .Net (un objet).
Par exemple, la méthode AddHours ne peut pas être appelée à partir de la classe
System.DateTime elle-même. Il nécessite une instance de la classe:
https://riptutorial.com/fr/home 6
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Ensuite, nous pouvons utiliser des méthodes de cet objet, même les méthodes qui ne peuvent pas
être appelées directement depuis la classe System.DateTime, comme la méthode AddHours:
C:\> $Object.AddHours(15)
Dans de nombreux cas, un nouvel objet sera créé afin d'exporter des données ou de le
transmettre à une autre commande. Cela peut être fait comme ça:
Il y a plusieurs façons de créer un objet. La méthode suivante est probablement le moyen le plus
court et le plus rapide de créer un objet PSCustomObject :
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
Si vous avez déjà un objet, mais que vous n’avez besoin que d’une ou deux propriétés
supplémentaires, vous pouvez simplement ajouter cette propriété à l’aide de Select-Object :
https://riptutorial.com/fr/home 7
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Tous les objets peuvent être stockés dans des variables ou passés dans le pipeline. Vous pouvez
également ajouter ces objets à une collection, puis afficher les résultats à la fin.
Les collections d'objets fonctionnent bien avec Export-CSV (et Import-CSV). Chaque ligne du
fichier CSV est un objet, chaque colonne une propriété.
Les commandes de format convertissent les objets en flux de texte pour l'affichage. Évitez
d'utiliser les commandes Format- * jusqu'à la dernière étape d'un traitement de données, afin de
préserver la convivialité des objets.
https://riptutorial.com/fr/home 8
Chapitre 2: Aide basée sur les commentaires
Introduction
PowerShell dispose d'un mécanisme de documentation appelé aide basée sur les commentaires.
Il permet de documenter des scripts et des fonctions avec des commentaires de code. L'aide
basée sur les commentaires est la plupart du temps écrite dans des blocs de commentaires
contenant plusieurs mots-clés d'aide. Les mots-clés d'aide commencent par des points et
identifient les sections d'aide qui seront affichées en exécutant la cmdlet Get-Help .
Examples
Aide basée sur les commentaires de fonction
<#
.SYNOPSIS
Gets the content of an INI file.
.DESCRIPTION
Gets the content of an INI file and returns it as a hashtable.
.INPUTS
System.String
.OUTPUTS
System.Collections.Hashtable
.PARAMETER FilePath
Specifies the path to the input INI file.
.EXAMPLE
C:\PS>$IniContent = Get-IniContent -FilePath file.ini
C:\PS>$IniContent['Section1'].Key1
Gets the content of file.ini and access Key1 from Section1.
.LINK
Out-IniFile
#>
function Get-IniContent
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[ValidateNotNullOrEmpty()]
[ValidateScript({(Test-Path $_) -and ((Get-Item $_).Extension -eq ".ini")})]
[System.String]$FilePath
)
https://riptutorial.com/fr/home 9
switch -regex -file $FilePath
{
"^\[(.+)\]$" # Section
{
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
}
"^(;.*)$" # Comment
{
if( !($section) )
{
$section = "No-Section"
$ini[$section] = @{}
}
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = "Comment" + $CommentCount
$ini[$section][$name] = $value
}
"(.+?)\s*=\s*(.*)" # Key
{
if( !($section) )
{
$section = "No-Section"
$ini[$section] = @{}
}
$name,$value = $matches[1..2]
$ini[$section][$name] = $value
}
}
return $ini
}
La documentation de la fonction ci-dessus peut être affichée en exécutant Get-Help -Name Get-
IniContent -Full :
https://riptutorial.com/fr/home 10
Notez que les mots clés basés sur des commentaires commençant par a . correspondent aux
sections de résultats Get-Help .
<#
.SYNOPSIS
Reads a CSV file and filters it.
https://riptutorial.com/fr/home 11
.DESCRIPTION
The ReadUsersCsv.ps1 script reads a CSV file and filters it on the 'UserName' column.
.PARAMETER Path
Specifies the path of the CSV input file.
.INPUTS
None. You cannot pipe objects to ReadUsersCsv.ps1.
.OUTPUTS
None. ReadUsersCsv.ps1 does not generate any output.
.EXAMPLE
C:\PS> .\ReadUsersCsv.ps1 -Path C:\Temp\Users.csv -UserName j.doe
#>
Param
(
[Parameter(Mandatory=$true,ValueFromPipeline=$false)]
[System.String]
$Path,
[Parameter(Mandatory=$true,ValueFromPipeline=$false)]
[System.String]
$UserName
)
https://riptutorial.com/fr/home 12
Lire Aide basée sur les commentaires en ligne:
https://riptutorial.com/fr/powershell/topic/9530/aide-basee-sur-les-commentaires
https://riptutorial.com/fr/home 13
Chapitre 3: Alias
Remarques
Le système de nommage de Powershell a des règles assez strictes pour nommer les applets de
commande (modèle Verb-Noun; voir [sujet non encore créé] pour plus d'informations). Mais il n’est
pas très pratique d’écrire Get-ChildItems chaque fois que vous souhaitez répertorier les fichiers
dans un répertoire de manière interactive.
Par conséquent, Powershell permet d'utiliser des raccourcis (alias) au lieu de noms d'applet de
commande.
Vous pouvez écrire ls , dir ou gci au lieu de Get-ChildItem et obtenir le même résultat. Alias est
équivalent à sa cmdlet.
?, où Où-objet
fl Format-List
ft Format-Table
fw Format à l'échelle
gm Get-Member
iex Invocation-expression
ii Invoke-Item
https://riptutorial.com/fr/home 14
alias applet de commande
dormir Start-Sleep
Dans le tableau ci-dessus, vous pouvez voir comment les alias ont permis de simuler des
commandes connues d'autres environnements (cmd, bash), d'où une plus grande facilité de
découverte.
Examples
Get-Alias
Get-Alias
Pour obtenir tous les alias pour une applet de commande spécifique:
Alias Set
Cette applet de commande vous permet de créer de nouveaux noms alternatifs pour les applets
de commande existantes.
https://riptutorial.com/fr/home 15
PS C:\> proc
Gardez à l'esprit que tous les alias que vous créez ne seront conservés que dans la session en
cours. Lorsque vous démarrez une nouvelle session, vous devez à nouveau créer vos alias. Les
profils Powershell (voir [sujet non encore créé]) sont parfaits pour ces fins.
https://riptutorial.com/fr/home 16
Chapitre 4: Analyse CSV
Examples
Utilisation de base de Import-Csv
String,DateTime,Integer
First,2016-12-01T12:00:00,30
Second,2015-12-01T12:00:00,20
Third,2015-12-01T12:00:00,20
On peut importer les lignes CSV dans les objets PowerShell à l'aide de la commande Import-Csv
Par défaut, Import-CSV importe toutes les valeurs sous forme de chaînes, donc pour obtenir les
objets DateTime- et integer, nous devons les convertir ou les analyser.
Utiliser Foreach-Object :
#Output object
$_
}
https://riptutorial.com/fr/home 17
Sortie:
https://riptutorial.com/fr/home 18
Chapitre 5: Anonymiser les adresses IP (v4 et
v6) dans un fichier texte avec Powershell
Introduction
Manipulation de Regex pour IPv4 et IPv6 et remplacement par une fausse adresse IP dans un
fichier journal lu
Examples
Anonymiser l'adresse IP dans un fichier texte
# Read a text file and replace the IPv4 and IPv6 by fake IP Address
# Replace matching IPv4 from sourcefile and creating a temp file IPV4.txt
Get-Content $SourceFile | Foreach-Object {$_ -replace $Regex_v4, $Anonym_v4} | Set-Content
$IPv4File
# Replace matching IPv6 from IPV4.txt and creating a temp file ANONYM.txt
Get-Content $IPv4File | Foreach-Object {$_ -replace $Regex_v6, $Anonym_v6} | Set-Content
$DestFile
https://riptutorial.com/fr/home 19
Else
{
Rename-Item $DestFile -NewName $AnonymFile
}
Lire Anonymiser les adresses IP (v4 et v6) dans un fichier texte avec Powershell en ligne:
https://riptutorial.com/fr/powershell/topic/9171/anonymiser-les-adresses-ip--v4-et-v6--dans-un-
fichier-texte-avec-powershell
https://riptutorial.com/fr/home 20
Chapitre 6: Application des prérequis du
script
Syntaxe
• #Requires -Version <N> [. <N>]
• #Requires –PSSnapin <Nom PSSnapin> [-Version <N> [. <N>]]
• #Requires -Modules {<Nom-module> | <Hashtable>}
• #Requires –ShellId <ShellId>
• #Requires -RunAsAdministrator
Remarques
#requiresinstruction #requires peut être placée sur n'importe quelle ligne du script (il ne doit pas
nécessairement s'agir de la première ligne), mais il doit s'agir de la première instruction sur cette
ligne.
Pour plus de référence, veuillez vous référer à la documentation officielle sur Technet -
about_about_Requires .
Examples
Appliquer une version minimale de l'hôte powershell
#requires -version 4
Après avoir essayé d'exécuter ce script dans la version inférieure, vous verrez ce message
d'erreur
. \ script.ps1: Le script 'script.ps1' ne peut pas être exécuté car il contient une
instruction "#requires" à la ligne 1 pour Windows PowerShell version 5.0. La version
requise par le script ne correspond pas à la version en cours d'exécution de Windows
PowerShell version 2.0.
4.0
#requires -RunAsAdministrator
Après avoir essayé d'exécuter ce script sans privilèges d'administrateur, vous verrez ce message
https://riptutorial.com/fr/home 21
d'erreur
. \ script.ps1: Le script 'script.ps1' ne peut pas être exécuté car il contient une
instruction "#requires" pour s'exécuter en tant qu'administrateur. La session Windows
PowerShell en cours ne s'exécute pas en tant qu'administrateur. Démarrez Windows
PowerShell en utilisant l'option Exécuter en tant qu'administrateur, puis essayez à
nouveau d'exécuter le script.
https://riptutorial.com/fr/home 22
Chapitre 7: Automatisation de l'infrastructure
Introduction
L'automatisation des services de gestion d'infrastructure permet de réduire les ETP et d'obtenir un
meilleur retour sur investissement cumulatif à l'aide de plusieurs outils, orchestrateurs, moteur
d'orchestration, scripts et interface utilisateur facile
Examples
Script simple pour le test d'intégration des boîtes noires des applications de
la console
Ceci est un exemple simple sur la façon dont vous pouvez automatiser les tests pour une
application console qui interagit avec une entrée standard et une sortie standard.
L'application testée lit et additionne chaque nouvelle ligne et fournit le résultat après qu'une seule
ligne blanche soit fournie. Le script Power Shell écrit "pass" lorsque la sortie correspond.
https://riptutorial.com/fr/home 23
Chapitre 8: Boucles
Introduction
Une boucle est une séquence d'instructions répétée continuellement jusqu'à ce qu'une certaine
condition soit atteinte. Pouvoir faire exécuter à plusieurs reprises un bloc de code par votre
programme est l’une des tâches les plus élémentaires mais utiles de la programmation. Une
boucle vous permet d'écrire une instruction très simple pour produire un résultat nettement
supérieur simplement par répétition. Si la condition a été atteinte, l'instruction suivante "passe" à
l'instruction séquentielle suivante ou se branche en dehors de la boucle.
Syntaxe
• pour (<Initialisation>; <Condition>; <Répétition>) {<Script_Block>}
Remarques
Pour chaque
Il existe plusieurs manières d'exécuter une boucle foreach dans PowerShell et elles apportent
toutes leurs avantages et inconvénients:
https://riptutorial.com/fr/home 24
Solution Avantages Désavantages
Performance
"Foreach: $($foreach.TotalSeconds)"
"Foreach method: $($foreachmethod.TotalSeconds)"
"ForEach-Object: $($foreachobject.TotalSeconds)"
Example output:
Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821
Alors que Foreach-Object est le plus lent, son support par pipeline peut être utile car il vous permet
de traiter les éléments à mesure qu'ils arrivent (lors de la lecture d'un fichier, de la réception de
données, etc.). Cela peut être très utile lorsque vous travaillez avec des données volumineuses et
de la mémoire faible, car vous n'avez pas besoin de charger toutes les données en mémoire
avant le traitement.
Examples
Pour
Une utilisation typique de la boucle for consiste à opérer sur un sous-ensemble des valeurs d'un
tableau. Dans la plupart des cas, si vous souhaitez parcourir toutes les valeurs d'un tableau,
envisagez d'utiliser une instruction foreach.
Pour chaque
ForEach a deux significations différentes dans PowerShell. L'un est un mot - clé et l'autre est un
alias pour l' applet de commande ForEach-Object . Le premier est décrit ici.
Cet exemple montre comment imprimer tous les éléments d'un tableau sur l'hôte de la console:
https://riptutorial.com/fr/home 25
$Names = @('Amy', 'Bob', 'Celine', 'David')
Comme dans le dernier exemple, cet exemple montre plutôt la création d’un tableau avant le
stockage de la boucle:
$Numbers = @()
ForEach ($Number in 1..20)
{
$Numbers += $Number
}
Tandis que
Une boucle while évalue une condition et si true exécute une action. Tant que la condition est
vraie, l'action continuera d'être effectuée.
while(condition){
code_block
}
$i = 10
while($i -ge 0){
$i
$i--
}
Remarque: Lors de l'évaluation de la condition, PowerShell considère que l'existence d'un objet
de retour est vraie. Cela peut être utilisé de plusieurs manières, mais ci-dessous est un exemple
pour surveiller un processus. Cet exemple va engendrer un processus de bloc-notes et ensuite
dormir le shell en cours tant que ce processus est en cours d'exécution. Lorsque vous fermez
manuellement l'instance du bloc-notes, la condition while va échouer et la boucle sera
interrompue.
Start-Process notepad.exe
while(Get-Process notepad -ErrorAction SilentlyContinue){
https://riptutorial.com/fr/home 26
Start-Sleep -Milliseconds 500
}
ForEach-Object
L' ForEach-Object fonctionne de manière similaire à l'instruction foreach , mais tire son entrée du
pipeline.
Utilisation de base
$object | ForEach-Object {
code_block
}
Exemple:
$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
"Hi, my name is $_!"
}
Foreach-Object a deux alias par défaut, foreach et % (syntaxe abrégée). Le plus courant est % car
foreach peut être confondu avec l' instruction foreach . Exemples:
$names | % {
"Hi, my name is $_!"
}
$names | foreach {
"Hi, my name is $_!"
}
Utilisation avancée
Foreach-Object se distingue des solutions foreach alternatives car il s'agit d'une applet de
commande qui signifie qu'il est conçu pour utiliser le pipeline. De ce fait, il prend en charge trois
blocs de script, tout comme une applet de commande ou une fonction avancée:
• Begin : Exécuté une fois avant de parcourir les éléments qui arrivent du pipeline.
Généralement utilisé pour créer des fonctions à utiliser dans la boucle, créer des variables,
ouvrir des connexions (base de données, web +), etc.
• Processus : exécuté une fois par article arrivé du pipeline. "Normal" foreach codeblock.
C'est la valeur par défaut utilisée dans les exemples ci-dessus lorsque le paramètre n'est
pas spécifié.
• End : Exécuté une fois après avoir traité tous les éléments. Généralement utilisé pour fermer
des connexions, générer un rapport, etc.
Exemple:
https://riptutorial.com/fr/home 27
"Any","Bob","Celine","David" | ForEach-Object -Begin {
$results = @()
} -Process {
#Create and store message
$results += "Hi, my name is $_!"
} -End {
#Count messages and output
Write-Host "Total messages: $($results.Count)"
$results
}
Faire
Les Do-Loops sont utiles lorsque vous voulez toujours exécuter au moins une fois un bloc de
code. Une Do-loop évaluera la condition après l'exécution du codeblock, contrairement à une
boucle while qui le fait avant d'exécuter le codeblock.
Do {
code_block
} while (condition)
• Boucle jusqu'à ce que la condition soit vraie, en d'autres termes, boucle pendant que la
condition est fausse:
Do {
code_block
} until (condition)
Exemples réels:
$i = 0
Do {
$i++
"Number $i"
} while ($i -ne 3)
Do {
$i++
"Number $i"
} until ($i -eq 3)
Do-While et Do-Until sont des boucles antonymous. Si le code à l'intérieur du même, la condition
sera inversée. L'exemple ci-dessus illustre ce comportement.
Méthode ForEach ()
4.0
https://riptutorial.com/fr/home 28
Au lieu de l' ForEach-Object , il existe également la possibilité d'utiliser une méthode ForEach
directement sur les tableaux d'objets comme
(1..10).ForEach({$_ * $_})
ou - si vous le souhaitez - les parenthèses autour du bloc de script peuvent être omises
(1..10).ForEach{$_ * $_}
1
4
9
16
25
36
49
64
81
100
Continuer
L'opérateur Continue fonctionne dans les boucles For , ForEach , While et Do Il ignore l'itération
actuelle de la boucle, en sautant au sommet de la boucle la plus interne.
$i =0
while ($i -lt 20) {
$i++
if ($i -eq 7) { continue }
Write-Host $I
}
Remarque : Lorsque vous utilisez une boucle de pipeline, vous devez utiliser return au lieu de
Continue .
Pause
L'opérateur de break sortira immédiatement d'une boucle de programme. Il peut être utilisé dans
les boucles For , ForEach , While et Do ou dans une instruction Switch .
$i = 0
while ($i -lt 15) {
$i++
if ($i -eq 7) {break}
Write-Host $i
}
https://riptutorial.com/fr/home 29
Ce qui précède comptera jusqu'à 15 mais s'arrêtera dès que 7 sera atteint.
Remarque : Lorsque vous utilisez une boucle de pipeline, la break se comportera comme si elle
se continue . Pour simuler des break dans la boucle de pipeline, vous devez intégrer une logique,
une cmdlet, etc. supplémentaires. Il est plus facile de rester en contact avec des boucles sans
pipeline si vous avez besoin d'utiliser break .
Étiquettes de rupture
Break peut également appeler une étiquette placée devant l'instanciation d'une boucle:
$i = 0
:mainLoop While ($i -lt 15) {
Write-Host $i -ForegroundColor 'Cyan'
$j = 0
While ($j -lt 15) {
Write-Host $j -ForegroundColor 'Magenta'
$k = $i*$j
Write-Host $k -ForegroundColor 'Green'
if ($k -gt 100) {
break mainLoop
}
$j++
}
$i++
}
Remarque: Ce code incrémente $i à 8 et $j à 13 ce qui fait que $k égal à 104 . Comme $k dépasse
100 , le code va alors sortir des deux boucles.
https://riptutorial.com/fr/home 30
Chapitre 9: Classes PowerShell
Introduction
Une classe est un modèle de code de programme extensible permettant de créer des objets,
fournissant des valeurs initiales pour l'état (variables membres) et des implémentations de
comportement (fonctions ou méthodes membres). Une classe est un modèle pour un objet. Il est
utilisé comme modèle pour définir la structure des objets. Un objet contient des données
auxquelles nous accédons via des propriétés et que nous pouvons utiliser en utilisant des
méthodes. PowerShell 5.0 a ajouté la possibilité de créer vos propres classes.
Examples
Méthodes et propriétés
class Person {
[string] $FirstName
[string] $LastName
[string] Greeting() {
return "Greetings, {0} {1}!" -f $this.FirstName, $this.LastName
}
}
$x = [Person]::new()
$x.FirstName = "Jane"
$x.LastName = "Doe"
$greeting = $x.Greeting() # "Greetings, Jane Doe!"
5.0
Dans PowerShell 5.0+, vous pouvez répertorier les constructeurs disponibles en appelant la new
méthode statique sans parenthèses.
PS> [DateTime]::new
OverloadDefinitions
-------------------
datetime new(long ticks)
datetime new(long ticks, System.DateTimeKind kind)
datetime new(int year, int month, int day)
datetime new(int year, int month, int day, System.Globalization.Calendar calendar)
datetime new(int year, int month, int day, int hour, int minute, int second)
datetime new(int year, int month, int day, int hour, int minute, int second,
System.DateTimeKind kind)
datetime new(int year, int month, int day, int hour, int minute, int second,
System.Globalization.Calendar calendar)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond,
https://riptutorial.com/fr/home 31
System.DateTimeKind kind)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond,
System.Globalization.Calendar calendar)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond,
System.Globalization.Calendar calendar, System.DateTimeKind kind)
C'est la même technique que vous pouvez utiliser pour répertorier les définitions de surcharge
pour n'importe quelle méthode.
> 'abc'.CompareTo
OverloadDefinitions
-------------------
int CompareTo(System.Object value)
int CompareTo(string strB)
int IComparable.CompareTo(System.Object obj)
int IComparable[string].CompareTo(string other)
Pour les versions antérieures, vous pouvez créer votre propre fonction pour répertorier les
constructeurs disponibles:
function Get-Constructor {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[type]$type
)
Process {
$type.GetConstructors() |
Format-Table -Wrap @{
n="$($type.Name) Constructors"
e={ ($_.GetParameters() | % { $_.ToString() }) -Join ", " }
}
}
}
Usage:
Get-Constructor System.DateTime
#Or [datetime] | Get-Constructor
DateTime Constructors
---------------------
Int64 ticks
Int64 ticks, System.DateTimeKind kind
Int32 year, Int32 month, Int32 day
Int32 year, Int32 month, Int32 day, System.Globalization.Calendar calendar
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second,
System.DateTimeKind kind
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second,
System.Globalization.Calendar calendar
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond,
System.DateTimeKind kind
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond,
https://riptutorial.com/fr/home 32
System.Globalization.Cal
endar calendar
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond,
System.Globalization.Cal
endar calendar, System.DateTimeKind kind
Surcharge du constructeur
class Person {
[string] $Name
[int] $Age
Person([string] $Name) {
$this.Name = $Name
}
Cela retournera tous les membres de l'instance de type. Voici une partie d'un exemple de sortie
pour l'instance String
TypeName: System.String
# Define a class
class TypeName
{
https://riptutorial.com/fr/home 33
# Property with validate set
[ValidateSet("val1", "Val2")]
[string] $P1
# Static property
static [hashtable] $P2
# Constructor
TypeName ([string] $s)
{
$this.P1 = $s
}
# Static method
static [void] MemberMethod1([hashtable] $h)
{
[TypeName]::P2 = $h
}
# Instance method
[int] MemberMethod2([int] $i)
{
$this.P3 = $i
return $this.P3
}
}
class ParentClass
{
[string] $Message = "Its under the Parent Class"
[string] GetMessage()
{
return ("Message: {0}" -f $this.Message)
}
}
}
$Inherit = [ChildClass]::new()
https://riptutorial.com/fr/home 34
Chapitre 10: Cmdlet Naming
Introduction
CmdLets devrait être nommé en utilisant un schéma de dénomination <verb>-<noun> afin
d’améliorer la découverte.
Examples
Verbes
Les verbes utilisés pour nommer CmdLets doivent être nommés à partir des verbes de la liste
fournie par Get-Verb
Vous trouverez plus de détails sur l'utilisation des verbes dans les verbes approuvés pour
Windows PowerShell.
Des noms
Soyez cohérent avec les noms. Par exemple, Find-Package besoin d'un fournisseur. Le nom est
PackageProvider non ProviderPackage .
https://riptutorial.com/fr/home 35
Chapitre 11: Comment télécharger le dernier
artefact d'Artifactory en utilisant le script
Powershell (v2.0 ou inférieur)?
Introduction
Cette documentation explique et fournit des étapes pour télécharger le dernier artefact d'un
référentiel JFrog Artifactory en utilisant Powershell Script (version 2.0 ou inférieure).
Examples
Script Powershell pour télécharger le dernier artefact
$username = 'user'
$password= 'password'
$DESTINATION = "D:\test\latest.tar.gz"
$client = New-Object System.Net.WebClient
$client.Credentials = new-object System.Net.NetworkCredential($username, $password)
$lastModifiedResponse =
$client.DownloadString('https://domain.org.com/artifactory/api/storage/FOLDER/repo/?lastModified')
[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
$serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$getLatestModifiedResponse = $serializer.DeserializeObject($lastModifiedResponse)
$downloaUriResponse = $getLatestModifiedResponse.uri
Write-Host $json.uri
$latestArtifcatUrlResponse=$client.DownloadString($downloaUriResponse)
[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
$serializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$getLatestArtifact = $serializer.DeserializeObject($latestArtifcatUrlResponse)
Write-Host $getLatestArtifact.downloadUri
$SOURCE=$getLatestArtifact.downloadUri
$client.DownloadFile($SOURCE,$DESTINATION)
Lire Comment télécharger le dernier artefact d'Artifactory en utilisant le script Powershell (v2.0 ou
inférieur)? en ligne: https://riptutorial.com/fr/powershell/topic/8883/comment-telecharger-le-dernier-
artefact-d-artifactory-en-utilisant-le-script-powershell--v2-0-ou-inferieur--
https://riptutorial.com/fr/home 36
Chapitre 12: Communication avec les API
RESTful
Introduction
REST signifie Representational State Transfer (parfois orthographié «ReST»). Il s'appuie sur un
protocole de communication sans serveur, client-serveur, apte à la mise en cache et le protocole
HTTP est principalement utilisé. Il est principalement utilisé pour créer des services Web légers,
maintenables et évolutifs. Un service basé sur REST est appelé service RESTful et les API
utilisées sont des API RESTful. Dans PowerShell, Invoke-RestMethod est utilisé pour les gérer.
Examples
Utilisez les Webhooks entrants Slack.com
Définissez votre charge utile pour envoyer d'éventuelles données plus complexes
$params = @{
Uri = "https://your.hipchat.com/v2/room/934419/notification?auth_token=???"
Method = "POST"
Body = @{
color = 'yellow'
message = "This is a test message!"
notify = $false
message_format = "text"
} | ConvertTo-Json
ContentType = 'application/json'
}
Invoke-RestMethod @params
Utilisation de REST avec des objets PowerShell pour obtenir et mettre des
données individuelles
https://riptutorial.com/fr/home 37
$Post = Invoke-RestMethod -Uri "http://jsonplaceholder.typicode.com/posts/1"
https://riptutorial.com/fr/home 38
Chapitre 13: Communication TCP avec
PowerShell
Examples
TCP listener
Function Receive-TCPMessage {
Param (
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[int] $Port
)
Process {
Try {
# Set up endpoint and start listening
$endpoint = new-object System.Net.IPEndPoint([ipaddress]::any,$port)
$listener = new-object System.Net.Sockets.TcpListener $EndPoint
$listener.start()
# Stream setup
$stream = $data.GetStream()
$bytes = New-Object System.Byte[] 1024
Commencez à écouter avec les éléments suivants et capturez tout message dans la variable $msg
:
TCP expéditeur
https://riptutorial.com/fr/home 39
Function Send-TCPMessage {
Param (
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[string]
$EndPoint
,
[Parameter(Mandatory=$true, Position=1)]
[int]
$Port
,
[Parameter(Mandatory=$true, Position=2)]
[string]
$Message
)
Process {
# Setup connection
$IP = [System.Net.Dns]::GetHostAddresses($EndPoint)
$Address = [System.Net.IPAddress]::Parse($IP)
$Socket = New-Object System.Net.Sockets.TCPClient($Address,$Port)
Send-TCPMessage -Port 29800 -Endpoint 192.168.0.1 -message "My first TCP message !"
Remarque : les messages TCP peuvent être bloqués par votre pare-feu logiciel ou par tout autre
pare-feu externe auquel vous tentez de répondre. Assurez-vous que le port TCP défini dans la
commande ci-dessus est ouvert et que vous avez configuré l'écouteur sur le même port.
https://riptutorial.com/fr/home 40
Chapitre 14: Comportement de retour dans
PowerShell
Introduction
Il peut être utilisé pour quitter la portée actuelle, qui peut être une fonction, un script ou un bloc de
script. Dans PowerShell, le résultat de chaque instruction est renvoyé en tant que sortie, même
sans mot-clé Return explicite ou pour indiquer que la fin de la portée a été atteinte.
Remarques
Vous pouvez en savoir plus sur la sémantique de retour sur la page about_Return de TechNet ou
en appelant get-help return partir d'une invite PowerShell.
Le mot-clé Return permet de quitter une fonction, un script ou un bloc de script. Il peut
être utilisé pour quitter une étendue à un point spécifique, pour renvoyer une valeur ou
pour indiquer que la fin de la portée a été atteinte.
Les utilisateurs familiarisés avec des langages tels que C ou C # peuvent vouloir
utiliser le mot-clé Return pour rendre la logique de laisser une portée explicite.
Dans Windows PowerShell, les résultats de chaque instruction sont renvoyés en tant
que sortie, même sans instruction contenant le mot clé Return. Les langages comme C
ou C # renvoient uniquement la ou les valeurs spécifiées par le mot-clé Return.
Examples
Sortie anticipée
function earlyexit {
"Hello"
return
"World"
}
https://riptutorial.com/fr/home 41
Je t'ai eu! Retour dans le pipeline
Inspiré par
function bar {
[System.Collections.ArrayList]$MyVariable = @()
$MyVariable.Add("a") | Out-Null
$MyVariable.Add("b") | Out-Null
$MyVariable
}
Le Out-Null est nécessaire car la méthode .NET ArrayList.Add renvoie le nombre d'éléments dans
la collection après l'ajout. Si omis, le pipeline aurait contenu 1, 2, "a", "b"
function bar
{
# New-Item cmdlet returns information about newly created file/folder
New-Item "test1.txt" | out-null
New-Item "test2.txt" > $null
[void](New-Item "test3.txt")
$tmp = New-Item "test4.txt"
}
Remarque: pour en savoir plus sur les raisons de préférer > $null , voir [sujet non encore créé].
(paraphrasé de about_return )
function foo {
$a = "Hello"
return $a
}
https://riptutorial.com/fr/home 42
function bar {
$a = "Hello"
$a
return
}
function quux {
$a = "Hello"
$a
}
Une fonction renvoie tout ce qui n'est pas capturé par autre chose.
Si vous utilisez le mot-clé return , chaque instruction après la ligne de retour ne sera pas
exécutée!
Comme ça:
Function Test-Function
{
Param
(
[switch]$ExceptionalReturn
)
"Start"
if($ExceptionalReturn){Return "Damn, it didn't work!"}
New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
Return "Yes, it worked!"
}
Fonction de test
Reviendra:
• Début
• La clé de registre nouvellement créée (ceci est dû au fait que certaines instructions créent
une sortie inattendue)
• Oui, ça a marché!
• Début
• Bon sang, ça n'a pas marché!
Function Test-Function
{
Param
(
[switch]$ExceptionalReturn
)
. {
https://riptutorial.com/fr/home 43
"Start"
if($ExceptionalReturn)
{
$Return = "Damn, it didn't work!"
Return
}
New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
$Return = "Yes, it worked!"
Return
} | Out-Null
Return $Return
}
Fonction de test
Reviendra:
• Oui, ça a marché!
Avec cette astuce, vous pouvez contrôler la sortie renvoyée, même si vous n'êtes pas sûr de la
nature de chaque instruction.
Ça marche comme ça
.{<Statements>} | Out-Null
https://riptutorial.com/fr/home 44
Chapitre 15: Configuration d'état souhaitée
Examples
Exemple simple - Activation de WindowsFeature
configuration EnableIISFeature
{
node localhost
{
WindowsFeature IIS
{
Ensure = “Present”
Name = “Web-Server”
}
}
}
Pour tester la configuration DSC sur votre hôte local, vous pouvez simplement appeler les
éléments suivants:
Démarrer un DSC sur une machine distante est presque aussi simple. En supposant que vous
ayez déjà configuré la communication à distance Powershell (ou WSMAN activé).
$remoteComputer = "myserver.somedomain.com"
$cred = (Get-Credential)
Start-DSCConfiguration -ServerName $remoteComputer -Credential $cred -Verbose
Nb: En supposant que vous avez compilé une configuration pour votre noeud sur votre machine
locale (et que le fichier myserver.somedomain.com.mof est présent avant de démarrer la
configuration)
Parfois, il peut être utile de tester vos fichiers de données Powershell et de parcourir les nœuds et
les serveurs.
Exemple:
https://riptutorial.com/fr/home 45
$data = Import-PowerShellDataFile -path .\MydataFile.psd1
$data.AllNodes
Pour répertorier les ressources DSC disponibles sur votre noeud de création:
Get-DscResource
Cela répertoriera toutes les ressources pour tous les modules installés (qui se trouvent dans votre
PSModulePath) sur votre noeud de création.
Pour répertorier toutes les ressources DSC disponibles dans les sources en ligne (PSGallery ++)
sur WMF 5:
Find-DSCResource
Avant de pouvoir utiliser une ressource dans une configuration, vous devez l'importer
explicitement. Le fait de l'avoir installé sur votre ordinateur ne vous permettra pas d'utiliser la
ressource implicitement.
Configuration InstallPreReqs
{
param(); # params to DSC goes here.
Import-DscResource PSDesiredStateConfiguration
File CheckForTmpFolder {
Type = 'Directory'
DestinationPath = 'C:\Tmp'
Ensure = "Present"
}
}
Remarque : Pour que les ressources DSC fonctionnent, les modules doivent être installés sur les
ordinateurs cibles lors de l'exécution de la configuration. Si vous ne les avez pas installés, la
configuration échouera.
https://riptutorial.com/fr/home 46
Chapitre 16: Conventions de nommage
Examples
Les fonctions
Get-User()
https://riptutorial.com/fr/home 47
Chapitre 17: Cordes
Syntaxe
• "(Double-quoted) String"
• 'Chaîne littérale'
• @"
Chaîne de caractères
"@
• @'
Littéral ici-chaîne
'@
Remarques
Les chaînes sont des objets représentant du texte.
Examples
Créer une chaîne de base
Chaîne
Les chaînes sont créées en encapsulant le texte avec des guillemets doubles. Les chaînes entre
guillemets peuvent évaluer les variables et les caractères spéciaux.
Pour utiliser un guillemet double à l'intérieur d'une chaîne, il doit être échappé en utilisant le
caractère d'échappement backtick ( ` ). Les guillemets simples peuvent être utilisés dans une
chaîne entre guillemets.
$myString = "A `"double quoted`" string which also has 'single quotes'."
Chaîne littérale
Les chaînes littérales sont des chaînes qui n'évaluent pas les variables et les caractères spéciaux.
Il est créé à l'aide de guillemets simples.
https://riptutorial.com/fr/home 48
$myLiteralString = 'Simple text including special characters (`n) and a $variable-reference'
Pour utiliser des guillemets simples dans une chaîne littérale, utilisez des guillemets simples ou
une chaîne littérale ici. Les qutos doubles peuvent être utilisés en toute sécurité dans une chaîne
littérale
Format chaîne
Les chaînes de format peuvent être utilisées avec l'opérateur -f ou la méthode static
[String]::Format(string format, args) .NET.
Chaîne multiligne
• Vous pouvez utiliser les caractères spéciaux pour un retour chariot et / ou une nouvelle ligne
manuellement ou utiliser la variable NewLine pour insérer la valeur "newline" du système.
"Hello`r`nWorld"
"Hello{0}World" -f [environment]::NewLine
"Hello
World"
@"
Hello
World
"@
Chaîne de caractères
Les chaînes ici sont très utiles lors de la création de chaînes multilignes. Un des principaux
avantages par rapport aux autres chaînes multilignes est que vous pouvez utiliser des guillemets
sans avoir à les échapper avec un backtick.
Chaîne de caractères
https://riptutorial.com/fr/home 49
Ici, les chaînes commencent par @" et un saut de ligne et se terminent par "@ sur sa propre ligne (
"@ doit être les premiers caractères de la ligne, même pas les espaces / tab ).
@"
Simple
Multiline string
with "quotes"
"@
Littéral ici-chaîne
Vous pouvez également créer une chaîne de caractères littérale ici en utilisant des guillemets
simples, lorsque vous ne souhaitez pas que des expressions soient développées de la même
manière qu'une chaîne littérale normale.
@'
The following line won't be expanded
$(Get-Date)
because this is a literal here-string
'@
Chaînes concaténantes
$string1 = "Power"
$string2 = "Shell"
"Greetings from $string1$string2"
Utiliser l'opérateur +
https://riptutorial.com/fr/home 50
Utiliser des sous-expressions
Le résultat / résultat d'une sous-expression $() peut être utilisé dans une chaîne. Ceci est utile
pour accéder aux propriétés d'un objet ou effectuer une expression complexe. Les sous-
expressions peuvent contenir plusieurs instructions séparées par un point-virgule ;
"Tomorrow is $((Get-Date).AddDays(1).DayOfWeek)"
Caractères spéciaux
Utilisé dans une chaîne entre guillemets, le caractère d'échappement (backtick ` ) représente un
caractère spécial.
`0 #Null
`a #Alert/Beep
`b #Backspace
`f #Form feed (used for printer output)
`n #New line
`r #Carriage return
`t #Horizontal tab
`v #Vertical tab (used for printer output)
Exemple:
Vous pouvez également échapper à des caractères spéciaux ayant des significations spéciales:
`# #Comment-operator
`$ #Variable operator
`` #Escape character
`' #Single quote
`" #Double quote
https://riptutorial.com/fr/home 51
Chapitre 18: Création de ressources DSC
basées sur les classes
Introduction
À partir de PowerShell version 5.0, vous pouvez utiliser les définitions de classe PowerShell pour
créer des ressources DSC (Desired State Configuration).
Pour vous aider à créer une ressource DSC, il existe un [DscResource()] appliqué à la définition de
classe et une [DscProperty()] pour désigner les propriétés configurables par l'utilisateur de
ressource DSC.
Remarques
Une ressource DSC basée sur une classe doit:
Après avoir créé une ressource DSC PowerShell basée sur une classe, celle-ci doit être
"exportée" d'un module à l'aide d'un fichier de manifeste de module (.psd1). Dans le manifeste de
module, la DscResourcesToExport hachage DscResourcesToExport est utilisée pour déclarer un tableau
de ressources DSC (noms de classe) à "exporter" à partir du module. Cela permet aux
consommateurs du module DSC de "voir" les ressources basées sur les classes à l'intérieur du
module.
Examples
Créer une classe de squelette de ressource DSC
[DscResource()]
class File {
}
Cet exemple montre comment créer la section externe d'une classe PowerShell, qui déclare une
ressource DSC. Vous devez toujours remplir le contenu de la définition de classe.
[DscResource()]
class Ticket {
https://riptutorial.com/fr/home 52
[DscProperty(Key)]
[string] $TicketId
}
Une ressource DSC doit déclarer au moins une propriété clé. La propriété clé est ce qui identifie
de manière unique la ressource des autres ressources. Par exemple, supposons que vous
construisiez une ressource DSC qui représente un ticket dans un système de tickets. Chaque
ticket serait représenté de manière unique avec un identifiant de ticket.
Chaque propriété qui sera exposée à l' utilisateur de la ressource DSC doit être décorée avec l'
[DscProperty()] . Cet attribut accepte un paramètre key pour indiquer que la propriété est un
attribut clé de la ressource DSC.
[DscResource()]
class Ticket {
[DscProperty(Key)]
[string] $TicketId
[DscProperty(Mandatory)]
[string] $Subject
}
Lors de la création d'une ressource DSC, vous constaterez souvent que chaque propriété ne doit
pas nécessairement être obligatoire. Toutefois, vous devez vous assurer que certaines propriétés
principales sont configurées par l'utilisateur de la ressource DSC. Vous utilisez le paramètre
Mandatory de l' [DscResource()] pour déclarer une propriété comme requis par l'utilisateur de la
ressource DSC.
Dans l'exemple ci-dessus, nous avons ajouté une propriété Subject à une ressource Ticket , qui
représente un ticket unique dans un système de tickets et l'a désignée comme une propriété
Mandatory .
[DscResource()]
class Ticket {
[DscProperty(Key)]
[string] $TicketId
[void] Set() {
# Create or update the resource
}
https://riptutorial.com/fr/home 53
[Ticket] Get() {
# Return the resource's current state as an object
$TicketState = [Ticket]::new()
return $TicketState
}
[bool] Test() {
# Return $true if desired state is met
# Return $false if desired state is not met
return $false
}
}
Il s'agit d'une ressource DSC complète qui illustre toutes les exigences de base pour créer une
ressource valide. Les implémentations de méthode ne sont pas complètes, mais sont fournies
dans le but de montrer la structure de base.
https://riptutorial.com/fr/home 54
Chapitre 19: Déclaration de changement
Introduction
Une instruction switch permet de tester l’égalité d’une variable par rapport à une liste de valeurs.
Chaque valeur est appelée un cas et la variable activée est vérifiée pour chaque cas de
commutation. Cela vous permet d'écrire un script qui peut choisir parmi une série d'options, mais
sans vous obliger à écrire une longue série d'instructions if.
Remarques
Cette rubrique documente l' instruction switch utilisée pour brancher le flux du script. Ne le
confondez pas avec les paramètres de commutateur utilisés dans les fonctions comme
indicateurs booléens.
Examples
Commutateur simple
Les instructions de commutateur comparent une seule valeur de test à plusieurs conditions et
effectuent toutes les actions associées pour des comparaisons réussies. Cela peut entraîner
plusieurs correspondances / actions.
switch($myValue)
{
'First Condition' { 'First Action' }
'Second Condition' { 'Second Action' }
}
'First Action' sera $myValue si $myValue est défini comme 'First Condition' .
'Section Action' sera $myValue si $myValue est défini comme 'Second Condition' .
Le paramètre -Regex permet aux instructions switch d'effectuer une correspondance d'expressions
régulières par rapport aux conditions.
Exemple:
https://riptutorial.com/fr/home 55
'Con\D+ion' {'One or more non-digits'}
'Conditio*$' {'Zero or more "o"'}
'C.ndition' {'Any single char.'}
'^C\w+ition$' {'Anchors and one or more word chars.'}
'Test' {'No match'}
}
Sortie:
Le mot-clé break peut être utilisé dans les instructions switch pour quitter l'instruction avant
d'évaluer toutes les conditions.
Exemple:
switch('Condition')
{
'Condition'
{
'First Action'
}
'Condition'
{
'Second Action'
break
}
'Condition'
{
'Third Action'
}
}
Sortie:
First Action
Second Action
En raison du mot-clé break dans la seconde action, la troisième condition n'est pas évaluée.
Exemple:
https://riptutorial.com/fr/home 56
{
'Condition' {'Normal match'}
'Condit*' {'Zero or more wildcard chars.'}
'C[aoc]ndit[f-l]on' {'Range and set of chars.'}
'C?ndition' {'Single char. wildcard'}
'Test*' {'No match'}
}
Sortie:
Normal match
Zero or more wildcard chars.
Range and set of chars.
Single char. wildcard
Le paramètre -Exact applique les instructions de commutateur pour effectuer une correspondance
exacte, insensible à la casse, par rapport aux conditions de chaîne.
Exemple:
Sortie:
First Action
Second Action
Third Action
Les première à troisième actions sont exécutées car leurs conditions associées correspondent à
l'entrée. Les chaînes regex et wildcard dans les quatrième et cinquième conditions échouent à la
correspondance.
Exemple:
https://riptutorial.com/fr/home 57
switch -CaseSensitive ('Condition')
{
'condition' {'First Action'}
'Condition' {'Second Action'}
'conditioN' {'Third Action'}
}
Sortie:
Second Action
La seconde action est la seule action exécutée car c'est la seule condition qui correspond
exactement à la chaîne 'Condition' lors de la prise en compte de la sensibilité à la casse.
Le paramètre -file permet à l'instruction switch de recevoir les entrées d'un fichier. Chaque ligne
du fichier est évaluée par l'instruction switch.
condition
test
Sortie:
First Action
Second Action
Le mot-clé Default est utilisé pour exécuter une action lorsqu'aucune autre condition ne
correspond à la valeur d'entrée.
Exemple:
switch('Condition')
{
'Skip Condition'
{
'First Action'
}
https://riptutorial.com/fr/home 58
'Skip This Condition Too'
{
'Second Action'
}
Default
{
'Default Action'
}
}
Sortie:
Default Action
$myInput = 0
switch($myInput) {
# because the result of the expression, 4,
# does not equal our input this block should not be run.
(2+2) { 'True. 2 +2 = 4' }
#Output
True. 2-2 = 0
True. Value is 0
https://riptutorial.com/fr/home 59
Chapitre 20: Envoi d'email
Introduction
Une technique utile pour les administrateurs Exchange Server consiste à pouvoir envoyer des
messages électroniques via SMTP à partir de PowerShell. Selon la version de PowerShell
installée sur votre ordinateur ou votre serveur, il existe plusieurs façons d'envoyer des e-mails via
powershell. Il existe une option d’applet de commande native simple et facile à utiliser. Il utilise
l'applet de commande Send-MailMessage .
Paramètres
Paramètre Détails
Les adresses e-mail qui reçoivent une copie d'un e-mail mais
n'apparaissent pas en tant que destinataire dans le message.
Cci <String []> Entrez des noms (facultatif) et l'adresse e-mail (obligatoire), par
exemple Nom de [email protected] ou
quelqu'[email protected].
https://riptutorial.com/fr/home 60
Paramètre Détails
OEM.
Port alternatif sur le serveur SMTP. La valeur par défaut est 25.
Port
Disponible à partir de Windows PowerShell 3.0.
Examples
Message d'envoi simple
$parameters = @{
From = '[email protected]'
To = '[email protected]'
Subject = 'Email Subject'
Attachments = @('C:\files\samplefile1.txt','C:\files\samplefile2.txt')
BCC = '[email protected]'
Body = 'Email body'
BodyAsHTML = $False
CC = '[email protected]'
Credential = Get-Credential
DeliveryNotificationOption = 'onSuccess'
Encoding = 'UTF8'
Port = '25'
Priority = 'High'
https://riptutorial.com/fr/home 61
SmtpServer = 'smtp.com'
UseSSL = $True
}
function Send_mail {
#Define Email settings
$EmailFrom = "[email protected]"
$EmailTo = "[email protected]"
$Txt_Body = Get-Content $Txt_File -RAW
$Body = $Body_Custom + $Txt_Body
$Subject = "Email Subject"
$SMTPServer = "smtpserver.domain.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
$SMTPClient.EnableSsl = $false
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
Send_mail
https://riptutorial.com/fr/home 62
Chapitre 21: Executables en cours
d'exécution
Examples
Applications de console
PS> console_app.exe
PS> & console_app.exe
PS> Start-Process console_app.exe
Applications GUI
Flux de console
PowerShell comprend ces flux: Output, Error, Warning, Verbose, Debug, Progress. Les
applications natives utilisent généralement uniquement ces flux: Output, Error, Warning.
Dans PowerShell 5, tous les flux peuvent être redirigés vers le flux de sortie / succès standard (6).
Dans les versions antérieures de PowerShell, seuls des flux spécifiques pouvaient être redirigés
https://riptutorial.com/fr/home 63
vers le flux de sortie / succès standard (7). Dans cet exemple, le "flux d'erreur" sera redirigé vers
le flux de sortie.
Codes de sortie
PS> $LastExitCode
PS> $?
PS> $Error[0]
Ce sont des variables PowerShell intégrées qui fournissent des informations supplémentaires sur
l'erreur la plus récente. $LastExitCode est le code de sortie final de la dernière application native
exécutée. $? et $Error[0] est le dernier enregistrement d'erreur généré par PowerShell.
https://riptutorial.com/fr/home 64
Chapitre 22: Expressions régulières
Syntaxe
• 'texte' -match 'RegExPattern'
• 'text' -replace 'RegExPattern', 'newvalue'
• [regex] :: Match ("text", "pattern") # Match unique
• [regex] :: Matches ("text", "pattern") # Correspondances multiples
• [regex] :: Remplacer ("text", "pattern", "newvalue")
• [regex] :: Remplacer ("text", "pattern", {param ($ m)}) #MatchEvaluator
• [regex] :: Escape ("input") #Escape des caractères spéciaux
Examples
Match unique
Vous pouvez rapidement déterminer si un texte inclut un motif spécifique à l'aide de Regex. Il
existe plusieurs façons de travailler avec Regex dans PowerShell.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
> $Matches
Name Value
---- -----
0 (a)
Vous pouvez également utiliser -match pour filtrer un tableau de chaînes et renvoyer uniquement
https://riptutorial.com/fr/home 65
les chaînes contenant une correspondance.
2.0
Utilisation de Select-String
PowerShell 2.0 a introduit une nouvelle applet de commande pour parcourir le texte en utilisant
regex. Il renvoie un objet MatchInfo par entrée de texte contenant une correspondance. Vous
pouvez accéder à ses propriétés pour trouver des groupes correspondants, etc.
> $m
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
Comme -match , Select-String peut également être utilisé pour filtrer un tableau de chaînes en y
insérant un tableau. Il crée un MatchInfo MatchInfo par chaîne comprenant une correspondance.
IgnoreCase : True
LineNumber : 1
https://riptutorial.com/fr/home 66
Line : This is (a) sample
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
IgnoreCase : True
LineNumber : 3
Line : a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(sample text)}
Select-String peut également rechercher en utilisant un modèle de texte normal (pas de regex) en
ajoutant le commutateur -SimpleMatch .
> [regex]::Match($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
Remplacer
Une tâche courante pour regex consiste à remplacer le texte qui correspond à un modèle par une
nouvelle valeur.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
https://riptutorial.com/fr/home 67
Utilisation de l'opérateur -Replace
L'opérateur -replace dans PowerShell peut être utilisé pour remplacer le texte correspondant à un
motif par une nouvelle valeur en utilisant la syntaxe 'input' -replace 'pattern', 'newvalue' .
Parfois, vous devez remplacer une valeur correspondant à un modèle par une nouvelle valeur
basée sur cette correspondance spécifique, ce qui rend impossible la prédiction de la nouvelle
valeur. Pour ces types de scénarios, un MatchEvaluator peut être très utile.
Dans PowerShell, un MatchEvaluator est aussi simple qu'un bloc de script avec un seul paramètre
contenant un objet Match pour la correspondance en cours. La sortie de l'action sera la nouvelle
valeur pour cette correspondance spécifique. MatchEvalutor peut être utilisé avec la méthode
statique [Regex]::Replace() .
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
$MatchEvalutor = {
param($match)
https://riptutorial.com/fr/home 68
}
Sortie:
This is 1 sample
text, this is
a 11
$MatchEvalutor = {
param($match)
Sortie:
Un motif regex utilise de nombreux caractères spéciaux pour décrire un motif. Ex., . signifie "tout
caractère", + est "un ou plusieurs" etc.
Pour utiliser ces caractères, sous forme de . , + Etc., dans un modèle, vous devez les échapper
pour enlever leur signification particulière. Ceci est fait en utilisant le caractère d'échappement qui
est une barre oblique inverse \ dans l'expression régulière. Exemple: Pour rechercher + , vous
utiliseriez le pattern \+ .
Il peut être difficile de se souvenir de tous les caractères spéciaux dans regex. Pour échapper à
tous les caractères spéciaux d'une chaîne que vous souhaitez rechercher, vous pouvez utiliser la
méthode [RegEx]::Escape("input") .
> [regex]::Escape("(foo)")
\(foo\)
> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2
https://riptutorial.com/fr/home 69
Plusieurs correspondances
Il existe plusieurs façons de rechercher toutes les correspondances pour un motif dans un texte.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
Utilisation de Select-String
Vous pouvez trouver toutes les correspondances (correspondance globale) en ajoutant le
commutateur -AllMatches à Select-String .
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a), (sample text)}
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
https://riptutorial.com/fr/home 70
Utiliser [RegEx] :: Matches ()
La méthode Matches() de la classe .NET `[regex] peut également être utilisée pour effectuer une
recherche globale de plusieurs correspondances.
> [regex]::Matches($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
(a)
(sample text)
https://riptutorial.com/fr/home 71
Chapitre 23: Flux de travail PowerShell
Introduction
PowerShell Workflow est une fonctionnalité qui a été introduite à partir de PowerShell version 3.0.
Les définitions de flux de travail ressemblent beaucoup aux définitions de fonction PowerShell,
mais elles s'exécutent dans l'environnement Windows Workflow Foundation, et non directement
dans le moteur PowerShell.
Le moteur de workflow comprend plusieurs fonctionnalités uniques, telles que la persistance des
tâches.
Remarques
La fonctionnalité de workflow PowerShell est exclusivement prise en charge sur la plate-forme
Microsoft Windows, sous PowerShell Desktop Edition. PowerShell Core Edition, qui est pris en
charge sous Linux, Mac et Windows, ne prend pas en charge la fonctionnalité PowerShell
Workflow.
Lors de la création d'un workflow PowerShell, gardez à l'esprit que les workflows appellent des
activités, pas des applets de commande. Vous pouvez toujours appeler des applets de commande
à partir d'un workflow PowerShell, mais le moteur de workflow InlineScript implicitement l'appel
de la cmdlet dans une activité InlineScript . Vous pouvez également explicitement envelopper le
code à l'intérieur de l'activité InlineScript , qui exécute le code PowerShell; Par défaut, l'activité
InlineScript s'exécute dans un processus distinct et renvoie le résultat au workflow appelant.
Examples
Exemple de workflow simple
workflow DoSomeWork {
Get-Process -Name notepad | Stop-Process
}
Tout comme les fonctions PowerShell, les flux de travail peuvent accepter des paramètres
d'entrée. Les paramètres d'entrée peuvent éventuellement être liés à un type de données
spécifique, tel qu'une chaîne, un entier, etc. Utilisez le mot-clé param standard pour définir un bloc
de paramètres d'entrée, directement après la déclaration de workflow.
workflow DoSomeWork {
param (
https://riptutorial.com/fr/home 72
[string[]] $ComputerName
)
Get-Process -ComputerName $ComputerName
}
workflow DoSomeWork {
Get-Process -ComputerName server01
Get-Process -ComputerName server02
Get-Process -ComputerName server03
}
DoSomeWork -AsJob
workflow DoSomeWork {
parallel {
Get-Process -ComputerName server01
Get-Process -ComputerName server02
Get-Process -ComputerName server03
}
}
L'une des fonctionnalités uniques de PowerShell Workflow est la possibilité de définir un bloc
d'activités en parallèle. Pour utiliser cette fonctionnalité, utilisez le mot-clé parallel dans votre
workflow.
L'appel des activités de workflow en parallèle peut aider à améliorer les performances de votre
flux de travail.
https://riptutorial.com/fr/home 73
Chapitre 24: Fonctions PowerShell
Introduction
Une fonction est essentiellement un bloc de code nommé. Lorsque vous appelez le nom de la
fonction, le bloc de script de cette fonction s'exécute. C'est une liste d'instructions PowerShell qui
porte un nom que vous attribuez. Lorsque vous exécutez une fonction, vous tapez le nom de la
fonction. C'est une méthode permettant de gagner du temps lors de tâches répétitives.
PowerShell formate en trois parties: le mot-clé 'Fonction', suivi d'un nom, enfin, la charge utile
contenant le bloc de script, entre crochets / parenthèses.
Examples
Fonction simple sans paramètre
Ceci est un exemple de fonction qui renvoie une chaîne. Dans l'exemple, la fonction est appelée
dans une instruction affectant une valeur à une variable. La valeur dans ce cas est la valeur de
retour de la fonction.
function Get-Greeting{
"Hello World"
}
# demonstrate output
$greeting
Get-Greeting
Get-Greeting est le nom de la fonction. Chaque fois que cette fonction doit être utilisée dans le
script, la fonction peut être appelée en l'appelant par son nom.
Si le code ci-dessus est exécuté dans l'ISE, les résultats seraient les suivants:
Hello World
Hello World
Paramètres de base
Une fonction peut être définie avec des paramètres en utilisant le bloc param:
function Write-Greeting {
https://riptutorial.com/fr/home 74
param(
[Parameter(Mandatory,Position=0)]
[String]$name,
[Parameter(Mandatory,Position=1)]
[Int]$age
)
"Hello $name, you are $age years old."
}
Remarque: les paramètres de moulage ne sont requis dans aucun type de définition de
paramètre.
La syntaxe de fonction simple (SFS) a des capacités très limitées par rapport au bloc param.
Bien que vous puissiez définir des paramètres à exposer dans la fonction, vous ne pouvez pas
spécifier d' attributs de paramètre , utiliser la validation de paramètre , inclure [CmdletBinding()] ,
avec SFS (et cette liste n'est pas exhaustive).
Les fonctions peuvent être appelées avec des paramètres ordonnés ou nommés.
L'ordre des paramètres sur l'invocation correspond à l'ordre de la déclaration dans l'en-tête de
fonction (par défaut) ou peut être spécifié à l'aide de l'attribut de paramètre de Position (comme
illustré dans l'exemple de fonction avancée ci-dessus).
Alternativement, cette fonction peut être appelée avec des paramètres nommés
Paramètres obligatoires
function Get-Greeting{
param
(
[Parameter(Mandatory=$true)]$name
)
"Hello World $name"
}
$greeting = Get-Greeting
https://riptutorial.com/fr/home 75
cmdlet Get-Greeting at command pipeline position 1
Supply values for the following parameters:
name:
Fonction avancée
Ceci est une copie de l'extrait de fonctions avancées de Powershell ISE. Fondamentalement, il
s’agit d’un modèle pour un grand nombre de choses que vous pouvez utiliser avec les fonctions
avancées de Powershell. Points clés à noter:
<#
.Synopsis
Short description
.DESCRIPTION
Long description
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function Verb-Noun
{
[CmdletBinding(DefaultParameterSetName='Parameter Set 1',
SupportsShouldProcess=$true,
PositionalBinding=$false,
HelpUri = 'http://www.microsoft.com/',
ConfirmImpact='Medium')]
[Alias()]
[OutputType([String])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=0,
https://riptutorial.com/fr/home 76
ParameterSetName='Parameter Set 1')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[ValidateCount(0,5)]
[ValidateSet("sun", "moon", "earth")]
[Alias("p1")]
$Param1,
Begin
{
}
Process
{
if ($pscmdlet.ShouldProcess("Target", "Operation"))
{
}
}
End
{
}
}
Au lieu d'écrire du code dans les fonctions ou les scripts pour valider les valeurs des paramètres,
ces paramètres lanceront si des valeurs non valides sont transmises.
ValidateSet
Parfois, nous devons limiter les valeurs possibles qu'un paramètre peut accepter. Disons que
nous voulons autoriser uniquement le rouge, le vert et le bleu pour le paramètre $Color dans un
script ou une fonction.
Nous pouvons utiliser l'attribut de paramètre ValidateSet pour limiter cela. Il présente l'avantage
supplémentaire de permettre la complétion de tabulation lors de la définition de cet argument
(dans certains environnements).
https://riptutorial.com/fr/home 77
param(
[ValidateSet('red','green','blue',IgnoreCase)]
[string]$Color
)
ValiderRange
Cette méthode de validation des paramètres prend une valeur min et max Int32 et nécessite que
le paramètre soit compris dans cette plage.
param(
[ValidateRange(0,120)]
[Int]$Age
)
ValidatePattern
Cette méthode de validation des paramètres accepte les paramètres correspondant au modèle de
regex spécifié.
param(
[ValidatePattern("\w{4-6}\d{2}")]
[string]$UserName
)
ValidateLength
Cette méthode de validation des paramètres teste la longueur de la chaîne transmise.
param(
[ValidateLength(0,15)]
[String]$PhoneNumber
)
ValidateCount
Cette méthode de validation des paramètres teste la quantité d'arguments transmis, par exemple,
un tableau de chaînes.
param(
[ValidateCount(1,5)]
[String[]]$ComputerName
)
ValidateScript
https://riptutorial.com/fr/home 78
Enfin, la méthode ValidateScript est extraordinairement flexible, prenant un scriptblock et
l’évaluant en utilisant $ _ pour représenter l’argument passé. Il passe ensuite l'argument si le
résultat est $ true (y compris toute sortie valide).
param(
[ValidateScript({Test-Path $_})]
[IO.FileInfo]$Path
)
param(
[ValidateScript({Get-ADUser $_})]
[String]$UserName
)
Et à peu près tout ce que vous pouvez écrire (car cela ne se limite pas aux oneliners):
param(
[ValidateScript({
$AnHourAgo = (Get-Date).AddHours(-1)
if ($_ -lt $AnHourAgo.AddMinutes(5) -and $_ -gt $AnHourAgo.AddMinutes(-5)) {
$true
} else {
throw "That's not within five minutes. Try again."
}
})]
[String]$TimeAboutAnHourAgo
)
https://riptutorial.com/fr/home 79
Chapitre 25: Gestion des paquets
Introduction
PowerShell Package Management vous permet de rechercher, d'installer, de mettre à jour et de
désinstaller des modules PowerShell et d'autres packages.
PowerShellGallery.com est la source par défaut pour les modules PowerShell. Vous pouvez
également parcourir le site pour rechercher les packages disponibles, commander et prévisualiser
le code.
Examples
Recherchez un module PowerShell à l'aide d'un motif
Si pour une raison quelconque, le dépôt du module PowerShell par défaut PSGallery se retire.
Vous devrez le créer. Ceci est la commande.
Register-PSRepository -Default
https://riptutorial.com/fr/home 80
Lire Gestion des paquets en ligne: https://riptutorial.com/fr/powershell/topic/8698/gestion-des-
paquets
https://riptutorial.com/fr/home 81
Chapitre 26: Gestion des secrets et des
informations d'identification
Introduction
Dans Powershell, pour éviter de stocker le mot de passe en texte clair, nous utilisons différentes
méthodes de chiffrement et le stockons en tant que chaîne sécurisée. Lorsque vous ne spécifiez
pas de clé ou de clé sécurisée, cela ne fonctionnera que si le même utilisateur sur le même
ordinateur pourra déchiffrer la chaîne chiffrée si vous n'utilisez pas Keys / SecureKeys. Tout
processus exécuté sous ce même compte d'utilisateur pourra déchiffrer cette chaîne chiffrée sur
le même ordinateur.
Examples
Demander des informations d'identification
Pour demander des informations d'identification, vous devez presque toujours utiliser l'applet de
commande Get-Credential :
$credential = Get-Credential
$credential = Get-Credential -Message 'Please enter your company email address and password.'
Le mot de passe dans un objet de référence est un [SecureString] . Le moyen le plus simple est
d'obtenir un [NetworkCredential] qui ne stocke pas le mot de passe crypté:
$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
https://riptutorial.com/fr/home 82
Travailler avec des informations d'identification stockées
$credential = Get-Credential
Pour réimporter:
La chose importante à retenir est que, par défaut, il utilise l'API de protection des données
Windows et que la clé utilisée pour chiffrer le mot de passe est spécifique à l' utilisateur et à la
machine sur laquelle le code est exécuté.
Par conséquent, les informations d'identification cryptées ne peuvent pas être importées
par un utilisateur différent ni par le même utilisateur sur un autre ordinateur.
En plaçant le nom de l'utilisateur et de l'ordinateur dans le nom du fichier, vous pouvez stocker
tous les secrets cryptés de manière à ce que le même code puisse les utiliser sans coder en dur:
Encrypter
# run as each user, and on each computer
$credential = Get-Credential
https://riptutorial.com/fr/home 83
Stockage des informations d'identification sous forme chiffrée et
transmission en tant que paramètre lorsque requis
$username = "[email protected]"
$pwdTxt = Get-Content "C:\temp\Stored_Password.txt"
$securePwd = $pwdTxt | ConvertTo-SecureString
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username,
$securePwd
# Now, $credObject is having the credentials stored and you can pass it wherever you want.
$username = "[email protected]"
$AESKey = Get-Content $AESKeyFilePath
$pwdTxt = Get-Content $SecurePwdFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Key $AESKey
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username,
$securePwd
# Now, $credObject is having the credentials stored with AES Key and you can pass it wherever
you want.
https://riptutorial.com/fr/home 84
Chapitre 27: GUI dans Powershell
Examples
Interface utilisateur WPF pour applet de commande Get-Service
[xml]$XAMLWindow = '
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto"
SizeToContent="WidthAndHeight"
Title="Get-Service">
<ScrollViewer Padding="10,10,10,0" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Margin="10,10,0,10">ComputerName:</Label>
<TextBox Name="Input" Margin="10" Width="250px"></TextBox>
</StackPanel>
<DockPanel>
<Button Name="ButtonGetService" Content="Get-Service" Margin="10"
Width="150px" IsEnabled="false"/>
<Button Name="ButtonClose" Content="Close" HorizontalAlignment="Right"
Margin="10" Width="50px"/>
</DockPanel>
</StackPanel>
</ScrollViewer >
</Window>
'
https://riptutorial.com/fr/home 85
[System.Windows.MessageBox]::Show($_.exception.message,"Error",[System.Windows.MessageBoxButton]::OK,[S
}
})
Cela crée une fenêtre de dialogue qui permet à l'utilisateur de sélectionner un nom d'ordinateur,
puis affiche une table de services et leurs états sur cet ordinateur.
Cet exemple utilise WPF plutôt que Windows Forms.
https://riptutorial.com/fr/home 86
Chapitre 28: HashTables
Introduction
Une table de hachage est une structure qui mappe les clés aux valeurs. Voir la table de hachage
pour plus de détails.
Remarques
Un concept important qui repose sur les tables de hachage est la fragmentation . C'est très utile
pour faire un grand nombre d'appels avec des paramètres répétitifs.
Examples
Créer une table de hachage
$hashTable = @{}
$hashTable = @{
Name1 = 'Value'
Name2 = 'Value'
Name3 = 'Value3'
}
Un exemple de définition d'une table de hachage et d'accès à une valeur par la clé
$hashTable = @{
Key1 = 'Value1'
Key2 = 'Value2'
}
$hashTable.Key1
#output
Value1
Exemple d'accès à une clé comportant des caractères non valides pour un nom de propriété:
$hashTable = @{
'Key 1' = 'Value3'
Key2 = 'Value4'
}
$hashTable.'Key 1'
https://riptutorial.com/fr/home 87
#Output
Value3
$hashTable = @{
Key1 = 'Value1'
Key2 = 'Value2'
}
foreach($key in $hashTable.Keys)
{
$value = $hashTable.$key
Write-Output "$key : $value"
}
#Output
Key1 : Value1
Key2 : Value2
Par exemple, pour ajouter une clé "Key2" avec une valeur "Value2" à la table de hachage, en
utilisant l'opérateur d'addition:
$hashTable = @{
Key1 = 'Value1'
}
$hashTable += @{Key2 = 'Value2'}
$hashTable
#Output
Name Value
---- -----
Key1 Value1
Key2 Value2
Un exemple, pour ajouter une clé "Key2" avec une valeur de "Value2" à la table de hachage à
l'aide de la méthode Add:
$hashTable = @{
Key1 = 'Value1'
}
$hashTable.Add("Key2", "Value2")
$hashTable
#Output
Name Value
---- -----
Key1 Value1
Key2 Value2
https://riptutorial.com/fr/home 88
Enumérer à travers les clés
Par exemple, pour supprimer une clé "Key2" avec la valeur "Value2" de la table de hachage, à
l'aide de l'opérateur de suppression:
$hashTable = @{
Key1 = 'Value1'
Key2 = 'Value2'
}
$hashTable.Remove("Key2", "Value2")
$hashTable
#Output
Name Value
---- -----
Key1 Value1
https://riptutorial.com/fr/home 89
Chapitre 29: Incorporation de code géré (C # |
VB)
Introduction
Cette rubrique décrit brièvement comment le code géré C # ou VB .NET peut être scripté et utilisé
dans un script PowerShell. Cette rubrique n'explore pas toutes les facettes de l'applet de
commande Add-Type.
Pour plus d'informations sur l'applet de commande Add-Type, consultez la documentation MSDN
(pour 5.1) ici: https://msdn.microsoft.com/en-
us/powershell/reference/5.1/microsoft.powershell.utility/add- type
Paramètres
Paramètre Détails
-TypeDefinition
Accepte le code sous forme de chaîne
<String_>
Remarques
Si vous utilisez Powershell 1.0 et / ou -Language CSharp, le code géré utilisera .NET 2.0, qui
manque de nombreuses fonctionnalités que les développeurs C # utilisent généralement sans y
penser, telles que Generics, Linq et Lambda. En plus de cela, le polymorphisme formel est traité
avec les paramètres par défaut dans les versions ultérieures de C # /. NET.
https://riptutorial.com/fr/home 90
Examples
C # Exemple
Cet exemple montre comment intégrer certains éléments C # de base dans un script PowerShell,
les ajouter à l'espace d'exécution / session et utiliser le code dans la syntaxe PowerShell.
$code = "
using System;
namespace MyNameSpace
{
public class Responder
{
public static void StaticRespond()
{
Console.WriteLine("Static Response");
}
# Check the type has not been previously added within the session, otherwise an exception is
raised
if (-not ([System.Management.Automation.PSTypeName]'MyNameSpace.Responder').Type)
{
Add-Type -TypeDefinition $code -Language CSharp;
}
[MyNameSpace.Responder]::StaticRespond();
Exemple VB.NET
Cet exemple montre comment intégrer certains éléments C # de base dans un script PowerShell,
les ajouter à l'espace d'exécution / session et utiliser le code dans la syntaxe PowerShell.
$code = @"
Imports System
Namespace MyNameSpace
Public Class Responder
Public Shared Sub StaticRespond()
Console.WriteLine("Static Response")
End Sub
https://riptutorial.com/fr/home 91
End Class
End Namespace
"@
# Check the type has not been previously added within the session, otherwise an exception is
raised
if (-not ([System.Management.Automation.PSTypeName]'MyNameSpace.Responder').Type)
{
Add-Type -TypeDefinition $code -Language VisualBasic;
}
[MyNameSpace.Responder]::StaticRespond();
https://riptutorial.com/fr/home 92
Chapitre 30: Introduction à Pester
Remarques
Pester est un framework de test pour PowerShell qui vous permet d'exécuter des scénarios de
test pour votre code PowerShell. Il peut être utilisé pour exécuter ex. tests unitaires pour vous
aider à vérifier que vos modules, scripts, etc. fonctionnent comme prévu.
Examples
Premiers pas avec Pester
Pour commencer à tester le code PowerShell à l'aide du module Pester, vous devez vous
familiariser avec trois mots-clés / commandes:
• Description : Définit un groupe de tests. Tous les fichiers de test Pester nécessitent au
moins un bloc de description.
• Il : Définit un test individuel. Vous pouvez avoir plusieurs blocs It dans un bloc Descripe.
• Devrait : La commande verify / test. Il est utilisé pour définir le résultat qui doit être
considéré comme un test réussi.
Échantillon:
Import-Module Pester
#Group of tests
Describe "Validate Add-Numbers" {
https://riptutorial.com/fr/home 93
Sortie:
https://riptutorial.com/fr/home 94
Chapitre 31: Introduction à Psake
Syntaxe
• Tâche - fonction principale pour exécuter une étape de votre script de construction
• Depends - propriété qui spécifie ce que dépend l'étape actuelle
• default - il doit toujours y avoir une tâche par défaut qui sera exécutée si aucune tâche
initiale n'est spécifiée
• FormatTaskName - spécifie comment chaque étape est affichée dans la fenêtre de résultat.
Remarques
psake est un outil d'automatisation de build écrit en PowerShell, inspiré par Rake (make Ruby) et
Bake (Boo make). Il est utilisé pour créer des builds en utilisant un modèle de dépendance.
Documentation disponible ici
Examples
Contour de base
Task Build {
"Build"
}
Task Clean {
"Clean"
}
Exemple FormatTaskName
https://riptutorial.com/fr/home 95
"Rebuild"
}
Task Build {
"Build"
}
Task Clean {
"Clean"
}
propreties {
$isOk = $false
}
# By default the Build task won't run, unless there is a param $true
Task Build -precondition { return $isOk } {
"Build"
}
Task Clean {
"Clean"
}
ContinueOnError
https://riptutorial.com/fr/home 96
Chapitre 32: Jeux de paramètres
Introduction
Les jeux de paramètres servent à limiter la combinaison possible de paramètres ou à appliquer
des paramètres lorsque 1 ou plusieurs paramètres sont sélectionnés.
Examples
Jeux de paramètres simples
function myFunction
{
param(
# If parameter 'a' is used, then 'c' is mandatory
# If parameter 'b' is used, then 'c' is optional, but allowed
# You can use parameter 'c' in combination with either 'a' or 'b'
# 'a' and 'b' cannot be used together
[parameter(ParameterSetName="AandC", mandatory=$true)]
[switch]$a,
[parameter(ParameterSetName="BandC", mandatory=$true)]
[switch]$b,
[parameter(ParameterSetName="AandC", mandatory=$true)]
[parameter(ParameterSetName="BandC", mandatory=$false)]
[switch]$c
)
# $PSCmdlet.ParameterSetName can be used to check which parameter set was used
Write-Host $PSCmdlet.ParameterSetName
}
# Valid syntaxes
myFunction -a -c
# => "Parameter set : AandC"
myFunction -b -c
# => "Parameter set : BandC"
myFunction -b
# => "Parameter set : BandC"
# Invalid syntaxes
myFunction -a -b
# => "Parameter set cannot be resolved using the specified named parameters."
myFunction -a
# => "Supply values for the following parameters:
# c:"
Lorsque vous voulez par exemple, utilisez le paramètre Password si le paramètre User est fourni.
https://riptutorial.com/fr/home 97
(et vice versa)
Function Do-Something
{
Param
(
[Parameter(Mandatory=$true)]
[String]$SomeThingToDo,
[Parameter(ParameterSetName="Credentials", mandatory=$false)]
[String]$Computername = "LocalHost",
[Parameter(ParameterSetName="Credentials", mandatory=$true)]
[String]$User,
[Parameter(ParameterSetName="Credentials", mandatory=$true)]
[SecureString]$Password
)
#Do something
}
# This will not work he will ask for user and password
Do-Something -SomeThingToDo 'get-help about_Functions_Advanced' -ComputerName
Function Do-Something
{
Param
(
[Parameter(Mandatory=$true)]
[String]$SomeThingToDo,
[Parameter(ParameterSetName="Silently", mandatory=$false)]
[Switch]$Silently,
[Parameter(ParameterSetName="Loudly", mandatory=$false)]
[Switch]$Loudly
)
#Do something
}
# This will not work because you can not use the combination Silently and Loudly
Do-Something -SomeThingToDo 'get-help about_Functions_Advanced' -Silently -Loudly
https://riptutorial.com/fr/home 98
Chapitre 33: La gestion des erreurs
Introduction
Cette rubrique traite des types d'erreur et de la gestion des erreurs dans PowerShell.
Examples
Types d'erreur
Une erreur est une erreur, on pourrait se demander comment il pourrait y avoir des types dedans.
Eh bien, avec Powershell, l’erreur tombe en gros sur deux critères:
• Erreur de terminaison
• Erreur non terminale
Comme son nom l'indique, les erreurs de terminaison mettront fin à l'exécution et une erreur de
non-terminaison laissera l'exécution continuer à l'instruction suivante.
Cela est vrai en supposant que la valeur $ ErrorActionPreference est par défaut
(Continue). $ ErrorActionPreference est une variable Prefrence qui indique à
Powershell ce qu'il faut faire en cas d'erreur "non terminante".
Erreur de terminaison
Une erreur de terminaison peut être traitée avec une prise d'essai typique, comme ci-dessous
Try
{
Write-Host "Attempting Divide By Zero"
1/0
}
Catch
{
Write-Host "A Terminating Error: Divide by Zero Caught!"
}
Une erreur de non-terminaison dans l'autre main ne sera pas interceptée par défaut dans le bloc
catch. La raison en est une erreur de non-terminaison n'est pas considérée comme une erreur
critique.
Try
{
Stop-Process -Id 123456
https://riptutorial.com/fr/home 99
}
Catch
{
Write-Host "Non-Terminating Error: Invalid Process ID"
}
Si vous exécutez la ligne ci-dessus, vous n'obtiendrez pas la sortie du bloc catch puisque l'erreur
n'est pas considérée comme critique et que l'exécution continuera simplement à partir de la
commande suivante. Cependant, l'erreur sera affichée dans la console. Pour gérer une erreur de
non-terminaison, vous devez simplement modifier la préférence d'erreur.
Try
{
Stop-Process -Id 123456 -ErrorAction Stop
}
Catch
{
"Non-Terminating Error: Invalid Process ID"
}
Maintenant, avec la préférence d'erreur mise à jour, cette erreur sera considérée comme une
erreur de terminaison et sera interceptée dans le bloc catch.
La cmdlet Write-Error écrit simplement l'erreur dans le programme hôte invoquant. Cela n'arrête
pas l'exécution. Où comme lancer vous donnera une erreur de fin et arrêter l'exécution
https://riptutorial.com/fr/home 100
Chapitre 34: Les opérateurs
Introduction
Un opérateur est un caractère qui représente une action. Il indique au compilateur / interprète
d'effectuer des opérations mathématiques, relationnelles ou logiques spécifiques et de produire un
résultat final. PowerShell interprète de manière spécifique et classe en conséquence, comme les
opérateurs arithmétiques effectuent des opérations principalement sur les nombres, mais ils
affectent également les chaînes et autres types de données. Avec les opérateurs de base,
PowerShell dispose d'un certain nombre d'opérateurs qui permettent de gagner du temps et de
réduire les efforts de codage (ex: -comme, -match, -remplace, etc.).
Examples
Opérateurs arithmétiques
1 + 2 # Addition
1 - 2 # Subtraction
-1 # Set negative value
1 * 2 # Multiplication
1 / 2 # Division
1 % 2 # Modulus
100 -shl 2 # Bitwise Shift-left
100 -shr 1 # Bitwise Shift-right
Opérateurs logiques
Opérateurs d'affectation
Arithmétique simple:
Incrémenter et décrémenter:
https://riptutorial.com/fr/home 101
$var++ # Increases the value of a variable, assignable property, or array element by 1
$var-- # Decreases the value of a variable, assignable property, or array element by 1
Opérateurs de comparaison
Les opérateurs de comparaison PowerShell se composent d'un tiret ( - ) suivi d'un nom ( eq pour
equal , gt pour greater than , etc.).
Les noms peuvent être précédés de caractères spéciaux pour modifier le comportement de
l'opérateur:
Case-Insensitive est la valeur par défaut si elle n'est pas spécifiée ("a" -eq "A") identique à ("a" -
ieq "A").
"abc", "def" -contains "def" # Returns true when the value (right) is present
# in the array (left)
"abc", "def" -notcontains "123" # Returns true when the value (right) is not present
# in the array (left)
"def" -in "abc", "def" # Returns true when the value (left) is present
# in the array (right)
"123" -notin "abc", "def" # Returns true when the value (left) is not present
# in the array (right)
Opérateurs de redirection
cmdlet > file # Send success output to file, overwriting existing content
cmdlet >> file # Send success output to file, appending to existing content
cmdlet 1>&2 # Send success and error output to error stream
https://riptutorial.com/fr/home 102
Erreur de flux de sortie:
cmdlet 2> file # Send error output to file, overwriting existing content
cmdlet 2>> file # Send error output to file, appending to existing content
cmdlet 2>&1 # Send success and error output to success output stream
cmdlet 3> file # Send warning output to file, overwriting existing content
cmdlet 3>> file # Send warning output to file, appending to existing content
cmdlet 3>&1 # Send success and warning output to success output stream
cmdlet 4> file # Send verbose output to file, overwriting existing content
cmdlet 4>> file # Send verbose output to file, appending to existing content
cmdlet 4>&1 # Send success and verbose output to success output stream
cmdlet 5> file # Send debug output to file, overwriting existing content
cmdlet 5>> file # Send debug output to file, appending to existing content
cmdlet 5>&1 # Send success and debug output to success output stream
cmdlet 6> file # Send information output to file, overwriting existing content
cmdlet 6>> file # Send information output to file, appending to existing content
cmdlet 6>&1 # Send success and information output to success output stream
cmdlet *> file # Send all output streams to file, overwriting existing content
cmdlet *>> file # Send all output streams to file, appending to existing content
cmdlet *>&1 # Send all output streams to success output stream
Les opérateurs de redirection redirigent uniquement les flux vers des fichiers ou des flux vers des
flux. L'opérateur de canalisation achemine un objet dans le pipeline vers une applet de commande
ou la sortie. Le fonctionnement du pipeline diffère en général du fonctionnement de la redirection
et peut être lu lors de l'utilisation du pipeline PowerShell
Pour ajout
https://riptutorial.com/fr/home 103
1,2,3 + "Hello" # Gives 1,2,3,"Hello"
"Hello" + 1,2,3 # Gives "Hello1 2 3"
Pour la multiplication
L'impact peut avoir des conséquences cachées sur les opérateurs de comparaison:
Remplacez l'opérateur:
L'opérateur -replace remplace un motif dans une valeur d'entrée à l'aide d'une expression
régulière. Cet opérateur utilise deux arguments (séparés par une virgule): un modèle d'expression
régulière et sa valeur de remplacement (qui est facultative et une chaîne vide par défaut).
"A B C" -split " " #Returns an array string collection object containing A,B and C.
https://riptutorial.com/fr/home 104
Chapitre 35: Ligne de commande
PowerShell.exe
Paramètres
Paramètre La description
-EncodedCommand
Commandes encodées en base64
<Base64EncodedCommand>
https://riptutorial.com/fr/home 105
Paramètre La description
Examples
Exécuter une commande
-Command <string>
Vous pouvez spécifier des commandes à exécuter lors du lancement sous forme de chaîne. Point-
virgule multiple ; des instructions séparées peuvent être exécutées.
-Command {scriptblock}
Le paramètre -Command prend également en charge une entrée de scriptblock (une ou plusieurs
instructions { #code } accolades { #code } . Cela ne fonctionne que lorsque vous appelez
PowerShell.exe depuis une autre session Windows PowerShell).
https://riptutorial.com/fr/home 106
-Command - (entrée standard)
Vous pouvez passer des commandes à partir de l’entrée standard en utilisant -Command - . L'entrée
standard peut provenir de l' echo , de la lecture d'un fichier, d'une application de console héritée,
etc.
Vous pouvez spécifier un fichier à un ps1 ps1 pour exécuter son contenu lors du lancement à l'aide
du paramètre -File .
Script de base
MyScript.ps1
(Get-Date).ToShortDateString()
"Hello World"
Sortie:
MyScript.ps1
param($Name)
Sortie:
https://riptutorial.com/fr/home 107
First arg: foo
https://riptutorial.com/fr/home 108
Chapitre 36: Logique conditionnelle
Syntaxe
• if (expression) {}
• if (expression) {} else {}
• if (expression) {} elseif (expression) {}
• if (expression) {} elseif (expression) {} else {}
Remarques
Voir aussi Opérateurs de comparaison , utilisables dans les expressions conditionnelles.
Examples
si, sinon et sinon si
Powershell prend en charge les opérateurs de logique conditionnelle standard, comme beaucoup
de langages de programmation. Celles-ci permettent d'exécuter certaines fonctions ou
commandes dans des circonstances particulières.
Avec un if les commandes à l'intérieur des parenthèses ( {} ) ne sont exécutées que si les
conditions à l'intérieur du if ( () ) sont remplies
$test = "test"
if ($test -eq "test"){
Write-Host "if condition met"
}
Vous pouvez aussi faire else . Ici, les commandes else sont exécutées si les conditions if ne sont
pas remplies:
$test = "test"
if ($test -eq "test2"){
Write-Host "if condition met"
}
else{
Write-Host "if condition not met"
}
ou un elseif . Un autre s'exécute les commandes si le if les conditions ne sont pas remplies et
les elseif conditions sont remplies:
$test = "test"
if ($test -eq "test2"){
Write-Host "if condition met"
}
https://riptutorial.com/fr/home 109
elseif ($test -eq "test"){
Write-Host "ifelse condition met"
}
Notez que l'utilisation ci-dessus -eq (égalité) CmdLet et non = ou == comme beaucoup d'autres
langues le font pour l'équité.
Négation
Vous pouvez vouloir annuler une valeur booléenne, c'est-à-dire entrer une instruction if
lorsqu'une condition est fausse plutôt que vraie. Cela peut être fait en utilisant le -Not CmdLet
$test = "test"
if (-Not $test -eq "test2"){
Write-Host "if condition not met"
}
$test = "test"
if (!($test -eq "test2")){
Write-Host "if condition not met"
}
$test = "test"
if ($test -ne "test2"){
Write-Host "variable test is not equal to 'test2'"
}
Si sténographie conditionnelle
Si vous souhaitez utiliser la sténographie, vous pouvez utiliser une logique conditionnelle avec le
raccourci suivant. Seule la chaîne 'false' sera évaluée à true (2.0).
If($boolean){
# this does not run because $boolean is false
Write-Host "Shorthand If conditions can be nice, just make sure they are always boolean."
}
If($string){
# This does run because the string is non-zero length
Write-Host "If the variable is not strictly null or Boolean false, it will evaluate to
true as it is an object or string with length greater than 0."
}
If($emptyString){
https://riptutorial.com/fr/home 110
# This does not run because the string is zero-length
Write-Host "Checking empty strings can be useful as well."
}
If($null){
# This does not run because the condition is null
Write-Host "Checking Nulls will not print this statement."
}
https://riptutorial.com/fr/home 111
Chapitre 37: Module ActiveDirectory
Introduction
Cette rubrique présente certaines des applets de commande de base utilisées dans le module
Active Directory pour PowerShell pour manipuler des utilisateurs, des groupes, des ordinateurs et
des objets.
Remarques
N'oubliez pas que le système d'aide de PowerShell est l'une des meilleures ressources que vous
puissiez éventuellement utiliser.
Toute la documentation d'aide fournira des exemples, de la syntaxe et des paramètres d'aide.
Examples
Module
Utilisateurs
Nouvel utilisateur AD
https://riptutorial.com/fr/home 112
New-ADUser -Name "MarySmith" -GivenName "Mary" -Surname "Smith" -DisplayName "MarySmith" -Path
"CN=Users,DC=Domain,DC=Local"
Groupes
Get-ADGroup -Identity "My-First-Group" #Ensure if group name has space quotes are used
Nouveau groupe AD
Des ordinateurs
Récupérer un ordinateur AD
Objets
https://riptutorial.com/fr/home 113
Déplacer un objet Active Directory
https://riptutorial.com/fr/home 114
Chapitre 38: Module d'archive
Introduction
Le module d'archivage Microsoft.PowerShell.Archive fournit des fonctions pour stocker des fichiers
dans des archives ZIP ( Compress-Archive ) et les extraire ( Expand-Archive ). Ce module est
disponible dans PowerShell 5.0 et supérieur.
Syntaxe
• Expand-Archive / Compress-Archive
• -Chemin
le chemin du ou des fichiers à compresser (Compress-Archive) ou le chemin de
○
• -DestinationPath (optionnel)
Si vous ne fournissez pas ce chemin, l'archive sera créée dans le répertoire de travail
○
Paramètres
Paramètre Détails
Chemin qui est utilisé literaly, les caractères génériques sont pris
LiteralPath
en charge, l' utilisation , pour spécifier des chemins multiples
Et qu'est-ce qui se
Simuler la commande
passerait si
https://riptutorial.com/fr/home 115
Remarques
Voir MSDN Microsoft.PowerShell.Archive (5.1) pour plus d'informations.
Examples
Compresser les archives avec un joker
Cette commande:
• cela va ajouter ou remplacer tous les fichiers Documents.zip avec les nouveaux de
C:\Documents
https://riptutorial.com/fr/home 116
Chapitre 39: Module de tâches planifiées
Introduction
Exemples d'utilisation du module Tâches programmées disponibles dans Windows 8 / Server
2012 et les versions ultérieures.
Examples
Exécuter un script PowerShell dans une tâche planifiée
Crée une tâche planifiée qui s'exécute immédiatement, puis au démarrage pour exécuter
C:\myscript.ps1 tant que SYSTEM
https://riptutorial.com/fr/home 117
Chapitre 40: Module ISE
Introduction
L'environnement de script intégré Windows PowerShell (ISE) est une application hôte qui vous
permet d'écrire, d'exécuter et de tester des scripts et des modules dans un environnement
graphique et intuitif. Les fonctionnalités clés de Windows PowerShell ISE incluent la coloration de
la syntaxe, l'achèvement des tabulations, Intellisense, le débogage visuel, la conformité Unicode
et l'aide contextuelle, et fournissent une expérience de script riche.
Examples
Scripts de test
L'utilisation simple mais puissante de l'ISE consiste par exemple à écrire du code dans la section
supérieure (avec une coloration syntaxique intuitive) et à exécuter le code simplement en le
marquant et en appuyant sur la touche F8.
function Get-Sum
{
foreach ($i in $Input)
{$Sum += $i}
$Sum
1..10 | Get-Sum
#output
55
https://riptutorial.com/fr/home 118
Chapitre 41: Module SharePoint
Examples
Chargement du composant logiciel enfichable SharePoint
Le chargement de SharePoint Snapin peut être effectué en utilisant les éléments suivants:
Add-PSSnapin "Microsoft.SharePoint.PowerShell"
Cela ne fonctionne que dans la version 64 bits de PowerShell. Si la fenêtre indique "Windows
PowerShell (x86)" dans le titre, vous utilisez la version incorrecte.
Si le composant logiciel enfichable est déjà chargé, le code ci-dessus provoquera une erreur.
L'utilisation de ce qui suit ne chargera que si nécessaire, ce qui peut être utilisé dans les applets
de commande / fonctions:
Pour obtenir une liste de toutes les cmdlets SharePoint disponibles, exécutez les opérations
suivantes:
Get-SPFeature peut également être exécuté sur une étendue Web ( -Web <WebUrl> ), une étendue
https://riptutorial.com/fr/home 119
de batterie ( -Farm ) et une étendue d'application Web ( -WebApplication <WebAppUrl> ).
Une autre utilisation de Get-SPFeature peut être de rechercher toutes les fonctionnalités sans
portée:
https://riptutorial.com/fr/home 120
Chapitre 42: Modules Powershell
Introduction
À partir de PowerShell version 2.0, les développeurs peuvent créer des modules PowerShell. Les
modules PowerShell encapsulent un ensemble de fonctionnalités communes. Par exemple, il
existe des modules PowerShell spécifiques aux fournisseurs qui gèrent différents services de
cloud. Il existe également des modules PowerShell génériques qui interagissent avec les services
de médias sociaux et effectuent des tâches de programmation courantes, telles que l'encodage
Base64, l'utilisation de canaux nommés, etc.
Les modules peuvent exposer des alias de commandes, des fonctions, des variables, des
classes, etc.
Examples
Créer un manifeste de module
@{
RootModule = 'MyCoolModule.psm1'
ModuleVersion = '1.0'
CompatiblePSEditions = @('Core')
GUID = '6b42c995-67da-4139-be79-597a328056cc'
Author = 'Bob Schmob'
CompanyName = 'My Company'
Copyright = '(c) 2017 Administrator. All rights reserved.'
Description = 'It does cool stuff.'
FunctionsToExport = @()
CmdletsToExport = @()
VariablesToExport = @()
AliasesToExport = @()
DscResourcesToExport = @()
}
Le fichier manifeste est un fichier de script PowerShell, avec une extension de fichier .psd1 , qui
contient une table de hachage. La table de hachage dans le manifeste doit contenir des clés
spécifiques, afin que PowerShell puisse l’interpréter correctement en tant que fichier de module
PowerShell.
L'exemple ci-dessus fournit une liste des clés HashTable principales qui constituent un manifeste
de module, mais il en existe bien d'autres. La commande New-ModuleManifest vous aide à créer un
nouveau squelette de manifeste de module.
https://riptutorial.com/fr/home 121
function Add {
[CmdletBinding()]
param (
[int] $x
, [int] $y
)
return $x + $y
}
Voici un exemple simple de ce à quoi un fichier de module de script PowerShell peut ressembler.
Ce fichier s'appellera MyCoolModule.psm1 et sera référencé à partir du fichier manifeste du module
(.psd1). Vous remarquerez que la commande Export-ModuleMember nous permet de spécifier les
fonctions du module que nous voulons "exporter" ou exposer à l'utilisateur du module. Certaines
fonctions seront exclusivement internes et ne devraient pas être exposées. Export-ModuleMember
seraient donc omises lors de l'appel à Export-ModuleMember .
$FirstName = 'Bob'
Export-ModuleMember -Variable FirstName
Pour exporter une variable depuis un module, utilisez la commande Export-ModuleMember , avec le
paramètre -Variable . Rappelez-vous cependant que si la variable n'est pas explicitement
exportée dans le fichier manifeste du module (.psd1), la variable ne sera pas visible pour le
consommateur du module. Considérez le module comme un "gatekeeper". Si une fonction ou une
variable n'est pas autorisée dans le manifeste du module, elle ne sera pas visible pour le
consommateur du module.
Remarque: L' exportation d'une variable est similaire à la création d'un champ dans une classe
publique. Ce n'est pas conseillé. Il serait préférable d'exposer une fonction pour obtenir le champ
et une fonction pour définir le champ.
Plutôt que de définir toutes vos fonctions dans un seul fichier de module de script .psm1
PowerShell, vous souhaiterez peut-être séparer votre fonction en fichiers individuels. Vous pouvez
ensuite doter en source ces fichiers de votre fichier de module de script, qui les traite
essentiellement comme s'ils faisaient partie du fichier .psm1 lui-même.
\MyCoolModule
\Functions
Function1.ps1
Function2.ps1
Function3.ps1
MyCoolModule.psd1
MyCoolModule.psm1
https://riptutorial.com/fr/home 122
Dans votre fichier MyCoolModule.psm1 , vous pouvez insérer le code suivant:
Cela source-dot les fichiers de fonction individuels dans le fichier de module .psm1 .
PowerShell recherche les modules dans les répertoires répertoriés dans $ Env: PSModulepath.
Un module appelé foo , dans un dossier appelé foo sera trouvé avec Import-Module foo
Par défaut, seules les fonctions définies dans un module sont visibles en dehors du module. En
d'autres termes, si vous définissez des variables et des alias dans un module, ils ne seront pas
disponibles sauf dans le code du module.
Il est important de noter que si vous utilisez Export-ModuleMember , seuls les éléments que vous
spécifiez seront visibles.
https://riptutorial.com/fr/home 123
Chapitre 43: Modules, scripts et fonctions
Introduction
Les modules PowerShell apportent une extension à l'administrateur système, à l'administrateur de
base de données et au développeur. Que ce soit simplement comme une méthode pour partager
des fonctions et des scripts.
Les fonctions de Powershell évitent les codes de répétition. Voir [Fonctions PS] [1] [1]: Fonctions
PowerShell
Les scripts PowerShell sont utilisés pour automatiser les tâches administratives qui consistent en
un shell de ligne de commande et des applets de commande associées construites au-dessus de
.NET Framework.
Examples
Fonction
Une fonction est un bloc de code nommé utilisé pour définir un code réutilisable facile à utiliser. Il
est généralement inclus dans un script pour aider à réutiliser le code (pour éviter le code en
double) ou distribué dans le cadre d'un module pour le rendre utile pour d'autres dans plusieurs
scripts.
Les fonctions sont créées à l'aide du mot-clé function , suivi d'un nom à mot unique et d'un bloc de
script contenant le code à exécuter lorsque le nom de la fonction est appelé.
function NameOfFunction {
Your code
}
Démo
function HelloWorld {
Write-Host "Greetings from PowerShell!"
}
Usage:
https://riptutorial.com/fr/home 124
> HelloWorld
Greetings from PowerShell!
Scénario
Un script est un fichier texte avec l'extension de fichier .ps1 qui contient des commandes
PowerShell qui seront exécutées lors de l'appel du script. Les scripts étant des fichiers
enregistrés, ils sont faciles à transférer entre les ordinateurs.
Les scripts sont souvent écrits pour résoudre un problème spécifique, par exemple:
Démo
MyFirstScript.ps1:
Vous pouvez exécuter un script en entrant le chemin d'accès au fichier à l'aide de:
Usage:
> .\MyFirstScript.ps1
Hello World!
4
Un script peut également importer des modules, définir ses propres fonctions, etc.
MySecondScript.ps1:
function HelloWorld {
Write-Host "Greetings from PowerShell!"
}
HelloWorld
Write-Host "Let's get started!"
2+2
HelloWorld
Usage:
> .\MySecondScript.ps1
Greetings from PowerShell!
https://riptutorial.com/fr/home 125
Let's get started!
4
Greetings from PowerShell!
Module
Un module est un ensemble de fonctions réutilisables (ou applets de commande) pouvant être
facilement distribuées à d'autres utilisateurs PowerShell et utilisées dans plusieurs scripts ou
directement dans la console. Un module est généralement enregistré dans son propre répertoire
et se compose de:
• Un ou plusieurs fichiers de code avec l'extension de fichier .psm1 contenant des fonctions ou
des assemblys binaires ( .dll ) contenant des applets de commande
• Un manifeste de module .psd1 décrivant le nom du module, la version, l'auteur, la
description, les fonctions / applets de commande qu'il fournit, etc.
• Autres exigences pour que cela fonctionne incl. dépendances, scripts etc.
Exemples de modules:
• Un module contenant des fonctions / cmdlets qui effectuent des statistiques sur un dataset
• Un module pour interroger et configurer des bases de données
Pour faciliter la recherche et l'importation d'un module par PowerShell, il est souvent placé dans
l'un des emplacements de module PowerShell connus définis dans $env:PSModulePath .
Démo
Liste des modules installés sur l'un des emplacements de module connus:
Get-Module -ListAvailable
Import-Module Hyper-V
Fonctions avancées
Les fonctions avancées se comportent de la même manière que les applets de commande. Le
https://riptutorial.com/fr/home 126
PowerShell ISE inclut deux squelettes de fonctions avancées. Accédez à ceux-ci via le menu,
éditer, des extraits de code ou par Ctrl + J. (À partir de PS 3.0, les versions ultérieures peuvent
différer)
Version simple:
<#
.Synopsis
Short description
.DESCRIPTION
Long description
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
#>
function Verb-Noun
{
[CmdletBinding()]
[OutputType([int])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
$Param1,
Begin
{
}
Process
{
}
End
{
}
}
Version complète:
<#
.Synopsis
Short description
.DESCRIPTION
Long description
https://riptutorial.com/fr/home 127
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function Verb-Noun
{
[CmdletBinding(DefaultParameterSetName='Parameter Set 1',
SupportsShouldProcess=$true,
PositionalBinding=$false,
HelpUri = 'http://www.microsoft.com/',
ConfirmImpact='Medium')]
[OutputType([String])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=0,
ParameterSetName='Parameter Set 1')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[ValidateCount(0,5)]
[ValidateSet("sun", "moon", "earth")]
[Alias("p1")]
$Param1,
Begin
{
https://riptutorial.com/fr/home 128
}
Process
{
if ($pscmdlet.ShouldProcess("Target", "Operation"))
{
}
}
End
{
}
}
https://riptutorial.com/fr/home 129
Chapitre 44: MongoDB
Remarques
La partie la plus difficile est d'attacher un sous -document au document qui n'a pas encore été
créé si nous avons besoin que le sous-document ait besoin d'être dans le document attendu
$doc2.add("Key", "Value") au lieu d'utiliser le tableau actuel foreach avec index. Cela fera le sous-
document en deux lignes, comme vous pouvez le voir dans les "Tags" =
[MongoDB.Bson.BsonDocument] $doc2 .
Examples
MongoDB avec le pilote C # 1.7 utilisant PowerShell
Je dois interroger tous les détails de la machine virtuelle et les mettre à jour dans la MongoDB.
$MachinesList # Array
$ResourceList # Array
$MachineTags # Array
pseudo code
https://riptutorial.com/fr/home 130
$mongoDriverPath = 'C:\Program Files (x86)\MongoDB\CSharpDriver 1.7';
Add-Type -Path "$($mongoDriverPath)\MongoDB.Bson.dll";
Add-Type -Path "$($mongoDriverPath)\MongoDB.Driver.dll";
$db = [MongoDB.Driver.MongoDatabase]::Create('mongodb://127.0.0.1:2701/RGrpMachines');
[System.Collections.ArrayList]$TagList = $vm.tags
$A1 = $Taglist.key
$A2 = $Taglist.value
foreach ($Machine in $MachinesList)
{
foreach($Resource in $ResourceList)
{
$doc2 = $null
[MongoDB.Bson.BsonDocument] $doc2 = @{}; #Create a Document here
for($i = 0; $i -lt $TagList.count; $i++)
{
$A1Key = $A1[$i].ToString()
$A2Value = $A2[$i].toString()
$doc2.add("$A1Key", "$A2Value")
}
[MongoDB.Bson.BsonDocument] $doc = @{
"_id"= [MongoDB.Bson.ObjectId]::GenerateNewId();
"ProcessTime"= [MongoDB.Bson.BsonDateTime] $ProcessTime;
"LocalTime" = "$LocalTime";
"Tags" = [MongoDB.Bson.BsonDocument] $doc2;
"ResourceGrp" = "$RGName";
"HostName"= "$VMName";
"Status"= "$VMStatus";
"IPAddress"= "$IPAddress";
"ResourceGroupName"= "$RGName";
"SubscriptionName"= "$CurSubName";
"SubscriptionID"= "$subid";
"OS"= "$OSType";
}; #doc loop close
$collection.Insert($doc);
}
}
https://riptutorial.com/fr/home 131
Chapitre 45: Opérateurs spéciaux
Examples
Opérateur d'expression de tableau
@(Get-ChildItem $env:windir\System32\ntdll.dll)
@(Get-ChildItem $env:windir\System32)
Renvoie un tableau contenant tous les éléments du dossier (ce qui ne constitue pas un
changement de comportement par rapport à l'expression interne).
Appel opération
$command = 'Get-ChildItem'
& $Command
Va exécuter Get-ChildItem
Opérateur de sourcing
. . \ myScript.ps1
.\myScript.ps1 dans la portée actuelle, rendant toutes les fonctions et variables disponibles dans
la portée actuelle.
https://riptutorial.com/fr/home 132
Chapitre 46: Opérations d'ensemble de base
Introduction
Un ensemble est une collection d'éléments qui peuvent être n'importe quoi. Quel que soit
l'opérateur sur lequel nous devons travailler, ces opérateurs sont en somme les opérateurs définis
et l'opération est également appelée opération définie . L’opération de base comprend l’union,
l’intersection ainsi que l’addition, la soustraction, etc.
Syntaxe
• Objet de groupe
• Objet de tri
Examples
Filtrage: Où-Objet / où /?
Synonymes:
https://riptutorial.com/fr/home 133
Where-Object
where
?
Exemple:
Résultats:
Aaron
Albert
Alphonse
Synonymes:
Sort-Object
sort
En supposant:
$names | Sort-Object
$names | sort
Aaron
Aaron
Bernie
Charlie
Danny
Danny
Charlie
https://riptutorial.com/fr/home 134
Bernie
Aaron
Aaron
Aaron
Aaron
Danny
Bernie
Charlie
Synonymes:
Group-Object
group
Exemples:
Réponse:
2 6 {Albert, Bernie}
1 8 {Alphonse}
1 7 {Charlie}
La projection d'une énumération vous permet d'extraire des membres spécifiques de chaque
objet, d'extraire tous les détails ou de calculer des valeurs pour chaque objet.
Synonymes:
https://riptutorial.com/fr/home 135
Select-Object
select
$d | select -first 1 *
PSPath
PSParentPath
PSChildName
PSDrive
PSProvider
PSIsContainer
BaseName
Mode
prénom
Parent
Existe
Racine
Nom complet
Extension
https://riptutorial.com/fr/home 136
Temps de creation
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc
Les attributs
https://riptutorial.com/fr/home 137
Chapitre 47: Paramètres communs
Remarques
Les paramètres communs peuvent être utilisés avec n'importe quelle applet de commande (cela
signifie que dès que vous marquez votre fonction comme une applet de commande [voir
CmdletBinding() ], vous obtenez tous ces paramètres gratuitement).
Voici la liste de tous les paramètres communs (l'alias est entre parenthèses après le paramètre
correspondant):
-Debug (db)
-ErrorAction (ea)
-ErrorVariable (ev)
-InformationAction (ia) # introduced in v5
-InformationVariable (iv) # introduced in v5
-OutVariable (ov)
-OutBuffer (ob)
-PipelineVariable (pv)
-Verbose (vb)
-WarningAction (wa)
-WarningVariable (wv)
-WhatIf (wi)
-Confirm (cf)
Examples
Paramètre ErrorAction
Les valeurs possibles sont Continue | Ignore | Inquire | SilentlyContinue | Stop | Suspend
La valeur de ce paramètre déterminera comment l'applet de commande gérera les erreurs non
terminantes (celles générées à partir de Write-Error, par exemple; pour en savoir plus sur la
gestion des erreurs, voir [ rubrique non encore créée ]).
-ErrorAction Continue
Cette option produira un message d'erreur et continuera avec l'exécution.
https://riptutorial.com/fr/home 138
-ErrorAction Ignore
Cette option ne produira aucun message d'erreur et continuera avec l'exécution. De plus, aucune
erreur ne sera ajoutée à la variable automatique $Error .
Cette option a été introduite dans v3.
-ErrorAction Enquête
Cette option produira un message d'erreur et invitera l'utilisateur à choisir une action à
entreprendre.
-ErrorAction silencieusementContinuer
Cette option ne produira pas de message d'erreur et continuera avec l'exécution. Toutes les
erreurs seront ajoutées à la variable automatique $Error .
-ErrorAction Stop
Cette option produira un message d'erreur et ne continuera pas avec l'exécution.
https://riptutorial.com/fr/home 139
PS C:\> Write-Error "test" -ErrorAction Stop ; Write-Host "Second command"
-ErrorAction Suspend
Disponible uniquement dans les flux de travail Powershell. Lorsqu'il est utilisé, si la commande
rencontre une erreur, le workflow est suspendu. Cela permet de rechercher une telle erreur et
offre la possibilité de reprendre le workflow. Pour en savoir plus sur le système de workflow, voir
[rubrique non encore créée].
https://riptutorial.com/fr/home 140
Chapitre 48: Paramètres dynamiques
PowerShell
Examples
Paramètre dynamique "simple"
function MyTestFunction
{
[CmdletBinding(DefaultParameterSetName='DefaultConfiguration')]
Param
(
[Parameter(Mandatory=$true)][int]$SomeUsefulNumber
)
DynamicParam
{
$paramDictionary = New-Object -Type
System.Management.Automation.RuntimeDefinedParameterDictionary
$attributes = New-Object System.Management.Automation.ParameterAttribute
$attributes.ParameterSetName = "__AllParameterSets"
$attributes.Mandatory = $true
$attributeCollection = New-Object -Type
System.Collections.ObjectModel.Collection[System.Attribute]
$attributeCollection.Add($attributes)
# If "SomeUsefulNumber" is greater than 5, then add the "MandatoryParam1" parameter
if($SomeUsefulNumber -gt 5)
{
# Create a mandatory string parameter called "MandatoryParam1"
$dynParam1 = New-Object -Type
System.Management.Automation.RuntimeDefinedParameter("MandatoryParam1", [String],
$attributeCollection)
# Add the new parameter to the dictionary
$paramDictionary.Add("MandatoryParam1", $dynParam1)
}
return $paramDictionary
}
process
{
Write-Host "SomeUsefulNumber = $SomeUsefulNumber"
# Notice that dynamic parameters need a specific syntax
Write-Host ("MandatoryParam1 = {0}" -f $PSBoundParameters.MandatoryParam1)
}
Usage:
https://riptutorial.com/fr/home 141
SomeUsefulNumber = 3
MandatoryParam1 =
Dans le deuxième exemple d'utilisation, vous pouvez voir clairement qu'un paramètre est
manquant.
Les paramètres dynamiques sont également pris en compte lors de l'achèvement automatique.
Voici ce qui se passe si vous appuyez sur ctrl + espace à la fin de la ligne:
https://riptutorial.com/fr/home 142
Chapitre 49: Postes de travail PowerShell
Introduction
Des travaux ont été introduits dans PowerShell 2.0 et ont permis de résoudre un problème
inhérent aux outils de ligne de commande. En bref, si vous lancez une longue tâche, votre invite
est indisponible jusqu'à la fin de la tâche. À titre d'exemple d'une longue tâche, pensez à cette
simple commande PowerShell:
Il faudra un certain temps pour récupérer la liste complète des répertoires de votre lecteur C :. Si
vous l'exécutez en tant que Job, la console récupérera le contrôle et vous pourrez capturer le
résultat ultérieurement.
Remarques
Les jobs PowerShell s'exécutent dans un nouveau processus. Cela a des avantages et des
inconvénients qui sont liés.
Avantages:
Les inconvénients:
Examples
Création d'emplois de base
https://riptutorial.com/fr/home 143
$job = Start-Job -FilePath "C:\YourFolder\Script.ps1"
Ou
$username = "Domain\Username"
$password = "password"
$secPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,
$secPassword)
Start-Job -ScriptBlock {Get-Process} -Credential $credentials
Gestion de base
Get-Job
Expire un travail s'il est trop long (10 secondes dans cet exemple)
Arrêt d'un travail (termine toutes les tâches en attente dans cette file d'attente avant la fin):
$job | Stop-Job
$job | Remove-Job
Remarque : Les éléments suivants ne fonctionnent que sur les travaux de Workflow .
https://riptutorial.com/fr/home 144
Suspendre un job de Workflow (Pause):
$job | Suspend-Job
$job | Resume-Job
https://riptutorial.com/fr/home 145
Chapitre 50: PowerShell "Streams"; Debug,
Verbose, Warning, Error, Output et
Information
Remarques
https://technet.microsoft.com/en-us/library/hh849921.aspx
Examples
Sortie d'écriture
Write-Output génère une sortie. Cette sortie peut aller à la commande suivante après le pipeline
ou à la console pour être simplement affichée.
La cmdlet envoie des objets dans le pipeline principal, également appelé "flux de sortie" ou
"pipeline de réussite". Pour envoyer des objets d'erreur dans le pipeline d'erreurs, utilisez Write-
Error.
# 2.) Output to the console since Write-Output is the last command in the pipeline
Write-Output 'Hello world'
# 3.) 'Write-Output' CmdLet missing, but the output is still considered to be 'Write-Output'
'Hello world'
1. La cmdlet Write-Output envoie l'objet spécifié dans le pipeline vers la commande suivante.
2. Si la commande est la dernière commande du pipeline, l'objet est affiché dans la console.
3. L'interpréteur PowerShell considère cela comme une écriture en sortie implicite.
Étant donné que le comportement par défaut de Write-Output consiste à afficher les objets à la fin
d'un pipeline, il n'est généralement pas nécessaire d'utiliser la cmdlet. Par exemple, Get-Process |
Write-Output est équivalent à Get-Process .
Préférences d'écriture
https://riptutorial.com/fr/home 146
Write-Debug "Debug Message"
Write-Progress "Progress Message"
Write-Warning "Warning Message"
$VerbosePreference = "SilentlyContinue"
$InformationPreference = "SilentlyContinue"
$DebugPreference = "SilentlyContinue"
$ProgressPreference = "Continue"
$WarningPreference = "Continue"
$InformationPreference = "SilentlyContinue"
Write-Information "This message will not be shown and execution continues"
$InformationPreference = "Continue"
Write-Information "This message is shown and execution continues"
$InformationPreference = "Inquire"
Write-Information "This message is shown and execution will optionally continue"
$InformationPreference = "Stop"
Write-Information "This message is shown and execution terminates"
$host.PrivateData.ErrorBackgroundColor = "Black"
$host.PrivateData.ErrorForegroundColor = "Red"
Lire PowerShell "Streams"; Debug, Verbose, Warning, Error, Output et Information en ligne:
https://riptutorial.com/fr/powershell/topic/3255/powershell--streams---debug--verbose--warning--
error--output-et-information
https://riptutorial.com/fr/home 147
Chapitre 51: Powershell Remoting
Remarques
• about_remote
• about_RemoteFAQ
• about_RemoteDépannage
Examples
Activation de la communication à distance PowerShell
La communication à distance PowerShell doit d'abord être activée sur le serveur auquel vous
souhaitez vous connecter à distance.
Enable-PSRemoting -Force
https://riptutorial.com/fr/home 148
activez l'authentification de base qui envoie vos informations d'identification sur le câble encodé
en base64 (ce qui est fondamentalement le même que du texte brut).
Dans les deux cas, vous devrez ajouter les systèmes distants à votre liste d'hôtes sécurisés
WSMan.
Ensuite , sur l'ordinateur que vous souhaitez connecter à partir, vous devez lui dire de faire
confiance à l'ordinateur que vous vous connectez.
Set-Item WSMan:\localhost\Client\TrustedHosts *
Important : vous devez demander à votre client de faire confiance à l'ordinateur adressé comme
vous le souhaitez (par exemple, si vous vous connectez via IP, il doit faire confiance à l'adresse IP
et non au nom d'hôte).
Enter-PSSession 192.168.1.1
Une fois que la communication à distance Powershell est activée (Enable-PSRemoting) Vous
pouvez exécuter des commandes sur l'ordinateur distant comme ceci:
La méthode ci-dessus crée une session temporaire et la ferme juste après la fin de la commande
ou du scriptblock.
Pour laisser la session ouverte et exécuter d'autres commandes ultérieurement, vous devez
https://riptutorial.com/fr/home 149
d'abord créer une session distante:
Ensuite, vous pouvez utiliser cette session chaque fois que vous invoquez des commandes sur
l'ordinateur distant:
Si vous devez utiliser des informations d'identification différentes, vous pouvez les ajouter avec le
paramètre -Credential :
$Cred = Get-Credential
Invoke-Command -Session $Session -Credential $Cred -ScriptBlock {...}
TypeName: Deserialized.System.Management.ManagementObject#root\cimv2\Win32_Printer
TypeName: System.Management.ManagementObject#root\cimv2\Win32_Printer
https://riptutorial.com/fr/home 150
---- ---------- ----------
Utiliser ArgumentList avec des paramètres non nommés (c'est-à-dire dans l'ordre dans lequel ils
sont passés au scriptblock):
$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ArgumentList $servicesToShow,$fileName -ScriptBlock {
Write-Host "Calling script block remotely with $($Args.Count)"
Get-Service -Name $args[0]
Remove-Item -Path $args[1] -ErrorAction SilentlyContinue -Force
}
$servicesToShow = "service1"
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ArgumentList $servicesToShow,$fileName -ScriptBlock {
Param($serviceToShowInRemoteSession,$fileToDelete)
$servicesToShow = "service1"
https://riptutorial.com/fr/home 151
$fileName = "C:\temp\servicestatus.csv"
Invoke-Command -Session $session -ScriptBlock {
Get-Service $Using:servicesToShow
Remove-Item -Path $fileName -ErrorAction SilentlyContinue -Force
}
Lorsqu'une session distante est créée via l'applet de New-PSsession , la session PSSession se
poursuit jusqu'à la fin de la session PowerShell en cours. Cela signifie que, par défaut, la
PSSession et toutes les ressources associées continueront à être utilisées jusqu'à la fin de la
session PowerShell en cours.
Des PSSessions actives PSSessions peuvent devenir une charge pour les ressources, en particulier
pour les scripts longs ou liés entre eux qui créent des centaines de PSSessions dans une seule
session PowerShell.
Il est PSSession supprimer explicitement chaque PSSession après son utilisation. [1]
Le modèle de code suivant utilise try-catch-finally pour obtenir ce qui précède, en combinant la
gestion des erreurs avec un moyen sécurisé pour s'assurer que toutes les PSSessions créées sont
supprimées lorsqu'elles sont utilisées:
try
{
$session = New-PSsession -Computername "RemoteMachineName"
Invoke-Command -Session $session -ScriptBlock {write-host "This is running on
$ENV:ComputerName"}
}
catch
{
Write-Output "ERROR: $_"
}
finally
{
if ($session)
{
Remove-PSSession $session
}
}
https://riptutorial.com/fr/home 152
Chapitre 52: Profils Powershell
Remarques
Le fichier de profil est un script powershell qui s'exécute au démarrage de la console powershell.
De cette façon, nous pouvons préparer notre environnement à chaque fois que nous commençons
une nouvelle session.
Les choses typiques que nous voulons faire au démarrage de PowerShell sont les suivantes:
• importer des modules que nous utilisons souvent (ActiveDirectory, Exchange, une DLL
spécifique)
• enregistrement
• changer l'invite
• diagnostic
Plusieurs fichiers de profil et emplacements ont des utilisations différentes et une hiérarchie de
l'ordre de démarrage:
Ordre
Hôte Utilisateur Chemin de Variable
départ
% WINDIR% \ System32 \
Tout Tout WindowsPowerShell \ v1.0 \ 1 $ profile.AllUsersAllHosts
profile.ps1
% USERPROFILE% \ Documents \
Tout Actuel 3 $ profile.CurrentUserAllHosts
WindowsPowerShell \ profile.ps1
% WINDIR% \ System32 \
Console Tout WindowsPowerShell \ v1.0 \ 2 $ profile.AllUsersCurrentHost
Microsoft.PowerShell_profile.ps1
% USERPROFILE% \ Documents \
$
Console Actuel WindowsPowerShell \ 4
profile.CurrentUserCurrentHost
Microsoft.PowerShell_profile.ps1
% WINDIR% \ System32 \
ISE Tout WindowsPowerShell \ v1.0 \ 2 $ profile.AllUsersCurrentHost
Microsoft.PowerShellISE_profile.ps1
% USERPROFILE% \ Documents \
$
ISE Actuel WindowsPowerShell \ 4
profile.CurrentUserCurrentHost
Microsoft.PowerShellISE_profile.ps1
https://riptutorial.com/fr/home 153
Examples
Créer un profil de base
Un profil PowerShell est utilisé pour charger automatiquement les variables et les fonctions
définies par l'utilisateur.
Les profils PowerShell ne sont pas automatiquement créés pour les utilisateurs.
Si vous êtes dans ISE, vous pouvez utiliser l'éditeur intégré C:>psEdit $profile
Un moyen simple de commencer avec votre profil personnel pour l'hôte actuel consiste à
enregistrer du texte dans le chemin d'accès stocké dans la variable $profile .
Toute modification ultérieure du profil peut être effectuée à l'aide de PowerShell ISE, du bloc-
notes, du code Visual Studio ou de tout autre éditeur.
La variable $profile renvoie le profil utilisateur actuel par défaut de l'hôte actuel, mais vous
pouvez accéder au chemin d'accès à la règle machine (tous les utilisateurs) et / ou au profil de
tous les hôtes (console, ISE, tiers) en utilisant c'est des propriétés.
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost :
C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\user\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost :
C:\Users\user\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 75
PS> $PROFILE.AllUsersAllHosts
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
https://riptutorial.com/fr/home 154
Chapitre 53: Propriétés calculées
Introduction
Les propriétés calculées dans Powershell sont des propriétés dérivées personnalisées
(calculées). Il permet à l'utilisateur de formater une propriété donnée de la manière qu'il le
souhaite. Le calcul (expression) peut être tout à fait possible.
Examples
Afficher la taille du fichier en Ko - Propriétés calculées
Il génère simplement le contenu du dossier avec les propriétés sélectionnées. Quelque chose
comme,
Que faire si je souhaite afficher la taille du fichier en Ko? C'est là que les propriétés calcifiées sont
utiles.
Qui produit,
L' Expression est ce qui retient le calcul pour la propriété calculée. Et oui, ça peut être n'importe
quoi!
https://riptutorial.com/fr/home 155
Chapitre 54: PSScriptAnalyzer - Analyseur de
script PowerShell
Introduction
PSScriptAnalyzer, https://github.com/PowerShell/PSScriptAnalyzer , est un vérificateur de code
statique pour les modules et les scripts Windows PowerShell. PSScriptAnalyzer vérifie la qualité
du code Windows PowerShell en exécutant un ensemble de règles basées sur les meilleures
pratiques PowerShell identifiées par l'équipe PowerShell et la communauté. Il génère des
résultats de diagnostic (erreurs et avertissements) pour informer les utilisateurs des défauts de
code potentiels et suggère des solutions possibles pour les améliorer.
Syntaxe
1. Get-ScriptAnalyzerRule [-CustomizedRulePath <string[]>] [-Name <string[]>] [-Severity
<string[]>] [<CommonParameters>]
2. Invoke-ScriptAnalyzer [-Path] <string> [-CustomizedRulePath <string[]>] [-ExcludeRule
<string[]>] [-IncludeRule<string[]>] [-Severity <string[]>] [-Recurse] [-SuppressedOnly]
[<CommonParameters>]
Examples
Analyse de scripts avec les ensembles de règles prédéfinis intégrés
ScriptAnalyzer est livré avec des ensembles de règles prédéfinies intégrées pouvant être utilisées
pour analyser les scripts. Ceux-ci incluent: PSGallery , DSC et CodeFormatting . Ils peuvent être
exécutés comme suit:
Règles DSC
https://riptutorial.com/fr/home 156
Invoke-ScriptAnalyzer -Path /path/to/module/ -Settings CodeFormatting -Recurse
Cela analysera votre script par rapport à chaque règle intégrée. Si votre script est suffisamment
volumineux, cela peut entraîner de nombreux avertissements et / ou erreurs.
Pour exécuter l'analyseur de script sur un répertoire entier, spécifiez le dossier contenant les
fichiers script, module et DSC à analyser. Spécifiez le paramètre Recurse si vous souhaitez que
les sous-répertoires soient recherchés pour les fichiers à analyser.
Get-ScriptAnalyzerRule
https://riptutorial.com/fr/home 157
Chapitre 55: Reconnaissance Amazon Web
Services (AWS)
Introduction
Amazon Rekognition est un service qui permet d'ajouter facilement une analyse d'image à vos
applications. Avec Reconnaissance, vous pouvez détecter des objets, des scènes et des visages
dans les images. Vous pouvez également rechercher et comparer des visages. L'API de
Rekognition vous permet d'ajouter rapidement à vos applications une recherche visuelle et une
classification d'images sophistiquées basées sur l'apprentissage en profondeur.
Examples
Détecter les étiquettes d'image avec AWS Rekognition
$BucketName = 'trevorrekognition'
$FileName = 'kitchen.jpg'
$REKResult.Labels
Après avoir exécuté le script ci-dessus, vous devriez avoir les résultats imprimés dans votre hôte
PowerShell qui ressemblent à ceci:
RESULTS:
Confidence Name
---------- ----
86.87605 Indoors
86.87605 Interior Design
86.87605 Room
77.4853 Kitchen
77.25354 Housing
77.25354 Loft
66.77325 Appliance
66.77325 Oven
En utilisant le module AWS PowerShell conjointement avec le service AWS Rekognition, vous
pouvez détecter des étiquettes dans une image, telles que l'identification des objets dans une
pièce, les attributs des photos prises et le niveau de confiance correspondant à chacun de ces
attributs.
La commande Find-REKLabel est celle qui vous permet d'appeler une recherche pour ces attributs /
étiquettes. Bien que vous puissiez fournir un contenu image sous la forme d'un tableau d'octets
lors de l'appel d'API, une meilleure méthode consiste à télécharger vos fichiers image dans un
https://riptutorial.com/fr/home 158
compartiment AWS S3, puis à diriger le service Reconnaissance sur les objets S3 à analyser.
L'exemple ci-dessus montre comment accomplir cela.
$BucketName = 'trevorrekognition'
### Perform a facial comparison between the two photos with AWS Rekognition
$Comparison = @{
SourceImageBucket = $BucketName
TargetImageBucket = $BucketName
SourceImageName = 'myphoto1.jpg'
TargetImageName = 'myphoto2.jpg'
Region = 'us-east-1'
}
$Result = Compare-REKFace @Comparison
$Result.FaceMatches
L'exemple de script fourni ci-dessus devrait vous donner des résultats similaires aux suivants:
Face Similarity
---- ----------
Amazon.Rekognition.Model.ComparedFace 90
Le service AWS Rekognition vous permet d'effectuer une comparaison faciale entre deux photos.
L'utilisation de ce service est assez simple. Il vous suffit de télécharger deux fichiers image que
vous souhaitez comparer sur un compartiment AWS S3. Ensuite, Compare-REKFace commande
Compare-REKFace , similaire à l'exemple ci-dessus. Bien sûr, vous devrez fournir vos propres noms
et noms de fichiers S3 Bucket, uniques au monde.
https://riptutorial.com/fr/home 159
Chapitre 56: requêtes sql powershell
Introduction
En parcourant ce document, vous pouvez apprendre à utiliser les requêtes SQL avec powershell
Paramètres
Article La description
$ Query Nous devons ici à la requête que vous voulez exécuter dans SQ
$ Username & $
UserName et Password qui ont accès à la base de données
Password
Remarques
Vous pouvez utiliser la fonction ci-dessous si vous ne parvenez pas à importer le module SQLPS
function Import-Xls
{
[CmdletBinding(SupportsShouldProcess=$true)]
Param(
[parameter(
mandatory=$true,
position=1,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String[]]
$Path,
[parameter(mandatory=$false)]
$Worksheet = 1,
[parameter(mandatory=$false)]
[switch]
$Force
)
Begin
{
function GetTempFileName($extension)
https://riptutorial.com/fr/home 160
{
$temp = [io.path]::GetTempFileName();
$params = @{
Path = $temp;
Destination = $temp + $extension;
Confirm = $false;
Verbose = $VerbosePreference;
}
Move-Item @params;
$temp += $extension;
return $temp;
}
Process
{
$Path | ForEach-Object {
$fileExist = Test-Path $_
if (-not $fileExist) {
Write-Error "Error: $_ does not exist" -Category ResourceUnavailable;
} else {
# create temporary .csv file from excel file and import .csv
#
$_ = (Resolve-Path $_).toString();
$wb = $xl.Workbooks.Add($_);
if ($?) {
$csvTemp = GetTempFileName(".csv");
https://riptutorial.com/fr/home 161
$ws = $wb.Worksheets.Item($Worksheet);
$ws.SaveAs($csvTemp, $xlFileFormats[".csv"]);
$wb.Close($false);
Remove-Variable -Name ('ws', 'wb') -Confirm:$false;
Import-Csv $csvTemp;
Remove-Item $csvTemp -Confirm:$false -Verbose:$VerbosePreference;
}
}
}
}
}
End
{
$xl.Quit();
Remove-Variable -name xl -Confirm:$false;
[gc]::Collect();
}
}
Examples
SQLExample
Pour interroger toutes les données de la table MachineName, nous pouvons utiliser la commande
ci-dessous.
$ Inst = "ServerInstance"
$ DbName = "DatabaseName
Invoke-Sqlcmd2 -Serverinstance $Inst -Database $DBName -query $Query -Username $UID -Password
$Password
SQLQuery
Pour interroger toutes les données de la table MachineName, nous pouvons utiliser la commande
ci-dessous.
$ Inst = "ServerInstance"
$ DbName = "DatabaseName
https://riptutorial.com/fr/home 162
$ Password = "Mot de passe"
Invoke-Sqlcmd2 -Serverinstance $Inst -Database $DBName -query $Query -Username $UID -Password
$Password
https://riptutorial.com/fr/home 163
Chapitre 57: Scripts de signature
Remarques
La signature d'un script fera en sorte que vos scripts soient conformes à toutes les stratégies
d'exécution dans PowerShell et garantissent l'intégrité d'un script. Les scripts signés ne seront pas
exécutés s'ils ont été modifiés après leur signature.
• Scripts / tests personnels (non partagés): Certificat d'une autorité de certification certifiée
(interne ou tierce partie) OU un certificat auto-signé.
• Organisation interne partagée: Certificat de l'autorité de certification certifiée (interne ou
tierce)
• Organisation externe partagée: Certificat émanant d'une autorité de certification tierce de
confiance
Politiques d'exécution
PowerShell dispose de stratégies d'exécution configurables qui contrôlent les conditions requises
pour l'exécution d'un script ou d'une configuration. Une politique d'exécution peut être définie pour
plusieurs portées. ordinateur, utilisateur actuel et processus en cours. Les stratégies
d'exécution peuvent facilement être ignorées et ne sont pas conçues pour restreindre les
utilisateurs, mais plutôt pour les protéger contre la violation involontaire de stratégies de
signature.
Réglage La description
RemoteSigned Tous les scripts locaux autorisés; uniquement des scripts distants signés
Aucune exigence Tous les scripts sont autorisés, mais avertiront avant
Libre
d'exécuter des scripts téléchargés à partir d'Internet
Contourne Tous les scripts sont autorisés et aucun avertissement n'est affiché
https://riptutorial.com/fr/home 164
Vous pouvez modifier les stratégies d'exécution en cours à l'aide du Set-ExecutionPolicy -cmdlet,
Group Policy ou -ExecutionPolicy lors du lancement d'un processus powershell.exe .
Examples
Signer un script
#Get the first available personal code-signing certificate for the logged on user
$cert = @(Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert)[0]
Vous pouvez également lire un certificat à partir d'un .pfx .pfx en utilisant:
Le script sera valide jusqu'à l'expiration du certificat. Si vous utilisez un serveur d'horodatage lors
de la signature, le script continuera à être valide après l'expiration du certificat. Il est également
utile d'ajouter la chaîne d'approbation du certificat (y compris l'autorité racine) pour aider la plupart
des ordinateurs à faire confiance au certificat utilisé pour signer le script.
Set-ExecutionPolicy AllSigned
https://riptutorial.com/fr/home 165
Vous devrez souvent exécuter un script non signé qui ne respecte pas la stratégie d'exécution en
cours. Un moyen simple de le faire est de contourner la stratégie d'exécution pour ce processus
unique. Exemple:
AllSigned Seuls les scripts signés par un éditeur approuvé peuvent être exécutés.
Les scripts téléchargés doivent être signés par un éditeur approuvé avant de
RemoteSigned
pouvoir être exécutés.
Aucun script ne peut être exécuté. Windows PowerShell ne peut être utilisé
Restricted
qu'en mode interactif.
Undefined N/A
Unrestricted
Similaire à bypass
*
Unrestricted* Avertissement: Si vous exécutez un script non signé qui a été téléchargé depuis
Internet, vous êtes invité à en demander l'autorisation avant de l'exécuter.
PS> Get-ExecutionPolicy
RemoteSigned
https://riptutorial.com/fr/home 166
PS> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
Obtenez des informations sur la signature Authenticode à partir d'un script signé à l'aide de la
cmdlet Get-AuthenticodeSignature :
Lors de la signature de scripts personnels ou lors du test de signature de code, il peut être utile de
créer un certificat de signature de code auto-signé.
5.0
À partir de PowerShell 5.0, vous pouvez générer un certificat de signature de code auto-signé à
l'aide de la New-SelfSignedCertificate SelfSignedCertificate:
Dans les versions antérieures, vous pouvez créer un certificat auto-signé à l'aide de l'outil
makecert.exe situé dans le Kit de développement .NET Framework SDK et Windows SDK.
Un certificat auto-signé ne sera approuvé que par les ordinateurs sur lesquels le certificat a été
installé. Pour les scripts qui seront partagés, un certificat provenant d'une autorité de certification
approuvée (interne ou tiers de confiance) est recommandé.
https://riptutorial.com/fr/home 167
Chapitre 58: Sécurité et cryptographie
Examples
Calcul des codes de hachage d'une chaîne via la cryptographie .Net
#calculate
$hash=[System.Security.Cryptography.HashAlgorithm]::Create("sha256").ComputeHash(
[System.Text.Encoding]::UTF8.GetBytes($example))
#convert to hex
[System.BitConverter]::ToString($hash)
#2E-DF-DA-DA-56-52-5B-12-90-FF-16-FB-17-44-CF-B4-82-DD-29-14-FF-BC-B6-49-79-0C-0E-58-9E-46-2D-
3D
#2edfdada56525b1290ff16fb1744cfb482dd2914ffbcb649790c0e589e462d3d
#convert to base64
[Convert]::ToBase64String($hash)
#Lt/a2lZSWxKQ/xb7F0TPtILdKRT/vLZJeQwOWJ5GLT0=
https://riptutorial.com/fr/home 168
Chapitre 59: Service de stockage simple
Amazon Web Services (AWS) (S3)
Introduction
Cette section de documentation traite du développement par rapport au service de stockage
simple (S3) Amazon Web Services (AWS). S3 est vraiment un service simple avec lequel
interagir. Vous créez des "buckets" S3 pouvant contenir zéro ou plusieurs "objets". Une fois que
vous créez un compartiment, vous pouvez télécharger des fichiers ou des données arbitraires
dans le compartiment S3 en tant qu '"objet". Vous faites référence aux objets S3, à l'intérieur d'un
compartiment, par la "clé" (nom) de l'objet.
Paramètres
Paramètre Détails
Nom d'un fichier sur le système de fichiers local qui sera téléchargé sur
Fichier
un compartiment AWS S3.
Examples
Créer un nouveau seau S3
Le nom du compartiment du service de stockage simple (S3) doit être unique au monde. Cela
signifie que si quelqu'un d'autre a déjà utilisé le nom du compartiment que vous souhaitez utiliser,
vous devez choisir un nouveau nom.
Le téléchargement de fichiers depuis votre système de fichiers local dans AWS S3 est simple, à
l'aide de la commande Write-S3Object . Dans sa forme la plus élémentaire, il vous suffit de
spécifier le paramètre -BucketName pour indiquer le -BucketName S3 dans lequel vous souhaitez
https://riptutorial.com/fr/home 169
charger un fichier et le paramètre -File , qui indique le chemin relatif ou absolu du fichier local que
vous souhaitez télécharger dans le compartiment S3.
Supprimer un seau S3
Pour supprimer un compartiment S3, vous devez d'abord supprimer tous les objets S3 stockés à
l'intérieur du compartiment, à condition que vous y soyez autorisé. Dans l'exemple ci-dessus, nous
récupérons une liste de tous les objets à l'intérieur d'un compartiment, puis nous les Remove-
S3Object commande Remove-S3Object pour les supprimer. Une fois que tous les objets ont été
supprimés, nous pouvons utiliser la commande Remove-S3Bucket pour supprimer le Remove-S3Bucket .
Lire Service de stockage simple Amazon Web Services (AWS) (S3) en ligne:
https://riptutorial.com/fr/powershell/topic/9579/service-de-stockage-simple-amazon-web-services--
aws---s3-
https://riptutorial.com/fr/home 170
Chapitre 60: Splatting
Introduction
La splatting est une méthode de transmission de plusieurs paramètres à une commande en une
seule unité. Cela se fait en stockant les paramètres et leurs valeurs en tant que paires clé-valeur
dans une table de hachage et en les répartissant dans une applet de commande à l'aide de
l'opérateur de répartition @ .
La fragmentation peut rendre une commande plus lisible et vous permet de réutiliser des
paramètres dans des appels de commande multiples.
Remarques
Remarque: L' opérateur d'expression Array ou @() a un comportement très différent de celui de
l'opérateur Splatting @ .
Examples
Paramètres de splatting
La répartition est effectuée en remplaçant le signe dollar $ par l'opérateur de répartition @ lors de
l'utilisation d'une variable contenant une table de hachage contenant des paramètres et des
valeurs dans un appel de commande.
$MyParameters = @{
Name = "iexplore"
FileVersionInfo = $true
}
Get-Process @MyParameters
Sans splatting:
Vous pouvez combiner des paramètres normaux avec des paramètres splatted pour ajouter
facilement des paramètres communs à vos appels.
$MyParameters = @{
ComputerName = "StackOverflow-PC"
}
https://riptutorial.com/fr/home 171
Invoke-Command -ScriptBlock { "Something to excute remotely" } @MyParameters
Pour utiliser Splatting pour appeler Get-Process avec le commutateur -FileVersionInfo similaire à
ceci:
Get-Process -FileVersionInfo
$MyParameters = @{
FileVersionInfo = $true
}
Get-Process @MyParameters
Note: Ceci est utile car vous pouvez créer un jeu de paramètres par défaut et passer plusieurs
fois l'appel comme ceci
$MyParameters = @{
FileVersionInfo = $true
}
Tuyauterie et éclaboussure
La déclaration de splat est utile pour réutiliser des ensembles de paramètres plusieurs fois ou
avec de légères variations:
$splat = @{
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
}
Cependant, si le splat n'est pas indenté pour être réutilisé, vous ne souhaiterez peut-être pas le
déclarer. Il peut être canalisé à la place:
@{
ComputerName = $env:COMPUTERNAME
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
} | % { Get-WmiObject @_ }
https://riptutorial.com/fr/home 172
Division de la fonction de niveau supérieur en une série de fonctions internes
Sans splatting, il est très difficile d'essayer de transmettre des valeurs à travers la pile d'appels.
Mais si vous combinez la répartition avec la puissance de @PSBoundParameters, vous pouvez
transmettre la collection de paramètres de niveau supérieur aux couches.
Function Outer-Method
{
Param
(
[string]
$First,
[string]
$Second
)
Inner-Method @PSBoundParameters
}
Function Inner-Method
{
Param
(
[string]
$Second
)
$parameters = @{
First = "Hello"
Second = "World"
}
Outer-Method @parameters
https://riptutorial.com/fr/home 173
Chapitre 61: Travailler avec des fichiers XML
Examples
Accéder à un fichier XML
Pour charger un fichier XML, vous pouvez utiliser l'un de ces éléments:
# First Method
$xdoc = New-Object System.Xml.XmlDocument
$file = Resolve-Path(".\file.xml")
$xdoc.load($file)
# Second Method
[xml] $xdoc = Get-Content ".\file.xml"
# Third Method
$xdoc = [xml] (Get-Content ".\file.xml")
PS C:\> $xml.people
person
--------
{Jon Lajoie, Lord Gaben, Gordon Freeman}
PS C:\> $xml.people.person
id name age
-- ---- ---
https://riptutorial.com/fr/home 174
101 Jon Lajoie 22
102 Lord Gaben 65
103 Gordon Freeman 29
PS C:\> $xml.people.person[0].name
Jon Lajoie
PS C:\> $xml.people.person[1].age
65
PS C:\> $xml.people.person[2].id
103
PS C:\> $xml.SelectNodes("//people")
person
--------
{Jon Lajoie, Lord Gaben, Gordon Freeman}
PS C:\> $xml.SelectNodes("//people//person")
id name age
-- ---- ---
101 Jon Lajoie 22
102 Lord Gaben 65
103 Gordon Freeman 29
PS C:\> $xml.SelectSingleNode("people//person[1]//name")
Jon Lajoie
PS C:\> $xml.SelectSingleNode("people//person[2]//age")
65
PS C:\> $xml.SelectSingleNode("people//person[3]//@id")
103
https://riptutorial.com/fr/home 175
PS C:\> $ns.AddNamespace("ns", $xml.DocumentElement.NamespaceURI)
PS C:\> $xml.SelectNodes("//ns:people/ns:person", $ns)
id name
-- ----
101 Jon Lajoie
102 Lord Gaben
103 Gordon Freeman
$xmlWriter.WriteElementString("Property1","Value 1")
$xmlWriter.WriteElementString("Property2","Value 2")
https://riptutorial.com/fr/home 176
Ajout d'extraits de XML à XMLDocument en cours
Données d'échantillon
Document XML
Tout d'abord, définissons un exemple de document XML nommé " books.xml " dans notre
répertoire actuel:
https://riptutorial.com/fr/home 177
<publisher>
<isbn>978-08-08587-35-4</isbn>
<name>Penguin Putnam</name>
<year>2010</year>
<binding>Paperback</binding>
</publisher>
</publishers>
<characters>
<character name="Marko Alexadrovich Ramius" />
<character name="Jack Ryan" />
<character name="Admiral Greer" />
<character name="Bart Mancuso" />
<character name="Vasily Borodin" />
</characters>
<film>True</film>
</book>
</books>
Nouvelles données
Ce que nous voulons faire, c'est ajouter quelques nouveaux livres à ce document, disons Patriot
Games de Tom Clancy (oui, je suis un fan des œuvres de Clancy ^ __ ^) et un favori de science-
fiction: The Hitchhiker's Guide to the Galaxy. par Douglas Adams principalement parce que
Zaphod Beeblebrox est juste amusant à lire.
D'une manière ou d'une autre, nous avons acquis les données pour les nouveaux livres et les
avons enregistrées en tant que liste de PSCustomObjects:
$newBooks = @(
[PSCustomObject] @{
"Title" = "Patriot Games";
"Author" = "Tom Clancy";
"PageCount" = 540;
"Publishers" = @(
[PSCustomObject] @{
"ISBN" = "978-0-39-913241-4";
"Year" = "1987";
"First" = $True;
"Name" = "Putnam";
"Binding" = "Hardcover";
}
);
"Characters" = @(
"Jack Ryan", "Prince of Wales", "Princess of Wales",
"Robby Jackson", "Cathy Ryan", "Sean Patrick Miller"
);
"film" = $True;
},
[PSCustomObject] @{
"Title" = "The Hitchhiker's Guide to the Galaxy";
"Author" = "Douglas Adams";
"PageCount" = 216;
"Publishers" = @(
[PSCustomObject] @{
"ISBN" = "978-0-33-025864-7";
"Year" = "1979";
"First" = $True;
https://riptutorial.com/fr/home 178
"Name" = "Pan Books";
"Binding" = "Hardcover";
}
);
"Characters" = @(
"Arthur Dent", "Marvin", "Zaphod Beeblebrox", "Ford Prefect",
"Trillian", "Slartibartfast", "Dirk Gently"
);
"film" = $True;
}
);
Modèles
Maintenant, nous devons définir quelques structures XML squelettes pour nos nouvelles données.
Fondamentalement, vous voulez créer un squelette / modèle pour chaque liste de données. Dans
notre exemple, cela signifie que nous avons besoin d'un modèle pour le livre, les personnages et
les éditeurs. Nous pouvons également l'utiliser pour définir quelques valeurs par défaut, telles que
la valeur du tag film .
https://riptutorial.com/fr/home 179
# Read the xml document
$xml = [xml] Get-Content .\books.xml;
# Outputs:
# title author ISBN
# ----- ------ ----
# Of Mice And Men John Steinbeck 978-88-58702-15-4
# The Hunt for Red October Tom Clancy 978-08-70212-85-7
# Outputs:
# Title Author ISBN
# ----- ------ ----
# Patriot Games Tom Clancy 978-0-39-913241-4
# The Hitchhiker's Guide to the Galaxy Douglas Adams 978-0-33-025864-7
# Add the template for a book as a new node to the root element
[void]$root.AppendChild($xml.ImportNode($t_book.book, $true));
# Update the parameters of that new element to match our current new book data
$newElement.title = [String]$book.Title;
$newElement.author = [String]$book.Author;
$newElement.pageCount = [String]$book.PageCount;
$newElement.film = [String]$book.Film;
# Iterate through the properties that are Children of our new Element:
ForEach ( $publisher in $book.Publishers ) {
# Create the new child publisher element
# Note the use of "SelectSingleNode" here, this allows the use of the "AppendChild"
method as it returns
# a XmlElement type object instead of the $Null data that is currently stored in that
leaf of the
# XML document tree
[void]$newElement.SelectSingleNode("publishers").AppendChild($xml.ImportNode($t_publisher.publisher,
$true));
# Update the attribute and text values of our new XML Element to match our new data
$newPublisherElement = $newElement.SelectSingleNode("publishers/publisher[last()]");
$newPublisherElement.year = [String]$publisher.Year;
$newPublisherElement.name = [String]$publisher.Name;
$newPublisherElement.binding = [String]$publisher.Binding;
$newPublisherElement.isbn = [String]$publisher.ISBN;
If ( $publisher.first ) {
$newPublisherElement.first = "True";
}
}
https://riptutorial.com/fr/home 180
ForEach ( $character in $book.Characters ) {
# Select the characters xml element
$charactersElement = $newElement.SelectSingleNode("characters");
# Update the attribute and text values to match our new data
$characterElement.name = [String]$character;
}
}
# Outputs:
# title author ISBN
# ----- ------ ----
# Of Mice And Men John Steinbeck 978-88-58702-15-4
# The Hunt for Red October Tom Clancy 978-08-70212-85-7
# Patriot Games Tom Clancy 978-0-39-913241-4
# The Hitchhiker's Guide to the Galaxy Douglas Adams 978-0-33-025864-7
Nous pouvons maintenant écrire notre XML sur un disque, un écran, un site Web ou n'importe où!
Profit
Bien que cela puisse ne pas être la procédure pour tout le monde, je l'ai trouvée pour éviter tout
un tas de
[void]$xml.SelectSingleNode("/complicated/xpath/goes[here]").AppendChild($xml.CreateElement("newElementN
suivi de $xml.SelectSingleNode("/complicated/xpath/goes/here/newElementName") = $textValue
Je pense que la méthode détaillée dans l'exemple est plus propre et plus facile à analyser pour
les humains normaux.
Améliorations
Il est possible de modifier le modèle pour inclure des éléments avec des enfants au lieu de
séparer chaque section en un modèle distinct. Vous devez juste faire attention à cloner l'élément
précédent lorsque vous parcourez la liste.
https://riptutorial.com/fr/home 181
Chapitre 62: Travailler avec des objets
Examples
Mise à jour des objets
Ajout de propriétés
Si vous souhaitez ajouter des propriétés à un objet existant, vous pouvez utiliser l'applet de
commande Add-Member. Avec PSObjects, les valeurs sont conservées dans un type de
"Propriétés de la note"
Add-Member -InputObject $object -Name "SomeNewProp" -Value "A value" -MemberType NoteProperty
# Returns
PS> $Object
Name ID Address SomeNewProp
---- -- ------- -----------
nem 12 A value
Vous pouvez également ajouter des propriétés avec la cmdlet Select-Object (propriétés dites
calculées):
# Returns
PS> $newObject
Name ID Address SomeNewProp SomeOtherProp
---- -- ------- ----------- -------------
nem 12 A value Another value
Suppression de propriétés
Vous pouvez utiliser la cmdlet Select-Object pour supprimer des propriétés d'un objet:
https://riptutorial.com/fr/home 182
# Returns
PS> $object
Name SomeNewProp SomeOtherProp
---- ----------- -------------
nem A value Another value
PowerShell, contrairement à d'autres langages de script, envoie des objets via le pipeline. Cela
signifie que lorsque vous envoyez des données d'une commande à une autre, il est essentiel de
pouvoir créer, modifier et collecter des objets.
Créer un objet est simple. La plupart des objets que vous créez seront des objets personnalisés
dans PowerShell et le type à utiliser pour cela est PSObject. PowerShell vous permettra
également de créer tout objet que vous pourriez créer dans .NET.
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Vous pouvez stocker l'objet dans une variable en faisant précéder la commande de $newObject =
Vous devrez peut-être également stocker des collections d'objets. Cela peut être fait en créant
une variable de collection vide et en ajoutant des objets à la collection, comme ceci:
$newCollection = @()
$newCollection += New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
Vous pouvez ensuite vouloir parcourir cet objet de collection par objet. Pour ce faire, recherchez la
section Boucle dans la documentation.
https://riptutorial.com/fr/home 183
Une manière moins courante de créer des objets que vous trouverez encore sur Internet est la
suivante:
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
$newObject = [PSCustomObject][Ordered]@{
Name = $env:Username
ID = 12
Address = $null
}
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Examiner un objet
Maintenant que vous avez un objet, il peut être intéressant de le comprendre. Vous pouvez utiliser
l'applet de commande Get-Member pour voir ce qu'est un objet et ce qu'il contient:
Cela donne:
TypeName: System.IO.DirectoryInfo
Une autre façon d'obtenir le type d'un objet consiste à utiliser la méthode GetType, comme ceci:
https://riptutorial.com/fr/home 184
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DirectoryInfo System.IO.FileSystemInfo
Pour afficher la liste des propriétés de l'objet et leurs valeurs, vous pouvez utiliser l'applet de
commande Format-List avec son paramètre Property défini sur: * (signifiant tout).
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Windows
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName : Windows
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : True
Mode : d-----
BaseName : Windows
Target : {}
LinkType :
Name : Windows
Parent :
Exists : True
Root : C:\
FullName : C:\Windows
Extension :
CreationTime : 30/10/2015 06:28:30
CreationTimeUtc : 30/10/2015 06:28:30
LastAccessTime : 16/08/2016 17:32:04
LastAccessTimeUtc : 16/08/2016 16:32:04
LastWriteTime : 16/08/2016 17:32:04
LastWriteTimeUtc : 16/08/2016 16:32:04
Attributes : Directory
Remarque: exemples écrits pour PowerShell 5.1 Vous pouvez créer des instances de classes
génériques
#Nullable System.DateTime
[Nullable[datetime]]$nullableDate = Get-Date -Year 2012
$nullableDate
$nullableDate.GetType().FullName
$nullableDate = $null
$nullableDate
#Normal System.DateTime
[datetime]$aDate = Get-Date -Year 2013
$aDate
$aDate.GetType().FullName
$aDate = $null #Throws exception when PowerShell attempts to convert null to
Donne la sortie:
https://riptutorial.com/fr/home 185
Saturday, 4 August 2012 08:53:02
System.DateTime
Sunday, 4 August 2013 08:53:02
System.DateTime
Cannot convert null to type "System.DateTime".
At line:14 char:1
+ $aDate = $null
+ ~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
[System.Collections.Generic.SortedDictionary[int, String]]$dict =
[System.Collections.Generic.SortedDictionary[int, String]]::new()
$dict.GetType().FullName
$dict.Add(1, 'a')
$dict.Add(2, 'b')
$dict.Add(3, 'c')
$dict
Donne la sortie:
Key Value
--- -----
1 a
2 b
3 c
4 d
5 c
Cannot convert argument "key", with value: "z", for "Add" to type "System.Int32": "Cannot
convert value "z" to type "System.Int32". Error: "Input string was not in a correct format.""
At line:15 char:1
+ $dict.Add('z', 'z') #powershell can't convert 'z' to System.Int32 so ...
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
https://riptutorial.com/fr/home 186
Chapitre 63: Travailler avec le pipeline
PowerShell
Introduction
PowerShell introduit un modèle de pipeline d'objets, qui vous permet d'envoyer des objets entiers
dans le pipeline vers des commandes consommatrices ou (au moins) la sortie. Contrairement au
pipeline à cordes classique, les informations contenues dans les objets canalisés ne doivent pas
nécessairement se trouver sur des positions spécifiques. Les commandlets peuvent déclarer
interagir avec les objets du pipeline en tant qu'entrée, tandis que les valeurs de retour sont
envoyées automatiquement au pipeline.
Syntaxe
• COMMENCER Le premier bloc. Exécuté une fois au début. L'entrée du pipeline ici est $ null,
car elle n'a pas été définie.
• PROCESS Le deuxième bloc. Exécuté pour chaque élément du pipeline. Le paramètre de
pipeline est égal à l'élément actuellement traité.
• FIN Dernier bloc. Exécuté une fois à la fin. Le paramètre de pipeline est égal au dernier
élément de l'entrée, car il n'a pas été modifié depuis sa définition.
Remarques
Dans la plupart des cas, l'entrée du pipeline sera un tableau d'objets. Bien que le comportement
du bloc PROCESS{} puisse sembler similaire au bloc foreach{} , ignorer un élément du tableau
nécessite un processus différent.
Si, comme dans foreach{} , vous avez continue à l'intérieur du bloc PROCESS{} , cela briserait le
pipeline en ignorant toutes les instructions suivantes, y compris le bloc END{} . Au lieu de cela,
utilisez return - cela mettra fin uniquement au bloc PROCESS{} pour l'élément en cours et passera au
suivant.
Dans certains cas, il est nécessaire de générer le résultat des fonctions avec un codage différent.
Le codage de la sortie de CmdLets est contrôlé par la variable $OutputEncoding . Lorsque la sortie
est destinée à être placée dans un pipeline vers des applications natives, il peut être judicieux de
corriger l'encodage pour correspondre à la cible $OutputEncoding = [Console]::OutputEncoding
Références supplémentaires:
Examples
https://riptutorial.com/fr/home 187
Fonctions d'écriture avec cycle de vie avancé
Cet exemple montre comment une fonction peut accepter des entrées en pipeline et effectuer une
itération efficace.
Notez que les structures de begin et de end de la fonction sont facultatives lors du process pipeline,
mais ce process est requis lors de l'utilisation de ValueFromPipeline ou
ValueFromPipelineByPropertyName .
function Write-FromPipeline{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
$myInput
)
begin {
Write-Verbose -Message "Beginning Write-FromPipeline"
}
process {
Write-Output -InputObject $myInput
}
end {
Write-Verbose -Message "Ending Write-FromPipeline"
}
}
$foo = 'hello','world',1,2,3
Sortie:
Voici un exemple de fonction avec le support le plus simple possible pour le traitement en pipeline.
Toute fonction avec prise en charge de pipeline doit avoir au moins un paramètre avec l'ensemble
ParameterAttribute ValueFromPipeline ou ValueFromPipelineByPropertyName , comme indiqué ci-
dessous.
function Write-FromPipeline {
param(
[Parameter(ValueFromPipeline)] # This sets the ParameterAttribute
[String]$Input
)
Write-Host $Input
https://riptutorial.com/fr/home 188
}
$foo | Write-FromPipeline
Sortie:
Hello World!
Remarque: Dans PowerShell 3.0 et versions ultérieures, les valeurs par défaut pour
ParameterAttributes sont prises en charge. Dans les versions antérieures, vous devez spécifier
ValueFromPipeline=$true .
Dans une série de pipeline, chaque fonction est parallèle aux autres, comme les threads
parallèles. Le premier objet traité est transmis au pipeline suivant et le traitement suivant est
immédiatement exécuté dans un autre thread. Cela explique le gain de vitesse élevé par rapport à
la norme ForEach
https://riptutorial.com/fr/home 189
Chapitre 64: URL encoder / décoder
Remarques
L'expression régulière utilisée dans les exemples d' URL de décodage provient de la RFC 2396,
annexe B: analyse d'une référence d'URI avec une expression régulière ; pour la postérité, voici
une citation:
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Les chiffres de la deuxième ligne ci-dessus ne servent qu'à faciliter la lisibilité; ils
indiquent les points de référence pour chaque sous-expression (c.-à-d. chaque
parenthèse appariée). Nous nous référons à la valeur correspondant à la sous-
expression $. Par exemple, faire correspondre l'expression ci-dessus à
http://www.ics.uci.edu/pub/ietf/uri/#Related
$1 = http:
$2 = http
$3 = //www.ics.uci.edu
$4 = www.ics.uci.edu
$5 = /pub/ietf/uri/
$6 = <undefined>
$7 = <undefined>
$8 = #Related
$9 = Related
Examples
Démarrage rapide: encodage
https://riptutorial.com/fr/home 190
Démarrage rapide: décodage
Remarque: ces exemples utilisent les variables créées dans la section Démarrage rapide:
encodage ci-dessus.
# url1: http%3A%2F%2Ftest.com%3Ftest%3Dmy%20value
[uri]::UnescapeDataString($url1)
# Returns: http://test.com?test=my value
# url2: http://test.com?test=my%20value
[uri]::UnescapeDataString($url2)
# Returns: http://test.com?test=my value
# url3: http%3a%2f%2ftest.com%3ftest%3dmy+value
[uri]::UnescapeDataString($url3)
# Returns: http://test.com?test=my+value
$scheme = 'https'
$url_format = '{0}://example.vertigion.com/foos?{1}'
$qs_data = @{
'foo1'='bar1';
'foo2'= 'complex;/?:@&=+$, bar''"';
'complex;/?:@&=+$, foo''"'='bar2';
}
https://riptutorial.com/fr/home 191
Avec [uri]::EscapeDataString() , vous remarquerez que l'apostrophe ( ' ) n'a pas été encodée:
$scheme = 'https'
$url_format = '{0}://example.vertigion.com/foos?{1}'
$qs_data = @{
'foo1'='bar1';
'foo2'= 'complex;/?:@&=+$, bar''"';
'complex;/?:@&=+$, foo''"'='bar2';
}
$url =
'https://example.vertigion.com/foos?foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar''%22&complex%3B%2F
https://riptutorial.com/fr/home 192
'QueryString' = $Matches[7];
'QueryStringParts' = @{}
}
Cela vous ramène [hashtable]$url_parts ; qui est égal à ( Note: les espaces dans les parties
complexes sont des espaces ):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server example.vertigion.com
QueryString
foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar'%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo'%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
$url =
'https://example.vertigion.com/foos?foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%
https://riptutorial.com/fr/home 193
'Path' = $Matches[5];
'QueryString' = $Matches[7];
'QueryStringParts' = @{}
}
Cela vous donne [hashtable]$url_parts , ce qui équivaut à ( Note: les espaces dans les parties
complexes sont des signes plus ( + ) dans la première partie et des espaces dans la deuxième
partie):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server example.vertigion.com
QueryString
foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
$url =
'https://example.vertigion.com/foos?foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar''%22&complex%3B%2F
https://riptutorial.com/fr/home 194
$url_parts_regex = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' # See Remarks
Cela vous ramène [hashtable]$url_parts ; qui est égal à ( Note: les espaces dans les parties
complexes sont des espaces ):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server example.vertigion.com
QueryString
foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar'%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo'%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
$url =
'https://example.vertigion.com/foos?foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%
https://riptutorial.com/fr/home 195
$url_parts_regex = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?' # See Remarks
Cela vous ramène [hashtable]$url_parts ; qui est égal à ( Note: les espaces dans les parties
complexes sont des espaces ):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server example.vertigion.com
QueryString
foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
https://riptutorial.com/fr/home 196
Chapitre 65: Utilisation du système d'aide
Remarques
Get-Help est une applet de commande permettant de lire les rubriques d'aide dans PowerShell.
Examples
Mise à jour du système d'aide
3.0
À partir de PowerShell 3.0, vous pouvez télécharger et mettre à jour la documentation d'aide hors
ligne à l'aide d'une seule applet de commande.
Update-Help
Pour mettre à jour l'aide sur plusieurs ordinateurs (ou ordinateurs non connectés à Internet).
Exécutez les opérations suivantes sur un ordinateur avec les fichiers d'aide
Utilisation de Get-Help
peut être utilisé pour afficher l'aide de PowerShell. Vous pouvez rechercher des applets
Get-Help
de commande, des fonctions, des fournisseurs ou d'autres rubriques.
Get-Help about_Jobs
Vous pouvez rechercher des sujets à l'aide de caractères génériques. Si vous voulez lister les
rubriques d'aide disponibles avec un titre commençant par about_ , essayez:
Get-Help about_*
Get-Help Select-Object
https://riptutorial.com/fr/home 197
Vous pouvez également utiliser l' help alias ou man .
Exemples d'affichage
https://riptutorial.com/fr/home 198
Chapitre 66: Utiliser des classes statiques
existantes
Introduction
Ces classes sont des bibliothèques de référence de méthodes et de propriétés qui ne changent
pas d'état, en un mot, immuable. Vous n'avez pas besoin de les créer, vous les utilisez
simplement. Les classes et les méthodes telles que celles-ci sont appelées classes statiques car
elles ne sont pas créées, détruites ou modifiées. Vous pouvez faire référence à une classe
statique en entourant le nom de la classe de crochets.
Examples
Créer un nouveau GUID instantanément
Utilisez les classes .NET existantes instantanément avec PowerShell en utilisant [class] :: Method
(args):
PS C:\> [guid]::NewGuid()
Guid
----
8874a185-64be-43ed-a64c-d2fe4b6e31bc
De même, dans PowerShell 5+, vous pouvez utiliser l'applet de commande New-Guid :
PS C:\> New-Guid
Guid
----
8874a185-64be-43ed-a64c-d2fe4b6e31bc
Pour obtenir le GUID en tant que [String] uniquement, .Guid référence à la propriété .Guid :
[guid]::NewGuid().Guid
Vous pouvez utiliser la classe .Net Math pour effectuer des calculs ([System.Math])
Si vous voulez savoir quelles méthodes sont disponibles, vous pouvez utiliser:
https://riptutorial.com/fr/home 199
PS C:\> [System.Math]::Floor(9.42)
9
PS C:\> [System.Math]::Ceiling(9.42)
10
PS C:\> [System.Math]::Pow(4,3)
64
PS C:\> [System.Math]::Sqrt(49)
7
https://riptutorial.com/fr/home 200
Chapitre 67: Utiliser la barre de progression
Introduction
Une barre de progression peut être utilisée pour montrer que quelque chose est dans un
processus. Les barres de progression sont incroyablement utiles lors du débogage pour
déterminer quelle partie du script est en cours d’exécution et elles sont satisfaisantes pour les
utilisateurs exécutant des scripts pour suivre ce qui se passe. Il est courant d'afficher une sorte de
progression lorsqu'un script prend beaucoup de temps à compléter. Lorsqu'un utilisateur lance le
script et que rien ne se passe, on commence à se demander si le script a été lancé correctement.
Examples
Utilisation simple de la barre de progression
1..100 | ForEach-Object {
Write-Progress -Activity "Copying files" -Status "$_ %" -Id 1 -PercentComplete $_ -
CurrentOperation "Copying file file_name_$_.txt"
Start-Sleep -Milliseconds 500 # sleep simulates working code, replace this line
with your executive code (i.e. file copying)
}
Veuillez noter que, pour des raisons de concision, cet exemple ne contient aucun code exécutif
(simulé avec Start-Sleep ). Cependant, il est possible de l'exécuter directement tel quel et de le
modifier et de le jouer.
https://riptutorial.com/fr/home 201
Utilisation de la barre de progression interne
1..10 | foreach-object {
$fileName = "file_name_$_.txt"
Write-Progress -Activity "Copying files" -Status "$($_*10) %" -Id 1 -PercentComplete
($_*10) -CurrentOperation "Copying file $fileName"
1..100 | foreach-object {
Write-Progress -Activity "Copying contents of the file $fileName" -Status "$_ %" -
Id 2 -ParentId 1 -PercentComplete $_ -CurrentOperation "Copying $_. line"
Start-Sleep -Milliseconds 500 # sleep simulates working code, replace this line with
your executive code (i.e. file search)
Veuillez noter que, pour des raisons de concision, cet exemple ne contient aucun code exécutif
(simulé avec Start-Sleep ). Cependant, il est possible de l'exécuter directement tel quel et de le
modifier et de le jouer.
https://riptutorial.com/fr/home 202
Voici comment les résultats apparaissent dans PS ISE:
https://riptutorial.com/fr/home 203
Chapitre 68: Utiliser ShouldProcess
Syntaxe
• $ PSCmdlet.ShouldProcess ("Target")
• $ PSCmdlet.ShouldProcess ("Target", "Action")
Paramètres
Paramètre Détails
Remarques
$PSCmdlet.ShouldProcess() écrira également automatiquement un message à la sortie détaillée.
Examples
Ajout de la prise en charge de -WhatIf et -Confirm à votre applet de
commande
function Invoke-MyCmdlet {
[CmdletBinding(SupportsShouldProcess = $true)]
param()
# ...
}
if ($PSCmdlet.ShouldProcess("Target of action")) {
# Do the thing
}
En utilisant -Confirm :
https://riptutorial.com/fr/home 204
Are you sure you want to perform this action?
Performing operation "Invoke-MyCmdlet" on target "Target of action"
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Cet exemple montre également que les commandes sous-jacentes écoutent également le
drapeau -Confirm!
<#
Restart-Win32Computer
#>
function Restart-Win32Computer
{
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact="High")]
param (
[parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string[]]$computerName,
[parameter(Mandatory=$true)]
[string][ValidateSet("Restart","LogOff","Shutdown","PowerOff")] $action,
[boolean]$force = $false
)
BEGIN {
# translate action to numeric value required by the method
switch($action) {
"Restart"
{
$_action = 2
break
}
"LogOff"
{
$_action = 0
break
}
"Shutdown"
{
$_action = 2
break
}
"PowerOff"
{
$_action = 8
break
}
}
# to force, add 4 to the value
if($force)
{
$_action += 4
}
write-verbose "Action set to $action"
}
PROCESS {
https://riptutorial.com/fr/home 205
write-verbose "Attempting to connect to $computername"
# this is how we support -whatif and -confirm
# which are enabled by the SupportsShouldProcess
# parameter in the cmdlet bindnig
if($pscmdlet.ShouldProcess($computername)) {
get-wmiobject win32_operatingsystem -computername $computername | invoke-wmimethod -
name Win32Shutdown -argumentlist $_action
}
}
}
#Usage:
#This will only output a description of the actions that this command would execute if -WhatIf
is removed.
'localhost','server1'| Restart-Win32Computer -action LogOff -whatif
#This will request the permission of the caller to continue with this item.
#Attention: in this example you will get two confirmation request because all cmdlets called
by this cmdlet that also support ShouldProcess, will ask for their own confirmations...
'localhost','server1'| Restart-Win32Computer -action LogOff -Confirm
https://riptutorial.com/fr/home 206
Chapitre 69: Variables Automatiques
Introduction
Les variables automatiques sont créées et gérées par Windows PowerShell. On a la possibilité
d'appeler une variable à peu près n'importe quel nom dans le livre; Les seules exceptions sont les
variables déjà gérées par PowerShell. Ces variables seront sans aucun doute les objets les plus
répétitifs que vous utiliserez dans PowerShell à côté des fonctions (comme $? - indique le statut
Success / Failure de la dernière opération).
Syntaxe
• $$ - Contient le dernier jeton de la dernière ligne reçue par la session.
• $^ - Contient le premier jeton de la dernière ligne reçue par la session.
• $? - Contient le statut d'exécution de la dernière opération.
• $_ - Contient l'objet en cours dans le pipeline
Examples
$ pid
PS C:\> $pid
26080
Valeurs booléennes
Notez que vous devez spécifier le signe dollar comme premier caractère (différent de C #).
Notez que lorsque vous utilisez booléen true / false dans votre code, vous écrivez $true ou $false ,
mais lorsque Powershell renvoie un booléen, il ressemble à True ou False
$ null
https://riptutorial.com/fr/home 207
$null peut être utilisé comme espace réservé vide pour les valeurs vides dans les tableaux:
Lorsque nous utilisons le même tableau que la source de ForEach-Object , il traitera les trois
éléments (y compris $ null):
Faites attention! Cela signifie que ForEach-Object traitera même $null par lui - même:
Ce qui est un résultat très inattendu si vous le comparez à la boucle foreach classique:
$ OFS
La variable appelée Output Field Separator contient une valeur de chaîne utilisée lors de la
conversion d'un tableau en chaîne. Par défaut $OFS = " " ( un espace ), mais il peut être modifié:
$ _ / $ PSItem
$PSItem et $_ sont identiques et peuvent être utilisés indifféremment, mais $_ est de loin le plus
utilisé.
https://riptutorial.com/fr/home 208
$?
Contient le statut de la dernière opération. Lorsqu'il n'y a pas d'erreur, il est défini sur True :
PS C:\> wrt-host
wrt-host : The term 'wrt-host' is not recognized as the name of a cmdlet, function, script
file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and
try again.
At line:1 char:1
+ wrt-host
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (wrt-host:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\> $?
False
$ erreur
Tableau des objets d'erreur les plus récents. Le premier dans le tableau est le plus récent:
Conseils d'utilisation: Lorsque vous utilisez la variable $error dans une applet de commande de
format (par exemple, une liste de format), -Force à utiliser le commutateur -Force . Sinon, l'applet
de commande de format va afficher le contenu d' $error ci-dessus.
Les entrées d'erreur peuvent être supprimées via par exemple $Error.Remove($Error[0]) .
https://riptutorial.com/fr/home 209
Chapitre 70: Variables automatiques - partie 2
Introduction
Le sujet "Variables automatiques" a déjà 7 exemples listés et nous ne pouvons pas en ajouter
plus. Ce sujet aura une suite de variables automatiques.
Les variables automatiques sont des variables qui stockent des informations d'état pour
PowerShell. Ces variables sont créées et gérées par Windows PowerShell.
Remarques
Je ne suis pas sûr que ce soit la meilleure façon de gérer la documentation des variables
automatiques, mais cela vaut mieux que rien. S'il vous plaît commenter si vous trouvez un
meilleur moyen :)
Examples
$ PSVersionTable
Contient une table de hachage en lecture seule (constante, AllScope) qui affiche des détails sur la
version de PowerShell en cours d'exécution dans la session en cours.
$PSVersionTable.PSVersion
# result :
Major Minor Build Revision
----- ----- ----- --------
5 0 10586 117
https://riptutorial.com/fr/home 210
Chapitre 71: Variables d'environnement
Examples
Les variables d'environnement Windows sont visibles en tant que lecteur PS
appelé Env:
Vous pouvez voir la liste avec toutes les variables d'environnement avec:
Get-Childitem env:
$env:COMPUTERNAME
https://riptutorial.com/fr/home 211
Chapitre 72: Variables dans PowerShell
Introduction
Les variables sont utilisées pour stocker des valeurs. Soit la valeur de n'importe quel type, nous
devons la stocker quelque part afin de pouvoir l'utiliser dans toute la console / le script. Les noms
de variable dans PowerShell commencent par $ , comme dans $ Variable1 , et les valeurs sont
affectées avec = , comme $ Variable1 = "Value 1" .PowerShell prend en charge un grand
nombre de types de variables; comme les chaînes de texte, les entiers, les décimales, les
tableaux et même les types avancés tels que les numéros de version ou les adresses IP.
Examples
Variable simple
Toutes les variables dans Powershell commencent par un signe dollar américain ( $ ). L'exemple
le plus simple est le suivant:
$foo = "bar"
Cette instruction alloue une variable appelée foo avec une valeur de chaîne de "bar".
Pour supprimer une variable de la mémoire, vous pouvez utiliser l'applet de commande Remove-
Item . Note: Le nom de la variable n'inclut pas le $ .
Remove-Item Variable:\foo
Une autre méthode pour supprimer une variable consiste à utiliser l'applet de commande
Remove-Variable et son alias rv
$var = "Some Variable" #Define variable 'var' containing the string 'Some Variable'
$var #For test and show string 'Some Variable' on the console
Portée
https://riptutorial.com/fr/home 212
La portée par défaut d'une variable est le conteneur englobant. En dehors d'un script ou d'un autre
conteneur, la portée est Global . Pour spécifier une étendue , elle est préfixée par le nom de la
variable $scope:varname comme ceci:
Sortie:
Global Scope
Function (local) scope
Function (local) scope
Global Scope
Global Scope
Par défaut, powershell renverrait la sortie à l'entité appelante. Considérez l'exemple ci-dessous,
Cela renverrait simplement à l'entité appelante le processus en cours d'exécution qui correspond
au nom Excel. Dans ce cas, l'hôte PowerShell. Il imprime quelque chose comme,
Maintenant, si vous affectez la sortie à une variable, elle n'imprimera tout simplement rien. Et bien
sûr, la variable contient la sortie. (Que ce soit une chaîne, Object - N'importe quel type d'ailleurs)
Donc, disons que vous avez un scénario où vous voulez assigner une variable par un nom
dynamique, vous pouvez utiliser le paramètre -OutVariable
Notez que le "$" est manquant ici. Une différence majeure entre ces deux affectations est que, il
imprime également la sortie en dehors de l'affecter à la variable AllRunningExcel. Vous pouvez
https://riptutorial.com/fr/home 213
également choisir de l'assigner à une autre variable.
Bien que le scénario ci-dessus soit très rare, les deux variables $ VarOne & $ VarTwo auront la
même valeur.
Powershell permet d'affecter plusieurs variables et traite presque tout comme un tableau ou une
liste. Cela signifie qu'au lieu de faire quelque chose comme ça:
$input = "foo.bar.baz"
$parts = $input.Split(".")
$foo = $parts[0]
$bar = $parts[1]
$baz = $parts[2]
Étant donné que Powershell traite les affectations de cette manière comme des listes, si la liste
contient plus de valeurs que les éléments de votre liste de variables, la dernière variable devient
un tableau des valeurs restantes. Cela signifie que vous pouvez aussi faire des choses comme
ceci:
Tableaux
https://riptutorial.com/fr/home 214
La déclaration de tableau dans Powershell est presque identique à l'instanciation de toute autre
variable, c'est-à-dire que vous utilisez une syntaxe $name = . Les éléments du tableau sont
déclarés en les séparant par des virgules ( , ):
$myArrayOfInts = 1,2,3,4
$myArrayOfStrings = "1","2","3","4"
Ajout à un arry
L'ajout à un tableau est aussi simple que l'utilisation de l'opérateur + :
$myArrayOfInts = $myArrayOfInts + 5
//now contains 1,2,3,4 & 5!
$myArrayOfInts = 1,2,3,4
$myOtherArrayOfInts = 5,6,7
$myArrayOfInts = $myArrayOfInts + $myOtherArrayOfInts
//now 1,2,3,4,5,6,7
https://riptutorial.com/fr/home 215
Chapitre 73: Variables intégrées
Introduction
PowerShell offre une variété de variables "automatiques" utiles. Certaines variables automatiques
ne sont remplies que dans des circonstances spéciales, tandis que d'autres sont disponibles
globalement.
Examples
$ PSScriptRoot
Cet exemple récupère la liste des éléments enfants (répertoires et fichiers) du dossier dans lequel
réside le fichier de script.
La variable automatique $PSScriptRoot est $null si elle est utilisée à l'extérieur d'un fichier de code
PowerShell. S'il est utilisé dans un script PowerShell, il définit automatiquement le chemin d'accès
complet au système de fichiers vers le répertoire contenant le fichier de script.
Dans Windows PowerShell 2.0, cette variable est valide uniquement dans les modules de script
(.psm1). Depuis Windows PowerShell 3.0, il est valide dans tous les scripts.
$ Args
$Args
Contient un tableau des paramètres non déclarés et / ou des valeurs de paramètres transmis à
une fonction, à un script ou à un bloc de script. Lorsque vous créez une fonction, vous pouvez
déclarer les paramètres en utilisant le mot-clé param ou en ajoutant une liste de paramètres
séparés par des virgules entre parenthèses après le nom de la fonction.
Dans une action d'événement, la variable $ Args contient des objets qui représentent les
arguments d'événement de l'événement en cours de traitement. Cette variable est renseignée
uniquement dans le bloc Action d'une commande d'enregistrement d'événement. La valeur de
cette variable se trouve également dans la propriété SourceArgs de l'objet PSEventArgs
(System.Management.Automation.PSEventArgs) renvoyée par Get-Event.
$ PSItem
https://riptutorial.com/fr/home 216
Identique à $_ . Contient l'objet actuel dans l'objet pipeline. Vous pouvez utiliser cette variable
dans des commandes qui exécutent une action sur chaque objet ou sur des objets sélectionnés
dans un pipeline.
$?
$ erreur
Contient un tableau d'objets d'erreur qui représentent les erreurs les plus récentes. L'erreur la plus
récente est le premier objet d'erreur du tableau ($ Error [0]).
Pour éviter qu'une erreur ne soit ajoutée au tableau $ Error, utilisez le paramètre commun
ErrorAction avec une valeur Ignore. Pour plus d'informations, consultez
about_CommonParameters ( http://go.microsoft.com/fwlink/?LinkID=113216) .
https://riptutorial.com/fr/home 217
Chapitre 74: WMI et CIM
Remarques
CIM vs WMI
À partir de PowerShell 3.0, il existe deux manières de travailler avec des classes de gestion dans
PowerShell, WMI et CIM. PowerShell 1.0 et 2.0 ne prenaient en charge que le module WMI,
désormais remplacé par le nouveau module CIM amélioré. Dans une version ultérieure de
PowerShell, les cmdlets WMI seront supprimées.
Get-CimInstance Get-WmiObject Obtient des objets CIM / WMI pour une classe
Invoke-
Invoke-CimMethod Invoque une méthode de classe CIM / WMI
WmiMethod
Supprimer-
Remove-CimInstance Supprimer l'objet CIM / WMI
WmiObject
Set-
Set-CimInstance Met à jour / enregistre l'objet CIM / WMI
WmiInstance
Get-WmiObject
Get-CimClass Liste des classes CIM / WMI
-List
https://riptutorial.com/fr/home 218
Ressources additionnelles
Dois-je utiliser CIM ou WMI avec Windows PowerShell? @ Hé, le scripteur! Blog
Examples
Interroger des objets
CIM / WMI est le plus souvent utilisé pour interroger des informations ou la configuration sur un
périphérique. Une classe qui représente une configuration, un processus, un utilisateur, etc. Dans
PowerShell, il existe plusieurs manières d'accéder à ces classes et instances, mais les méthodes
les plus courantes sont les applets de commande Get-CimInstance (CIM) ou Get-WmiObject (WMI).
3.0
CIM:
WMI:
En utilisant un filtre
Vous pouvez appliquer un filtre pour obtenir uniquement des instances spécifiques d'une classe
CIM / WMI. Les filtres sont écrits en utilisant WQL (par défaut) ou CQL (ajoutez -QueryDialect CQL ).
-Filter utilise la partie WHERE d'une requête WQL / CQL complète.
3.0
CIM:
https://riptutorial.com/fr/home 219
Get-CimInstance -ClassName Win32_Process -Filter "Name = 'powershell.exe'"
WMI:
...
Caption : powershell.exe
CommandLine : "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
CreationClassName : Win32_Process
CreationDate : 20160913184324.393887+120
CSCreationClassName : Win32_ComputerSystem
CSName : STACKOVERFLOW-PC
Description : powershell.exe
ExecutablePath : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
ExecutionState :
Handle : 4800
HandleCount : 673
....
3.0
CIM:
3.0
CIM:
https://riptutorial.com/fr/home 220
WMI:
__GENUS : 2
__CLASS : AntiVirusProduct
__SUPERCLASS :
__DYNASTY : AntiVirusProduct
__RELPATH : AntiVirusProduct.instanceGuid="{D68DDC3A-831F-4fae-9E44-
DA132C1ACF46}"
__PROPERTY_COUNT : 6
__DERIVATION : {}
__SERVER : STACKOVERFLOW-PC
__NAMESPACE : ROOT\SecurityCenter2
__PATH : \\STACKOVERFLOW-
PC\ROOT\SecurityCenter2:AntiVirusProduct.instanceGuid="{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
displayName : Windows Defender
instanceGuid : {D68DDC3A-831F-4fae-9E44-DA132C1ACF46}
pathToSignedProductExe : %ProgramFiles%\Windows Defender\MSASCui.exe
pathToSignedReportingExe : %ProgramFiles%\Windows Defender\MsMpeng.exe
productState : 397568
timestamp : Fri, 09 Sep 2016 21:26:41 GMT
PSComputerName : STACKOVERFLOW-PC
Il existe de nombreuses classes disponibles dans CIM et WMI qui sont séparées en plusieurs
espaces de noms. L'espace de noms le plus courant (et par défaut) dans Windows est root/cimv2 .
Pour trouver la bonne classe, il peut être utile de lister tout ou chercher.
3.0
CIM:
Get-CimClass
WMI:
Get-WmiObject -List
Rechercher un cours
Vous pouvez rechercher des classes spécifiques à l'aide de caractères génériques. Ex: Trouver
des classes contenant le mot process .
https://riptutorial.com/fr/home 221
3.0
CIM:
NameSpace: ROOT/CIMV2
WMI:
3.0
CIM:
NameSpace: ROOT/SecurityCenter2
https://riptutorial.com/fr/home 222
FirewallProduct {} {displayName, instanceGuid,
pathToSignedProductExe, pathToSignedReportingE...
WMI:
3.0
CIM:
Name PSComputerName
---- --------------
subscription
DEFAULT
CIMV2
msdtc
Cli
SECURITY
HyperVCluster
SecurityCenter2
RSOP
PEH
StandardCimv2
WMI
directory
Policy
virtualization
Interop
Hardware
ServiceModel
SecurityCenter
Microsoft
aspnet
Appv
WMI:
https://riptutorial.com/fr/home 223
Crédits
S.
Chapitres Contributeurs
No
3 Alias jumbo
Anonymiser les
adresses IP (v4 et
5 v6) dans un fichier NooJ
texte avec
Powershell
Application des
6 autosvet, Frode F., jumbo, RamenChef
prérequis du script
Automatisation de
7 Giulio Caccin, Ranadip Dutta
l'infrastructure
Comment
télécharger le dernier
11 artefact d'Artifactory ANIL
en utilisant le script
Powershell (v2.0 ou
https://riptutorial.com/fr/home 224
inférieur)?
Communication TCP
13 autosvet, RamenChef, Richard
avec PowerShell
Comportement de
Bert Levrau, camilohe, Eris, jumbo, Ranadip Dutta, Thomas
14 retour dans
Gerot
PowerShell
Configuration d'état
15 autosvet, CmdrTchort, Frode F., RamenChef
souhaitée
Conventions de
16 niksofteng
nommage
Création de
ressources DSC
18 Trevor Sullivan
basées sur les
classes
Executables en
21 RamenChef, W1M0R
cours d'exécution
Expressions
22 Frode F.
régulières
Flux de travail
23 Trevor Sullivan
PowerShell
https://riptutorial.com/fr/home 225
27 GUI dans Powershell Sam Martin
Incorporation de
29 ajb101
code géré (C # | VB)
La gestion des
33 Prageeth Saravanan
erreurs
Ligne de commande
35 Frode F.
PowerShell.exe
Logique
36 Liam, lloyd, miken32, TravisEz13
conditionnelle
Module
37 Lachie White
ActiveDirectory
Module de tâches
39 Sam Martin
planifiées
Modules, scripts et
43 Frode F., Ranadip Dutta, Xalorous
fonctions
Opérations
46 Euro Micelli, Ranadip Dutta, TravisEz13
d'ensemble de base
Paramètres
47 autosvet, jumbo, RamenChef
communs
https://riptutorial.com/fr/home 226
Paramètres
48 dynamiques Poorkenny
PowerShell
Postes de travail
49 Clijsters, mattnicola, Ranadip Dutta, Richard, TravisEz13
PowerShell
PowerShell
"Streams"; Debug,
50 Verbose, Warning, DarkLite1, Dave Anderson, megamorf
Error, Output et
Information
PSScriptAnalyzer -
54 Analyseur de script Mark Wragg, mattnicola
PowerShell
Reconnaissance
55 Amazon Web Trevor Sullivan
Services (AWS)
requêtes sql
56 Venkatakrishnan
powershell
Sécurité et
58 YChi Lu
cryptographie
Service de stockage
59 simple Amazon Web Trevor Sullivan
Services (AWS) (S3)
Travailler avec des autosvet, Frode F., Giorgio Gambino, Lieven Keersmaekers,
61
fichiers XML RamenChef, Richard, Rowshi
Travailler avec le Alban, Atsch, Clijsters, Deptor, James Ruskin, Keith, oɔɯǝɹ,
63
pipeline PowerShell Sam Martin
https://riptutorial.com/fr/home 227
URL encoder /
64 VertigoRay
décoder
Utilisation du
65 Frode F., Madniz, mattnicola, RamenChef
système d'aide
Utiliser la barre de
67 Clijsters, jumbo, Ranadip Dutta
progression
Utiliser
68 Brant Bobby, Charlie Joynt, Schwarzie2478
ShouldProcess
Variables
70 automatiques - partie Roman
2
Variables
71 autosvet
d'environnement
https://riptutorial.com/fr/home 228
Get-WmiObject is an older cmdlet used to retrieve management information, but Get-CimClass is part of the newer CIM cmdlets and more efficient, using standard WS-Man, which is firewall-friendly and supports cross-platform management. While Get-WmiObject works well on older systems using DCOM, CIM cmdlets are preferable for performance and compatibility on modern environments .
The PSModulePath environment variable defines directories where PowerShell looks for modules. Modules located in these paths are automatically discovered and can be imported with Import-Module without specifying a full path. It affects module discovery by streamlining module management and reducing manual configuration of module paths .
PowerShell functions contribute to efficient code reuse by encapsulating common tasks into named blocks of code, which can be reused across scripts. This reduces duplication, simplifies updating multiple scripts, and facilitates modular design by creating libraries of reusable functions, improving maintainability and readability .
In PowerShell, the $Matches automatic variable stores the results of the last successful regex match when using the -match operator. It allows users to access groups and individual matches easily. For instance, when a string is matched against a pattern, $Matches holds details such as group information and matching substrings .
To execute a PowerShell workflow with input parameters, define the parameters in the workflow block similar to functions and pass values when calling the workflow. Workflows are distinct because they run in the Windows Workflow Foundation rather than the PowerShell engine and are suited for long-running tasks with features like persistence and parallel execution .
In PowerShell, the results of each instruction are returned as output even without an explicit return keyword or indication that the end of scope has been reached. Unlike C or C#, where only values specified by the return keyword are returned, PowerShell does not require an explicit return statement, making the return logic implicit .
The PowerShell pipeline allows users to pass the output of one cmdlet directly as input to the next, facilitating streamlined and efficient data processing. For example, using Get-ChildItem | Select-Object Name will display only the Name property of items returned by Get-ChildItem. This chaining capability reduces the need for intermediate variables and enables more concise scripts .
To make PowerShell aliases persistent across sessions, you can import aliases from an Excel file into your session at the beginning of your work. This is necessary because aliases created with the Set-Alias cmdlet are only available during the current session and will not persist after the session is closed .
PowerShell modules encapsulate functions and elements by organizing them within a .psm1 file, often sourcing individual function scripts. Using Export-ModuleMember allows selective exposure of module internals, controlling what functions, variables, or aliases are accessible. This increases modularity, reuseability, and prevents namespace conflicts in larger projects .
The -AllMatches switch in Select-String is used to find all occurrences of a pattern in the input string, returning multiple matches, unlike a simple match operation which returns only the first match. This allows users to gather comprehensive pattern data across entire inputs, enabling more detailed text processing .