$PSVersionTable
Par défaut, l'exécution de scripts PowerShell ne sont pas permis1). Pour se faire, il faut exécuter PowerShell en Administrateur et exécuter cette commande:
Set-ExecutionPolicy RemoteSigned
On peut spécifier une variable tout simplement en lui assignant une valeur:
$var="Ceci est une chaîne." $nombre = 5 $fichiers = dir C:\
Les variables d'environnement on comme leur propre namespace $env:
. Par exemple, pour le PATH
, il faut le référencer par $env:PATH
.
Write-Host $env:PATH Write-Host "App Version: $($env:APP_VERSION)"
Pour la liste des variables d'environnement, on peut faire Get-ChildItem Env:
.
Pour de l'aide sur une commande, on peut faire Get-Help [command]
:
PM> Get-Help Get-Service
Pour ouvrir l'aide dans un navigateur par défaut, on peut ajouter -Online
:
PM> Get-Help Get-Service
Chercher des commandes avec Get-Command
:
PM> Get-Command Stop-Azure* -Module Azure
Dans PowerShell, les chaînes peuvent être délimitées par des guillemets simples ('
, single-quote) ou doubles ("
, double-quote). Donc, ces deux valeurs sont équivalentes:
"Hello World"
'Hello World'
Utiliser les deux types de délimiteurs permet d'inclure des caractères de l'autre type, par exemple: J'utilise le PowerShell.
ou 'Il a dit "Hello World" dans son script PowerShell.'
.
Si un guillemet simple est nécessaire dans une chaîne délimitée par des guillemets simples, on peut les doubler, par exemple : 'J''utilise PowerShell.'
.
Pour initialiser une chaîne sur plusieurs lignes, on peut utilser le principe de here-string avec des '@
ou "@
:
$var='@ J'utilise les here-strings dans PowerShell '@ $var2="@ un autre exemple de here-string. "@ # En bas, ça ne fonctionnera pas $var3='@ on ne peut pas laisser d'espace devant le dernier delimiteur '@
La différence principale entre utiliser le délimiteur single-quote ou double-quote, c'est la substitution dans les chaînes. Dans les chaînes délimitées par des double-quotes, l'utilisation d'une variable dans la chaîne sera remplacée par sa valeur. Si la variable $nom
contient Stéphane
, la valeur de la chaîne "Mon nom est $nom."
sera Mon nom est Stéphane.
Si on veut utiliser la valeur d'une propriété sur une instance d'objet, on peut utiliser $($var.Property)
dans la chaîne:
Write-Output "Found $($scriptFiles.Count) files."
Normalement dans les langages de programmation, le caractère d'échappement est la barre oblique inversée (\
, backslash), mais dans PowerShell on peut s'en servir comme séparateur de répertoires dans les chemins (C:\Program Files\Application
), donc on utilise plutôt le backtick : `
.
"La valeur de la variable `$var est $var"
Par exemple, pour une commande :
Copy-Item -Recurse C:\Projets\Application` 101\Site` Web\* -ToSession $session -Destination C:\inetpub\Application` 101
$anyGO = [regex]::Match($line, 'GO')
$content = Get-Content ..\Projet\Properties\AssemblyInfo.cs $content = Convert-String -InputObject $content #echo $content $found = $content -match 'Version' echo $found if ($found) { $spid = $matches[0] } $found = $content -match 'Version\(".*"\)' #Write-Host $matches echo $found $sln | Select-String 'Version\(".*"\)' -AllMatches # $x = 'Version("{0}")' -f "1.2.3.4" # echo $x
Pour un script appelé de cette façon : script.ps1 param1 param2
, les valeurs seront dans args
qui est un tableau:
$param1=args[0] $param2=args[1]
Pour les paramètres nommés, par exemple dans script.ps1 -nom Mike
, c'est à l'aide de la fonction param()
:
param($nom) return "Le nom est $nom."
L'instruction logique la plus simple est le if
.
param($number) if ($number -eq 5) { Write-Output "Vous avez deviné le chiffre magique." } else { Write-Output "Vous n'avez pas trouvé." }
Au lieu du if
, on peut utiliser le switch
s'il y a beaucoup de résultats possibles.
switch (expression) { {test} {code block} value {code block} default {code block} }
$today=get-date switch ($today.day) { 1 { Write-Host "Jour de paie!" } 1 { Write-Host "Arroser les plantes." } 5 { Write-Host "Rappel pour payer les factures." } 10 { Write-Host "Sortir les ordures." } default { Write-Host "Rien à se rappeler aujourd'hui." } }
Les opérateurs suivant ne sont pas sensibles à la casse par défaut.
Opérateur | Description |
---|---|
-eq | Equal |
-ne | Not equal |
-ge | Greater than or equal |
-gt | Greater than |
-lt | Less than |
-le | Less than or equal |
-like | Wildcard comparison |
-notlike | Wildcard comparison |
-match | Regular expression comparison |
-notmatch | Regular expression comparison |
-replace | Replace operator |
-contains | Containment operator |
-notcontains | Containment operator |
-shl | Shift bits left (PowerShell 3.0) |
-shr | Shift bits right – preserves sign for signed values.(PowerShell 3.0) |
-in | Like -contains , but with the operands reversed.(PowerShell 3.0) |
-notin | Like -notcontains , but with the operands reversed.(PowerShell 3.0) |
Pour avoir une comparaison sensible à la casse, il faut préfixer d'un c
devant l'opérateur, par exemple -ceq
au lieu de -eq
.
Source : Comparison Operators
Supprimer un répertoire étant certain qu'il faut le supprimer:
Remove-Item -Recurse -Force repertoire
On peut ajouter -ErrorAction SilentlyContinue
si on ne veut pas avoir d'erreur si le fichier/répertoire n'existe pas.
$PSScriptRoot
: Répertoire d'exécution du script.Exemple pour télécharger des fichiers:
Invoke-WebRequest -Uri "https://awscli.amazonaws.com/AWSCLIV2.msi" -OutFile "AWSCLIV2.msi"
Si une erreur comme ceci survient:
Invoke-WebRequest : The request was aborted: Could not create SSL/TLS secure channel.
Exécuter cette commande:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
L'utilisation du trap statement ($_
) est rarement utilisé sauf quand la verison de PowerShell disponible n'est que 1.0. Comme c'est rarement utilisé, on documentera pas beaucoup cet aspect de PowerShell, seulement en montrant un exemple.
function test-trap { trap { "Une erreur est survenue: $_" } $var = 1/0 Write-Host "Fin de la fonction" }
On peut utiliser continue
ou break
dans le bloc du trap
sous la ligne "Une erreur est survenue: $_"
. La mention continue
aura pour effet de continuer l'exécution du script, sinon break
arrêtera son exécution.
Dans PowerShell 2.0 ou plus, on peut utiliser les try
, catch
et finally
dans les scripts.
try { $var=1/0 "La fonction s'est terminée correctement" } catch [System.Management.Automation.CommandNotFoundException] { "Impossible de trouver la commande $_" } catch { "Quelque chose est arrivé : $_" } finally { "Ceci s'exécute toujours." }
commande_erreur.exe exit $LASTEXITCODE
Param($path) new-item -ItemType Directory -Name $path cd $path
Pour l'arrêt momentané de l'exécution:
Start-Sleep -Seconds 600
iwr https://domain.org/script.ps1 -UseBasicParsing | iex
La déclaration:
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
Une instance de l'objet qui représente le serveur SQL:
$srv = New-Object 'Microsoft.SqlServer.Management.SMO.Server' $sqlServerInstance
Si on veut l'authentification en mode SQL:
$srv.ConnectionContext.LoginSecure=$false; $srv.ConnectionContext.set_Login($env:DB_USERNAME); $srv.ConnectionContext.set_Password($env:DB_PASSWORD)
La liste des bases de données sur $srv
:
$srv.Databases | Select name
Créer un projet .NET Standard (net46) de type Class Library et installer le package nuget Microsoft.PowerShell.5.ReferenceAssemblies
.
En développement, un DLL est créé comme tout autre projet .NET. On peut le charger dans un ISE pour l'essayer.
PM> Import-Module –Name 'C:\myRandomDirectory\myModule.dll'