Les bases de PowerShell

PowerShell

Séquences d’échappement

Le caractère d’échappement Windows PowerShell est l’accent grave (`). Pour rendre un caractère littéral, faites-le précéder de `.

Séquences d’échappement spéciales

Caratères d'échappementRésultat
`nNouvelle ligne
`rRetour chariot
`tTabulation
`aAlarm
`bBackspace
`'Guillemet simple
`"Guillemet double
`0Null
``Backtick

Méthodes de traitement d’objets

Ces méthodes permettent de traiter des objets. Par exemple scinder un chaine de caractère.

$file = "fichier.txt"
$file.Split(".")[-1]
txt

Ou moins utile, connaitre la position du premier « l » dans « Hello ».

("Hello").IndexOf("l")
2

Méthodes pour le traitement d’objets.

FunctionDescriptionExample
CompareTo()Compare une chaine avec une autre("Hello").CompareTo("Hello")
Contains()Retourne "True" si la cahine de compairaison spécifié est présent dans une chaine ou si la chaine de comparaison est vide("Hello").Contains("ll")
CopyTo()Copie une partie d'une chaine dans une autre("User!").CopyTo(0, , 6, 5)
EndsWith()Test si la chaine termine avec la chaine spécifié("Hello").EndsWith("lo")
Equals()Test si une chaine est identique à une autre chaine("Hello").Equals()
IndexOf()Retourne l'index de la première occurrence de la chaine de comparaison("Hello").IndexOf("l")
IndexOfAny()Retourne l'index de la première occurrence de la chaine de comparaisonReturns the index of the first occurrence of any character in a comparison string("Hello").IndexOfAny("loe")
Insert()Insert une chaine à l'index spécifié d'une autre chaine("Hello World").Insert(6, "brave ")
GetEnumerator()Récupère un objet qui peut énumérer tous les caractères d'une chaîne("Hello").GetEnumerator()
LastIndexOf()Recherche l'index de la dernière occurrence d'un caractère spécifié("Hello").LastIndexOf("l")
LastIndexOfAny()Recherche l'index de la dernière occurrence d'un caractère d'une chaîne spécifiée("Hello").LastIndexOfAny("loe")
PadLeft()Remplissage d'une chaîne à une longueur déterminée et qui ajoute des caractères blancs à gauche (aligné à droite de chaîne)("Hello").PadLeft(10)
PadRight()Remplissage d'une chaîne à une longueur déterminée et qui ajoute des caractères blancs à droite (aligné à gauche de chaîne)("Hello").PadRight(10) + "World!"
Remove()Supprime le nombre requis de caractères à partir d'une position spécifiée("Hello World").Remove(5,6)
Replace()Remplace un caractère par un autre caractère("Hello World").Replace("l", "x")
Split()Convertit une chaîne avec des points de séparation spécifiés dans un tableau("Hello World").Split("l")
StartsWith()Test si une chaîne commence par un caractère spécifié("Hello World").StartsWith("He")
Substring()Extrait les caractères d'une chaîne("Hello World").Substring(4, 3)
ToCharArray()Convertit une chaîne en un tableau de caractères("Hello World").toCharArray()
ToLower()Convertit une chaîne en minuscules("Hello World").toLower()
ToLowerInvariant()Convertit une chaîne en minuscules à l'aide des règles de casse de la langue invariant("Hello World").toLowerInvariant()
ToUpper()Convertit une chaîne en majuscules("Hello World").toUpper()
ToUpperInvariant()Convertit une chaîne en majuscules à l'aide des règles de casse de la langue invariant("Hello World").ToUpperInvariant()
Trim()Supprime les caractères en blanc à droite et à gauche(" Hello ").Trim() + "World"
TrimEnd()Supprime les caractères vide à droite(" Hello ").TrimEnd() + "World"
TrimStart()Supprime les caractères en blanc à la gauche(" Hello ").TrimStart() + "World"
Chars()Fournit un caractère à la position spécifiée("Hello").Chars(0)

Variables automatiques

VariableDescription
$$Dernier jeton de la ligne de commande précédente
$?État booléen de la dernière commande
$^Premier jeton de la ligne de commande précédente
$_Objet de pipeline actif
$ArgsArguments passés à un script ou à une fonction
$ErrorTableau d’erreurs de commandes précédentes
$ForeachRéférence à l’énumérateur d’une boucle foreach
$HomeRépertoire de base de l’utilisateur ; généralement défini sur %HOMEDRIVE%%HOMEPATH%
$HostRéférence à l’application qui héberge le langage POWERSHELL
$InputÉnumérateur des objets dirigés vers un script
$LastExitCodeCode de sortie du dernier programme ou script
$MatchesTable de hachage des correspondances trouvées avec l’opérateur de correspondance –
$PSHomeEmplacement d’installation de Windows PowerShell
$profileProfil standard (peut ne pas être présent)
$StackTraceDernière exception interceptée par Windows PowerShell
$SwitchÉnumérateur d’une instruction switch

Chaînes

L’utilisation des guillemets simple ou double a son importance avec PowerShell. Elles permettent de résoudre ou non des opérations arithmétiques.

$resultat  = 'Le resultat est : $(5+3)'
$resultat
Le resultat est : $(5+3)
$resultat  = "Le resultat est : $(5+3)"
$resultat
Le resultat est : 8

Elles permettent de résoudre où non les variables.

$res = $(5+3)
$resultat  = 'Le resultat est : $res'
$resultat
Le resultat est : $res
$resultat  = "Le resultat est : $res"
$resultat
Le resultat est : 8

Elles autorisent l’insertion des caractères spéciaux grâces aux caractères d’échappement.

"Inserer une tabulation entre A et B: A`tB"
Inserer une tabulation entre A et B: A  B

Opérateurs de chaîne Les opérateurs de chaines vous permettent de manipuler des chaines de caractères.

"Bonjour Christophe" -Replace "Christophe","Sébastien"

Voici la liste des opérateurs disponibles.

OpérateurDescriptionExemple
*Répète une chaine"-" * 20
+Concatène des chaines"Bonjour " + "Pierre"
-replaceRemplace une chaine (Insensible à la case)"Bonjour Pierre" -replace "Pierre","Paul"
-creplaceRemplace une chaine (Sensible à la case)"Bonjour Pierre" -replace "pierre","paul"
-eqVérifie l'égalité (Insensible à la case)"Pierre" -eq "pierre"
-ceqVérifie l'égalité (Sensible à la case)"Pierre" -ceq "pierre"
-likeVérifie qu'une chaine contient une autre chaine (Insensible à la case, Accept *)"Pierre" -like "Pier*"
-clikeVérifie qu'une chaine contient une autre chaine (Sensible à la case, Accept *)"Pierre" -clike "Pier*"
-notlikeVérifie qu'une chaine ne contient pas une autre chaine (Insensible à la case, Accept *)"Pierre" -notlike "Pier*"
-cnotlikeVérifie qu'une chaine contient une autre chaine (Insensible à la case, Accept *)"Pierre" -cnotlike "Pier*"
-matchVérifie qu'une chaine contient une autre chaine (Insensible à la case)"Pierre" -match "rr"
-cmatchVérifie qu'une chaine contient une autre chaine (Sensible à la case)"Pierre" -cmatch "rr"
-notmatchVérifie qu'une chaine ne contient pas une autre chaine (Insensible à la case)"Pierre" -notmatch "rr"
-cnotmatchVérifie qu'une chaine contient une autre chaine (Insensible à la case)"Pierre" -cnotmatch "rr"

Switch

$lang représente la valeur actuelle évaluée. Si un tableau est utilisé dans switch, chaque élément du tableau est testé.

$lang = (Get-WmiObject Win32_OperatingSystem -ComputerName SERVER001).oslanguage
$switch = switch ($lang) `
{
1033 {"English"};
1036 {"French"};
default {"Unknown"}
}
$switch

Conditions (If, Else, ElseIf)

L’instruction « If » est peut-être la plus fondamental des options de contrôle disponibles dans PowerShell.
Si l’expression est évaluée à $True alors le script présent dans le corps de l’instruction est exécutée. Si l’expression est évaluée à $False le code dans le corps de la déclaration est sautée.

$r = Read-Host
if ($r -eq "10"){ "Le nombre est 10." }

La variation « Esle » de l’instruction « If » nous permet également de spécifier du code à exécuter si l’expression dans l’instruction « If » est évaluée à $False.

$r = Read-Host
if ($r -eq "10"){ "Le nombre est 10." }
else { "Le nombre n'est pas 10." }

Enfin, il est parfois nécessaire de prendre des décisions fondées sur un certain nombre de critères différents. Il est alors nécessaire d’utiliser le « If » et « Elseif ».

$r = Read-Host
if ($r -eq "10"){ "Le nombre est 10." }
elseif ($r -eq "5"){ "Le nombre est 5." }
else { "Le nombre n'est ni 5 ni 10." }

Boucles (Foreach-Object)

L’utilisation de la cmdlet Foreach-Object ou de son alias Foreach permet de parcourir les valeurs d’un collection et par chacune, exécuter un instruction.

$valeurs = 1,2,3,4,5
Foreach($valeur in $valeurs){ "Le chiffre est $valeur"}

Foreach peut suivre un pipe, il permet alors d’utilisé les valeurs issues de la commande précédent le pipe.

(1..10) | Foreach {"Le chiffre est $_"}

Opérateurs logiques

Les opérateurs logiques permettent de vérifier plusieurs comparaisons dans le même expression.

$r = 5
($r -gt 2) -and ($r -lt 8)
True

Les opérateurs logiques disponibles sont

OpérateurSignification
-andEt logique
-orOu logique
-xorOu exclusif
-notNon logique
!Non logique

20 réflexions sur « Les bases de PowerShell »

  1. Seb

    Je pense qu’il y a une erreur:
    IndexOf retourne la position (en commençant à 0) de la 1ère occurrence de la chaîne de caractères.
    Exemples:
    (« Helllo »).IndexOf(« l ») retourne 2
    (« Hello »).IndexOf(« lo ») retourne 3

    Répondre
  2. Seb

    @Seb
    Précision:
    dans le tableau, la description de cette fonction est exacte.
    l’erreur est d’écrire que IndexOf permet de compter le nombre de « l » dans « Hello ».

    Répondre
  3. Ping : Script PowerShell synchronisation Active Directory avec une liste SharePoint ← Fortis Fio

  4. Alexandre

    Merci Christophe Bluteau
    Je viens de lire votre article et je me régale
    (étudiant Certifs MS 70-642 et 70-640)
    Alexandre

    Répondre
  5. Ping : macys in store coupons april 2013

  6. jean87

    salut
    aider moi à ecrire avec powershell un script de sauvegarde de données automatique sous windows 7 pour mon rapport
    debutant en progammation
    merci bien

    Répondre
  7. jumeau

    Bonjour,

    Dans le cadre d’obtention de mon diplôme de fin d’année, j’aurai besoin de faire un script en powershell.
    Voici le besoin:

    Créer un script que l’on exécutera grâce aux tâches planifiées qui aura pour but d’écrire dans le fichier c:\result.log les noms des fichiers de plus de 200Mo dans le répertoire c:\Users\Public (et ses sous répertoires).
    Si le script n’a pas lancé depuis plus de 7 jours, un message l’indiquera au début du fichier, la date de dernière
    exécution étant enregistrée dans la base de registres avec le nombre de fichiers trouvés. Dans le journal des événements Application, on pourra suivre la date et l’heure de début et de fin d’exécution du script. A chaque nouvelle exécution, le fichier result.log existant déjà est conservé sous le nom result.log.back

    Merci d’avance pour votre aide

    Répondre
  8. Christophe

    Bonjour Christophe
    Je reste toujours admiratif des gens qui prennent le temps (la 25e heure?) de mettre autant d’informations de qualité à disposition des internautes.
    MERCI +++

    @aux étudiants : CTRL C+V n’est pas étudier…. sauf si vous êtes étudiant Manager

    Bon script et bonne journée
    Christophe

    Répondre
  9. alex conrad

    BONJOUR,

    Je ne connais rien en Scripting, cependant je dois via Power Shell créer un script qui me permet de récupérer sur nos serveur client d’un même domaine des infos de McAfee dans la base de registre.

    J’ai déjà commencé le script il fonctionne bien en local, mais je n’arrive pas a faire redirigé le résultat de mes 2 lignes de code vers un seul fichier report.txt et ensuite de le convertir en report.csv.

    voici mes lignes de codes:
    cd hklm:

    get-itemproperty .\software\wow6432node\Mcafee\avengine -name avdatdate,avdatversion,engineversionmajor,engineversionminor
    Get-ItemProperty .\SYSTEM\CurrentControlSet\control\ComputerName\ComputerName -Name computername

    Merci de votre aide si vous le pouvez.
    bonne soirée a vous

    Cordialement
    MRConrad

    Répondre
  10. Yohann Journiac

    Bonjour.

    Juste pour dire votre article est mon aide-mémoire du quotidien.
    Merci de l’avoir rédigé, ça m’aide très souvent.

    Répondre
  11. fredyyy

    Bonjour a tous

    j’essaye de récupérer dans un fichier TXT ou XML, tous les nom (…..) qui
    sont entre et

    ……..
    ……..
    ……..
    ……..
    ……..

    j’ai essayer d’utiliser une commande mais je n’est pas réussi
    Select-String -Path « C:\temp\14.txt » -Pattern «  »
    get-content file.txt | where {$_ -match «  »} | foreach
    {$_.SubString($_.IndexOf(«  »)+1)}

    Merci pour votre aide

    Répondre
  12. lucie

    Bonjour j’ essaye de faire une liste des repertoires sous repertoires et fichiers avec leurrs nom type date date de modification mots clés saisis dans l explorateur windows. Merci bien

    Répondre
  13. kouakou

    Tâches
    Créer un dossier pour chaque type de pokémon distinct (colonne « Type1 »). Le nom du dossier est la valeur de la colonne « Type1 »
    Particularités
    Un ordre de trie pour la création des dossiers est nécessaire. C’est le premier paramètre reçu qui détermine le trie.
    Pour le trie, un « C » reçu provoque la création des dossiers en ordre croissant ; un « D » reçu provoque la création des dossiers en ordre décroissant. Si aucune valeur est données, la valeur par défaut du paramètre est « R » et les dossiers sont créés en ordre d’apparission dans le fichier. Toutes autres valeurs pour le paramètre de trie provoque l’affichage du message « ne peut procéder – trie impossible ».

    Un paramètre pour définir l’emplacement de destination des dossiers est nécessaire. Un dossier de destination inexistant provoque l’affichage du message « ne peut procéder – destination inexistante ».

    Langage:PowerShell
    Svp quelqu’un pourrait me donner la solution a cet exercie je suis debutant en powershell

    Répondre
  14. BiancaJuicy

    Hi. I see that you don’t update your site too often. I know that writing articles is
    boring and time consuming. But did you know that there is a
    tool that allows you to create new posts using existing content (from article directories or other pages from your niche)?
    And it does it very well. The new articles are high quality and pass the copyscape test.
    You should try miftolo’s tools

    Répondre
  15. jeannet

    Bonjour
    je souhaiterais manipuler les données d’un tableau
    $tsite=@(« SITE », »MEL », »DATE »)
    $tsite+=@{SITE= »paris »; MEL= »4″; DATE= »2018-07-01}
    $tsite+=@{SITE= »paris »; MEL= »0″;DATE= »2018-07-02″}
    $tsite+=@{SITE= »paris »; MEL= »0″;DATE= »2018-07-03″}
    $tsite+=@{SITE= »paris »; MEL= »2″;DATE= »2018-07-04″}
    $tsite+=@{SITE= »londres »; MEL= »4″;DATE= »2018-07-01″}
    $tsite+=@{SITE= »moscou »; MEL= »0″;DATE= »2018-07-02″}
    $tsite+=@{SITE= »londres »; MEL= »0″;DATE= »2018-07-03″}
    $tsite+=@{SITE= »barcelone »; MEL= »2″;DATE= »2018-07-04″}

    Le but est de faire les sommes de mel par ville et d’obtenir dans ce cas la le résultat suivant
    $ttsite =
    paris 6
    londres 4
    moscou 0
    Barcelone 2

    je bloque sur la commande a passer pour faire les sommes de mel pour chaque site

    Répondre
  16. Joli

    $tsite=@()
    $tsite+=@{SITE= »paris »;MEL=4;DATE= »2018-07-01″}
    $tsite+=@{SITE= »paris »;MEL=0;DATE= »2018-07-02″}
    $tsite+=@{SITE= »paris »;MEL=0;DATE= »2018-07-03″}
    $tsite+=@{SITE= »paris »;MEL=2;DATE= »2018-07-04″}
    $tsite+=@{SITE= »londres »;MEL=4;DATE= »2018-07-01″}
    $tsite+=@{SITE= »moscou »;MEL=0;DATE= »2018-07-02″}
    $tsite+=@{SITE= »londres »;MEL=0;DATE= »2018-07-03″}
    $tsite+=@{SITE= »barcelone »;MEL=2;DATE= »2018-07-04″}

    Set-Variable __SommeSITE_* -value $NULL
    $tsite.GetEnumerator() | %{
    $NOM=$( « __SommeSITE_ » + $_.item(« SITE ») )
    [INT]$ancienne_VALEUR=$( Get-Variable -name $(${NOM}) -ValueOnly -ErrorAction:SilentlyContinue )
    [INT]$VALEUR=$( ${ancienne_VALEUR} + $_.item(« MEL ») )
    Write-Host « -NOM=${NOM}`tVALEUR=${VALEUR}`tancienne_VALEUR=${ancienne_VALEUR} »
    Set-Variable -name $( ${NOM} ) -Value $( ${VALEUR} )
    }
    Write-Host « `n`n[Total par SITE ci-dessous] »
    Get-Variable __SommeSITE_*

    Répondre
  17. khalil

    bonjour,
    je travaille pour un projet pour migrer les données de sqlserver à oracle,
    je veut convertir les type et j’ai écrire ce script :

    $scriptpath = »C:\Users\User\Desktop »
    $options.FileName = $scriptpath + « \$tables.sql »
    New-Item $options.FileName -type file -force | Out-Null
    $original_file = ‘C:\Users\User\Desktop\WINDEV1811EVAL\hra_tables.sql’
    $destination_file = ‘C:\Users\User\Desktop\tabl_tables.sql’
    (Get-Content $original_file) | Foreach-Object {

    $_ -replace ‘varchar’, ‘varchar2’ `
    -replace ‘tinyint’, ‘NUMBER’ `
    -replace ‘int’, ‘NUMBER’ `
    } | Set-Content $destination_file
    Write-Host « mapping data type complete »

    **************************************
    le problème q’il me change meme CONSTRAINT à CONSTRAnumber
    AINSI que le type contient un taille
    exemple : [VARCHAR](50) ET c’est pas le même dans oracle.
    pouvez vous m’aidez
    merci

    Répondre
  18. Framb

    Bonjour,
    j’aimerais renommer tout un lot de fichier (qui sont en .tif) avec PowerShell.
    En suivant vos conseils, j’ai transformé la commande linux et ça donne ça mais ça ne marche toujours pas !
    foreach (f in *.tif) {newfilename= »${f:1:10}19_bon.tif » ; mv $f $newfilename}
    la commande linux de départ était :
    for f in *tif ; do newfilename= »${f:1:10}19_bon.tif » ; mv $f $newfilename ; done
    merci beaucoup

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *