Powershell : 4 scripts amusants pour apprendre à s’en servir

Powershell est un Invite de commandes, mais aussi un langage de programmation qui permet d'automatiser des tâches, de trier des quantités ahurissantes de données à la volée, mais aussi de s'amuser ! Dans ce dossier nous vous montrons quatre exemples de scripts amusants et plutôt utiles, à minima pour apprendre à dompter le nouvel Invite de commandes.

Powershell remplace désormais l'Invite de commandes classique (cmd) par défaut depuis la mise à jour de Windows 10 Creators Update. Ce programme permet de faire tout ce que pouvait faire Cmd, mais autorise aussi bien les développeurs chevronnés ou les codeurs en herbe à créer des petits scripts par curiosité ou pour réellement coder et simplifier votre utilisation de l'ordinateur. Nous avons essayé à travers ces quelques scripts de vous montrer des exemples aussi instructifs qu'amusants.

Powershell : la boucle des étoiles

Ce petit script permet de s'initier au fonctionnement des boucles. Copiez-le et lancez-le dans une fenêtre de Powershell pour voir directement le résultat :

$i="*"
Do {
$i="$i*"
$i
}
While ($true)

Vous comprenez mieux pourquoi nous avons appelé cette boucle la “boucle des étoiles”. Pour interrompre le programme tapez sur les touches Ctrl + C de votre clavier. Ce petit code est assez amusant, mais peut faire des choses plus utiles. Vous pouvez par exemple remplacer l'étoile par ce que bon vous semble. Mais aussi d'autres éléments, voire des nombres :

$i=1
Do {
$i
$i++
}
While ($i -le 10)

La boucle va alors afficher le nombre contenu dans $1 et ajouter 1 tant que la valeur de $i est inférieure à 10 (d'où le $i -le 10 à la fin, -le signifiant lesser ou inférieure à en anglais). Il est aussi possible de transformer cela en compte à rebours en remplaçant le ++ à côté du $i qui vous l'aurez compris est une variable, par un --. Il faut aussi changer la valeur de départ à 10, et mettre 0 à la fin si vous voulez avoir un compte à rebours façon décollage de fusée.

Et si vous voulez que le rendu de chaque itération soit moins rapide, par exemple que l'affichage de chaque nombre soit séparé d'une seconde, vous pouvez alors ajouter une commande pour mettre le programme en pause pendant un nombre défini de millisecondes à chaque boucle :

$i=10
Do {
$i
$i--
Start-Sleep -m 1000
}
While ($i -ge 0)

Enfin, si vous voulez ajouter un bip à chaque exécution du petit bout de code de la boucle, ajoutez [console]::beep(440,100) où 440 est la fréquence en Hz du son (c'est un La) et 100 est la durée de lecture. Ce qui donne le code suivant :

$i=10
Do {
$i
$i--
[console]::beep(440,100)
Start-Sleep -m 1000
}
While ($i -ge 0)

Notez que dans le cas du compte à rebours, le While (tant que…) ne peut jouer la boucle tant que la valeur de $i est “inférieure à 0”, puisque la valeur de $i commence à 10. Il faut donc remplacer à la dernière ligne -le par -ge qui signifie greater than ou supérieur à en Français.

Faites de la musique avec Powershell

Et si on vous disait que vous pouvez faire de la musique avec Powershell ? Un des exemple les plus ludiques pour s'initier au langage de programmation de Powershell, c'est de programmer des morceaux de musique. Copiez directement le code des chansons dans une fenêtre Powershell et tapez Entrée pour les exécuter.

“La Marche Impériale”

[console]::beep(440,500)
[console]::beep(440,500)
[console]::beep(440,500)
[console]::beep(349,350)
[console]::beep(523,150)
[console]::beep(440,500)
[console]::beep(349,350)
[console]::beep(523,150)
[console]::beep(440,1000)
[console]::beep(659,500)
[console]::beep(659,500)
[console]::beep(659,500)
[console]::beep(698,350)
[console]::beep(523,150)
[console]::beep(415,500)
[console]::beep(349,350)
[console]::beep(523,150)
[console]::beep(440,1000)

“Mission Impossible”

[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(932,150)
Start-Sleep -m 150
[console]::beep(1047,150)
Start-Sleep -m 150
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(699,150)
Start-Sleep -m 150
[console]::beep(740,150)
Start-Sleep -m 150
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(932,150)
Start-Sleep -m 150
[console]::beep(1047,150)
Start-Sleep -m 150
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(784,150)
Start-Sleep -m 300
[console]::beep(699,150)
Start-Sleep -m 150
[console]::beep(740,150)
Start-Sleep -m 150
[console]::beep(932,150)
[console]::beep(784,150)
[console]::beep(587,1200)
Start-Sleep -m 75
[console]::beep(932,150)
[console]::beep(784,150)
[console]::beep(554,1200)
Start-Sleep -m 75
[console]::beep(932,150)
[console]::beep(784,150)
[console]::beep(523,1200)
Start-Sleep -m 150
[console]::beep(466,150)
[console]::beep(523,150)

Composez votre propre création

Comme vous pouvez le voir en décortiquant la commande on a [console]::beep avec deux chiffres entre parenthèse. Le chiffre de gauche désigne la fréquence du son (par exemple 440 Hz pour un La), et le chiffre de droite, la durée pendant laquelle le son doit être joué (en millisecondes). Dans Mission Impossible on voit également que les sons sont entrecoupés de la commande Start-Sleep -m 150. Celle ci signifie “ne fais plus rien pendant X ms” : parfait pour introduire des silences ! C'est à vous – n'hésitez pas à partager vos créations dans les commentaires !

Faites parler Powershell

Il est aussi possible de transformer du texte en synthèse vocale directement dans Powershell. Pour cela, il faut d'abord charger le module de synthèse vocale en lançant cette commande, puis créer un nouvel objet $speak qui permettra de simplifier son utilisation. Tout cela est somme toute assez simple, copiez les deux lignes suivantes et exécutez-les dans Powershell :

Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer

Vous pouvez alors faire parler la synthèse vocale de Powershell :

$speak.Speak("Je donne ma langue au chat")

Il est même possible de transformer à la volée vos phrases en un fichier WAV. Il faut pour cela en quelque sorte ouvrir/commencer l'enregistrement de votre fichier sur votre disque dur en modifiant la commande suivante, puis en l'exécutant. “Fermez” ensuite le fichier une fois que vous aurez fini avec une autre commande pour pouvoir ensuite le lire dans le programme de votre choix :

$speak.SetOutputToWaveFile("C:\users\LE\CHEMIN\QUE\VOUS\AUREZ\CHOISI\test.wav")

Lancez ensuite quelques $speak.Speak() contenant des phrases que vous souhaitez transformer en synthèse vocale, puis exécutez cette commande pour fermer le fichier :

$speak.Dispose()

Si la voix ne vous plaît pas, vous pouvez consulter la liste des voix installées en exécutant la commande :

$speak.GetInstalledVoices().VoiceInfo

Copiez le nom de la voix et collez-le dans cette commande pour la changer :

$speak.SelectVoice('LA VOIX QUE VOUS AVEZ CHOISIE')

Rangez votre bureau Windows 10 avec un script

Ce petit script qui vient de Reddit (merci à u/Zazierx !) est si pratique que nous ne résistons pas à le partager avec vous. Il permet à la fois de s'initier aux opérateurs conditionnels (le code est relativement clair et simple à lire) et à ranger le bureau de Windows 10 dans des dossiers par types de fichier. Copiez et collez le code suivant dans une fenêtre de Powershell puis exécutez-le :

$pathToUse = "C:\Utilisateurs\$env:username\Bureau"
$video = @(
'3g2','3gp','3gpp','asf','avi','divx','f4v',
'flv','h264','ifo','m2ts','m4v','mkv','mod','mov',
'mp4','mpeg','mpg','mswmm','mts','mxf','ogv','rm',
'srt','swf','ts','vep','vob','webm','wlmp','wmv'
)
$spreadsheets = @(
'csv','ods','xls','xlsx'
)
$images = @(
'arw','bmp','cr2','crw','dcm','dds','djvu','djvu',
'dmg','dng','fpx','gif','ico','ithmb','jp2','jpeg',
'jpg','nef','nrw','orf','pcd','pict','png','psd',
'sfw','tga','tif','tiff','webp','xcf'
)
$presentations = @(
'key','odp','pps','ppsx''ppt','pptm','pptx'
)
$docs = @(
'chm','doc','docm','docx','dot','dotx','eml','eps',
'hwp','log','m3u','odt','pages','pdf','pub','rtf',
'sxw','txt','wpd',' wps','xml','xps'
)
$cadFiles = @(
'dwg','dxf'
)
$misc = @(
'bin','cda','dat','dll','exe','isc',
'img','inf','ipa','kmz','lnk','pes',
'ps','rem','torrent','ttf','vcf'
)
$ebooks = @(
'azw','azw3','epub','fb2''lit','lrf','mbp','mobi',
'opf','prc'
)
$web = @(
'css','htm','html','js','json','php'
)
$arcs = @(
'7z','apk','bz2','cbr','gz','gzip','jar','rar',
'tar','tgz','zip','war'
)
$scripts = @(
'bat','cmd','vb','vbs','vbe','js',
'jse','ws','wsf','wsc','wsh','ps1',
'ps1xml','ps2','ps2xml','psc1','psc2','sql'
)
$files = Get-ChildItem -Path $pathToUse
Foreach ($x in $files){
if($docs.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Documents" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Documents"
}
elseif($spreadsheets.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Spreadsheets" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Spreadsheets"
}
elseif($images.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Images" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Images"
}
elseif($presentations.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Presentations" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Presentations"
}
elseif($video.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Videos" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Videos"
}
elseif($cadFiles.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "CAD Files" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"CAD Files"
}
elseif($misc.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Misc" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Misc"
}
elseif($ebooks.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "E-Books" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"E-Books"
}
elseif($web.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Web" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Web"
}
elseif($arcs.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Archives" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Archives"
}
elseif($scripts.Contains($x.Extension.TrimStart('.').ToLower())){
New-Item -ItemType Directory -Path $pathToUse -Name "Scripts" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Scripts"
}
elseif($x.Directory){
New-Item -ItemType Directory -Path $pathToUse -Name "Other - misc" -ErrorAction Ignore
Move-Item -Path $x.FullName -Destination $pathToUse/"Other - misc"
}
else{
Write-Host $x
}
}

Avec quelques petites modifications, vous pourrez ranger n'importe quel dossier sans efforts. Connaissez-vous d'autres scripts Powershell amusants ? Partagez-les dans les commentaires de cet article !

Voir les commentaires
Ailleurs sur le web