Powershell

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Shell & langage de script Windows
Éditeurs PowerShell ISE, VS Code
Voir aussi New-object · Get-wmiobject · Powershell AD module

PowerShell est le shell et le langage de script d'administration de Microsoft, orienté objet et bâti sur le framework .NET. Cette page rassemble les bases du langage.

Découvrir les commandes

Get-Command -CommandType function
Get-Command -CommandType alias
Get-Command -CommandType cmdlet
Get-Command get-*
Get-Command *-item

# Filtrer par nom / verbe
Get-Command -Noun object
Get-Command -Verb write

Aide

help Measure-Object -Detailed
help Measure-Object -Full
help Measure-Object -Online
Get-Help Get-Command -Detailed | more

Variables et types

[int]$var = 12
[char]$c  = 'A'
$chaine   = "toto"
$tab      = @("chaine1", "chaine2")

$var | Get-Member
$var.GetType()

Conversions :

[int][char]'B'          # char -> int
$var.ToString()
[System.Convert]::ToString($var, 8)   # base 8
[System.Convert]::ToString($var, 2)   # base 2

Variables prédéfinies

$$          dernier mot de la dernière commande
$^          premier mot de la dernière commande
$?          code retour de la dernière opération
$_          objet courant dans un pipe
$Args       tableau des paramètres du script
$Error      tableau des erreurs de la session
$PID        PID du processus PowerShell
$PWD        répertoire courant
$Profile    chemin du profil PowerShell

Opérateurs

Par défaut, les opérateurs de comparaison ne respectent pas la casse.

+ - * / %
-eq -ne -gt -ge -lt -le
-like -notlike
-match -notmatch
-is -isnot
-and -or -not ! -xor
-replace  -split  -join
$a .. $b        opérateur de plage

Tableaux

[int[]]$tab = 1,2,3
$tab = [int]1, [double]2.5, [char]'A'
$tab[0,2]
$tab[$tab.Length - 1]
$tab.SetValue('C', 0)

# Tableau associatif (hashtable)
$h = @{ cle1 = 'element'; cle2 = 'element' }
$h['cle1']
$h.cle2

Boucles

# While
$n = 0
$tab = 0..99
while ($n -lt $tab.Length) { Write-Host $tab[$n]; $n++ }

# For
for ($i = 0; $i -le 99; $i++) { Write-Host $tab[$i] }

# Foreach
foreach ($p in Get-Process) {
    Write-Host "$($p.Name) démarré le : $($p.StartTime)"
}

# ForEach-Object avec -Begin / -Process / -End
Get-Process | ForEach-Object -Begin { Write-Host "début`n" } -Process { $_.Name } -End { Write-Host "`nfin" }

Structures conditionnelles

if ($var1 -ge $var2) {
    Write-Host "$var1 est plus grand que $var2"
} else {
    Write-Host "$var1 est plus petit que $var2"
}

switch ($nombre) {
    1 { Write-Host "c'est 1" }
    2 { Write-Host "c'est 2" }
    default { Write-Host "non pris en charge" }
}

Fonctions

function Set-Popup {
    param([string]$message, [string]$titre)
    $wshell = New-Object -ComObject WScript.Shell
    $wshell.Popup($message, 0, $titre)
}

Set-Popup -titre 'Mon titre' -message 'Bonjour'

Fonction filtre :

filter Filtre-Repertoire {
    if ($_.Mode -like "d*") { $_ }
}
Get-ChildItem | Filtre-Repertoire

Portée des variables

$global:valeur++      # accessible partout
$script:valeur = 10   # accessible au script courant
$private:valeur = 10  # accessible à la fonction seule

Cmdlets avancées

function MapDrive {
    [CmdletBinding()]
    param ([string]$lettre, [string]$partage)
    $obj = New-Object -ComObject WScript.Network
    $obj.MapNetworkDrive("${lettre}:", $partage)
}

Paramètre issu du pipe / obligatoire :

[CmdletBinding()]
param (
    [Parameter(ValueFromPipeline=$true, Mandatory=$true)]$valeur
)

Profil

$Profile
New-Item -Path $Profile -ItemType File -Force

Voir aussi