- Accueil
- Info légales
- Aide (FAQ)
- Les tags de ce site
- Bloc note
- Articles techniques
- Notes system
- Divers articles
- Drupal
- Notes ITIL 2007
- Notes MS
- Dans le quartier...
- Emploi
- Recettes de cuisine et adresses gourmandes
- mes applis ubuntu préferées
- Divers acronymes du monde social
- Internet 2018
- P2 meublé à louer - quartier du Poteau 75018
- apcos - réseaux sociaux et outils
- Articles techniques
- Divers liens
- Fun
- Mon CV IT
- Nouveautés
PowerShell : bases (échapement, commentaires, boucles...)
Source: http://my-powershell.fr/aide-memoire-powershell
PS v3
Séquences d’échappement : `
accent grave (`)
Méthodes de traitement d’objets
Pour traiter objects, par ex:
scinder un chaine de caractère: | position du 1er "l" |
---|---|
PS > $file = "fichier.txt" PS> $file.split(".")[-1] txt |
PS> ("Hello").IndexOf("l")
2
2
|
=> compte à partir de 0 |
Autre ex de la http://www.ehow.com/how_7719350_split-string-two-variables-powershell.html)
: (source:$text = "Windows PowerShell - Hello world!"
$split = $text.split("-")
echo $split[0]
affiche Windows PowerShellecho $split[1]
affiche Hello world! (commence par un espace)
Note:
"Str"|Get-Member
donne méthodesfonction | ex |
---|---|
CompareTo() |
PS > ("Hello").CompareTo("Hello") 0 PS > ("Hello").CompareTo("Hi") -1 PS> ("Hello").CompareTo("Helllo") 1 PS> |
Contains() true si sous chaine ds chaine ou si sous chaine vide |
PS > ("Hello").Contains("ll") True PS > ("Hello").Contains("10") False PS > ("Hello").Contains("") True |
CopyTo() cp partie d'une chaine dans une autre |
PS > ("User!").CopyTo(0, , 6, 5) -> erreur |
EndsWith() |
PS > ("Hello").EndsWith("lo") True PS > ("Hello").EndsWith("ko") False |
... |
Chaines: guillemets simple (pas de calcul ni réso var) ou double (calcule et résout nom var)
$resultat = 'Le resultat est : $(5+3)'
$resultat
Le resultat est : $(5+3)
$resultat = "Le resultat est : $(5+3)"
$resultat
Le resultat est : 8
"Résout" ou 'non' les var.
Switch
$lang représente la valeur actuelle évaluée. Si un tableau est utilisé dans switch, chaque élément du tableau est testé. Erreur script dès la 1ere ligne
Boucles (Foreach-Object)
Source: http://powershell.com/cs/blogs/ebookv2/archive/2011/12/12/chapter-1-the-...
cmdlet Foreach-Object ou de son alias Foreach :
$valeurs = 1,2,3,4,5
Foreach($valeur in $valeurs){ "Le chiffre est $valeur"}
(1..10) | Foreach {"Le chiffre est $_"}
Entrées multilignes (>>) et commentaires (#)
Si oubli par ex d'un ", PS donne l'occasion de compléter. On voit >> faire deux fois entrée et PS lance la commande. CTRL+C annule la commande en cours (quand on voit >>). Ex:
PS > 2+
>> 6
>>
8
On peux donc écrire sur plusieurs lignes: "Ceci est une phrase (Enter)
>> vraiement très longue, sur plusieurs (Enter)
>> lignes."
Ce prompt >> (ajouté par ps) travaille en regardant les caractères en début et fin des strings, comme [] et '. S'il en manque (oubli du 2e ]) alors le prompt >> continue de s'afficher. Si le dernière caractère d'une ligne est un back-tick, la ligne continuera - mais en pressant ` on la récupère.
Calculer et parenthèses
(Dir $env:windir\*.exe).Count (Enter)
12
@() calcule et retourne un tableau
Si le dossier windows était vide ou avec 1 seul fichier alors (Dir $env:windir\*.exe).Count (Enter)
ne renvoie pas le nb d'items.
Alors que @(Dir $env:windir\*.exe -ErrorAction SilentlyContinue).Count (Enter)
calcule toujours
$() est à utiliser à l'intérieur de strings pour insérer dans du texte le résultat de lignes de code."Number of EXE files in my windows folder: `
$(@(Dir $env:windir\*.exe -ErrorAction SilentlyContinue).Count)"(Enter)
Séparateur décimal : le point
Utiliser la virgule donne un autre résultat, car crée un tableau (dans l'ex le tableau a 2 éléments: 4 et 3).
4,3 + 2 (Enter)
4
3
2
3
2
tableau + 2 : crée un tableau à 3 valeurs
Calcul, unités de calcul, type de nombres
PS reconnait: KB, MB, GB, TB et petabyte (PT) ssi pas d'espace entre nombre et MB (mais peuvent etre en minuscules). Ex "combien de cv un dvd peut-il comporter?" 4GB / 720MB (Enter)
affiche 5.68888...
Préfixer les nombre en hexadécimal par 0x => 12 + 0xAF (Enter)
affiche 187
vers une table d'équivalence nombres décimaux, hexadécimaux (et binaire) http://www.purebasic.com/french/documentation/reference/number_tab.html
Lancer des commandes externes
Saisir ipconfig ou notepad. Un commande comme ipconfig est de type texte, cad exe de facon syncrone (et la console attend que le commande soit terminée + on peux l'annuler avec CTRL+C), alors que notepad (ou autre appli) est asyncrone.
Avec ma cmdlet Start-Process on peux lancer une appli externe avec des options (autre login, ...), gérer la taille de la fenetre, demander que ps attende l'appli Windows.
Passer du dos à ps, du ps à dos : ise, powershell, cmd et exit + role du & "string"
C:\ > powershell
-> de cmd à ps
PS > cmd
C:\Windows\system32>exit
PS C:\Windows\system32>
PowerShell traite les données entre " comme des strings et les affiche de suite. Préfixé par & on s'assure que PS exe le texte:
& "C:\programs\Windows NT\accessories\wordpad.exe"
Cd "C:\programs\Windows NT\accessories" ; wordpad.exe
affiche une erreur, car PS a besoin d'un chemin absolu ou relatif => il faut lancer avec .\wordpad.exe
Pour ouvrir avec ISE un script créé:
Ise $env:temp\test.ps1
Path
$env:Path
affiche la configuration des var d'env.
Ajout du dossier "myscripts" : $env:path += ";C:\chemin-vers-rep\myscripts"
ne sera valable que dans cette session PS.
cmdlets, trouver et utiliser les paramètres
Get-Command -commandType cmdlet
Get-Command -verb getGet-Help Get-Command -detailed
Get-Command *service* -CommandType cmdlet
Par ex, Get-ChildItem affiche le contenu du dossier courant. Voir les paramètres que peux prendre Get-ChildItem (et avec ex): Get-Help Get-ChildItem -Full
section "Parameters" d'un ou tous paramètres: Get-Help Get-ChildItem -Parameter *
-> voir en PJ param.txt qui contient l'aide de : Exclude <string[]>, Filter <string[]>, Force <string[]>, Include <string[]>, LiteralPath <string[]>, Name <string[]>...
Utiliser des paramètres nommés
Les paramètres nommés fonctionnent comme une association clé/valeur. Le nom du paramètre nommé (qui doit commencer par trait d'union - hyphen en anglais) suivi d'un espace et la valeur.
Voir tous les fichiers .exe du dossier windows et de ses sous-dossiers: Get-ChildItem -path c:\windows -filter *.exe -recurse -name
On n'est pas obligé de tapper tous les caractères. Seuls quelques carcatères (qui permettent à ps de reconnaitre le param) suffisent: Get-ChildItem -pa c:\windows -fi *.exe -r -n
S'il n'y a pas assez de caractères pour que ps trouve la paramètre à coup sur, il affiche un message "the parameter name 'f' is ambiguous. Possible matches include: -Filter -Force."
Couper la reconnaissance des paramètres avec -- peux etre utile parfois
Ex: Write-Host
-BackgroundColor
Write-Host : Missing an argument for parameter 'BackgroundColor'. Specify a parameter of type "System.consoleColor" and try again.
Bien sur, on peux utiliser Write-Host "-BackgroundColor"
mais on peux aussi faire: Write-Host --BackgroundColor
Utiliser des paramètres switch (<SwitchParameter> dans l'aide)
Si le paramètre est du type oui/non : s'il est spécifié, il active une fonctionnalité, mais s'il est oublié alors la fonctionnalité n'est pas activée.
Par ex: -recursive dans l'ex "Get-ChildItem"
précédent permet de parcourir les sous-rep (et non le rep indiqué via -path). -name est aussi un paramètre de type switch, qui sort juste les noms des fichiers sous forme de chaine de car (et non leur contenu et objets dossiers).
L'aide sur Get-ChildItem l'indique en ajoutant après le nom du paramètre <SwitchParameter>
Paramètres par postion
Pour certains paramètres fréquents, ps leur assigne une position, ce qui permet d'oublier de spécifier le nom du param et de tapper directement la valeur. PS lit la commande et ses paramètres, commence par identifier les paramètres nommés, et pour les autres paramètres (non-explicitement nommés), il utilise leur position.
Ex: Get-ChildItem c:\windows *.exe
En regardant le .txt joint on voit que le paramètre -path a la position 1 et est optionnelle, par défaut = dossier courant. -filter a la position position 2 donc est correctement interprété.
C'est utile et pratique, mais peu lisible. Mieux vaut nommer dans les scripts les paramètres, ne pas utiliser d'alias ou de nom abrégé des paramètres.
<CommonParameters>
se comportent de la meme facon, et qui existent pour un grand nombre (presque tous) de cmdlets.
De type "switch": -Verbose et -Debug et de type "Valeur": -ErrorAction, -ErrorVariable et -OutVariable()
Fonctions PS et tableau $args
Les alias ne peuvent pas utiliser d'arguments. On va créer une fonction qui simplifie un ping:
# je fais tous les jours ce Ping -n 1 -w 100 10.10.10.10
function quickping { ping -n 1 -w 100 $args }
Set-Alias qp quickping
# utiliser avec un simple qp 10.10.10.10
Rappel: -w augmente ici le time-out
$args est un tableau (on pourra y passer des tas d'arguments, en nbre variable, et sans revenir modifier le script).
Utilisation de fichiers et de scripts
Il faut utiliser nom relatif ou absolu. Créer un ping.bat avec un echo, un pause et affichage d'infos sensibles (dir windows). En lancant simplement ping (sans ip) ps affiche l'aide de ping => pour lancer le script: ajouter .\ping
Alors qu'en dos : cmd puis ping 10.10.10.10 lance le .bat
DOS (je veux dire l'invite de commande classique: cmd) ne distingue pas les fichiers des commandes et cherche d'abord dans le dossier courant (et lance la commande).
PS dans ce cas est plus sécurisé : meme si un hacker a créé un ping.bat dans votre dossier courant, lancer un simple ping 192.168.1.1 ne pourra pas lancer son ping.bat.
Appel .vbs
Dans un fichier ex.vbs saisir :
result = InputBox("Enter your name")
WScript.Echo result
Le lancer: Cscript.exe c:\samples\ex.vbs
(Enter)
Une fenetre apparait, et l'entrée s'affiche (et est dc disponible) aussi dans PS.
On peux aussi récupérer dans une var PS le résultat d'un script vbs: $name = cscript.exe c:\samples\test.vbs
Doc tek:
Fichier attaché | Taille |
---|---|
param.txt | 10.92 Ko |