1er pas avec Microsoft Powershell ✎ Travail n° 1 Découverte de Microsoft Powershell Prendre connaissance du document Introduction à Microsoft Powershell 🖮 Travail n° 2 Installation Comme expliqué dans Introduction à Microsoft Powershell, l’objectif de cet atelier est de découvrir l’édition Powershell Core de Microsoft Powershell plutôt que l’édition Windows Powershell présente par défaut dans Windows. Il faut donc l’installer séparément. La procédure d’installation est décrite sur le site de Microsoft dans l’article Installing PowerShell on Windows Suivre cette procédure pour installer Microsoft Powershell avec la méthode “MSI Package”. Télécharger au préalable en local le paquet MSI disponible sur le NAS du labo (→ \\diskstation\install\powershell). Installer le paquet en tant qu’administrateur local soit depuis la ligne de commande (→ msiexec) soit en l’exécutant depuis l’explorateur de fichier mais en veillant bien à activer toutes les options (USE_MU, ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL …) Exécuter Microsoft Powershell en tapant pwsh dans la barre de recherche Windows Afficher les informations de version de Microsoft Powershell en exécutant la commande suivante : Write-OutPut $PSVersionTable qui affiche sur l’écran la valeur de la variable $PSVersionTable et vérifier que la version affichée est ≥ 6.0 PS C:\Users\claud> Write-Output $PSVersionTable Name Value ---- ----- PSVersion 7.2.6 (1) PSEdition Core GitCommitId 7.2.6 OS Microsoft Windows 10.0.19044 Platform Win32NT PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0 1 Version 7.2.6 > 6.0 ⇒ c’est bien l’édition Powershell Core et non l’édition Windows Powershell En s’appuyant sur about_Automatic_Variables , indiquer en quoi une “variable automatique” comme $PSVersionTable diffère des autres variables. Au vu de la commande saisie ou du contenu de l’article about_Variables , que peut-on en déduire sur le nom des variables dans Microsoft Powershell ? 🖮 Travail n° 3 Prise en main Suivre le PowerShell Beginner’s Guide Donner les commandes pour réaliser les actions suivantes. (Copier/Coller dans le compte-rendu les commandes et leur résultats.) Afficher les informations sur le processus winlogon Obtenir les alias de la cmdlet Set-Location (en principe, il y en a 3) Lister les répertoires dans la racine du lecteur où est installé Windows (ex : C:\) dont le nom commence par Program Créer dans votre répertoire personnel (→ variable $home) le fichier bidon.txt et y écrire le texte “Hello world !” Détruire ce fichier avec confirmation (consulter l’aide en ligne de cette cmdlet pour déterminer l’option à saisir pour confirmer la destruction) S’assurer que le chemin saisi est correct avant d’exécuter la commande sous peine de détruire des fichiers autres que celui demandé. Afficher les 2 plus petits fichiers de votre répertoire personnel 🖮 Travail n° 4 Challenge n°1 Trouver le chaînage de cmdlets à exécuter pour afficher à l’écran le nom des interfaces réseau présentes sur la machine qui sont configurées en Dhcp ainsi que leurs adresses Ipv4 et leur adresses MAC L’affichage ci-dessus a été obtenu en chainant les cmdlets Get-NetIpConfiguration, Where-Object et Select-Object L’affichage d’une propriété imbriquée (→ nested property) — comme celle précisant que l’état du Dhcp dans la description d’une interface réseau retournée par la cmdlet Get-NetIpConfiguration-- ne peut se faire qu’à travers une “propriété calculée” (→ calculated property). Voir about_Calculated_Properties . Ex. > get-netipconfiguration | format-table @{N="EtatDhcp"; E={$_.NetIPv4Interface.DHCP}}, InterfaceDescription (1) EtatDhcp InterfaceDescription -------- -------------------- Enabled VMware Virtual Ethernet Adapter for VMnet1 Enabled VMware Virtual Ethernet Adapter for VMnet8 Enabled Npcap Loopback Adapter Enabled Intel(R) Dual Band Wireless-AC 8265 Enabled Bluetooth Device (Personal Area Network) Enabled Intel(R) Ethernet Connection (4) I219-V 1 Utilisation d’une propriété calculée (→ EtatDhcp) pour afficher l’état du DHCP 🖮 Travail n° 5 Challenge n°2 Le LCSQA (Laboratoire Central de Surveillance de la Qualité de l’Air) publie quotidiennement des données nationales sur la qualité d’air. Elles décrivent les concentrations des polluants atmosphériques suivants : Ozone (O3) Dioxyde d’azote (NO2) Dioxyde de soufre (SO2) Particules de diamètre inférieur à 10 µm (PM10) Particules de diamètre inférieur à 2,5 µm (PM2.5) Monoxyde de carbone (CO) Ces données journalières sont accessibles sous forme de fichiers .csv ou .xml via l’url https://files.data.gouv.fr/lcsqa/concentrations-de-polluants-atmospheriques-reglementes/temps-reel. Elles sont aussi consultables sur le web via le site GeOd’Air Faire un script qui affiche la moyenne des concentrations atmosphériques pour chaque polluant atmosphérique relevées la veille de l’exécution du script sur la station nommée “AVIGNON MAIRIE” Solution incomplète # Télécharger les données # Note : on est obligé de passer par un fichier pour les récupérer de façon à bien interpréter le BOM UTF-8 $year = (get-date -UFormat "%Y").ToString() $file = "FR_E2_" + (((get-date).AddDays(-1)).getdatetimeformats('u')).split(' ')[0] + ".csv"#Invoke-WebRequest -Uri https://files.data.gouv.fr/lcsqa/concentrations-de-polluants-atmospheriques-reglementes/temps-reel/$year/$file -OutFile C:\tmp\out.csv # Construire la collection d'objets à partir du contenu du fichier $polluantsNationaux = Get-Content -Path C:\tmp\out.csv | ConvertFrom-Csv -Delimiter ';' if($?) { # Filtrer les données pour ne récupérer que celles concernant "Avignon Mairie" : # * Méthode 1 : utiliser cmdlet Where-Object => plus long ! #$polluantsAvignonMairie = $polluantsNationaux | select "nom site", "Date de début", "Polluant", "valeur", "unité de mesure" | Where-Object {$_."nom site" -like "AVIGNON*MAIRIE"} # * Méthode 2 : utiliser ForEach-Object => plus rapide ! #$polluantsAvignonMairie = @() $concentrationNO = @() $concentrationNO2 = @() $concentrationO3 = @() $concentrationNOX = @() $concentrationPM10 = @() $concentrationPM2dot5 = @() $concentrations = @() $polluantsNationaux | ForEach-Object { if ($_."nom site" -like "AVIGNON*MAIRIE") { # utilisation de joker '*' car plusieurs espaces entre AVIGNON et MAIRIE #$polluantsAvignonMairie += $_ | select "nom site", "Date de début", "Polluant", "valeur", "unité de mesure" <# Méthode A $mesure = $_ switch($mesure."Polluant") { "NO" {$concentrationNO += $mesure | select "valeur"} "NO2" {$concentrationNO2 += $mesure | select "valeur"} "O3" {$concentrationO3 += $mesure | select "valeur"} "NOX as NO2" {$concentrationNOX += $mesure | select "valeur"} "PM10" {$concentrationPM10 += $mesure | select "valeur"} "PM2.5" {$concentrationPM2dot5 += $mesure | select "valeur"} } #> <# Méthode B #> $concentrations = $_ | select "Polluant", "valeur", @{l="unité"; e={$_."unité de mesure"}} $NO = $concentrations | Where-Object {$_."Polluant" -like "NO"} Measure-Object -InputObject $NO -Property "valeur" -Average } } <# Suite Méthode A $result = @{} $result["NO"] = $concentrationNO | Measure-Object -Property "valeur" -Average $result["NO2"] = $concentrationNO2 | Measure-Object -Property "valeur" -Average $result["O3"] = $concentrationO3 | Measure-Object -Property "valeur" -Average $result["NOX"] = $concentrationNOX | Measure-Object -Property "valeur" -Average $result["PM10"] = $concentrationPM10 | Measure-Object -Property "valeur" -Average $result["PM2.5"] = $concentrationPM2dot5 | Measure-Object -Property "valeur" -Average $result.Keys | select @{l="Polluant";e={$_}}, @{l="Concentration";e={($result.$_.Average)}} #> #Remove-Variable polluantsAvignonMairie } else { Write-Output "!! Echec conversion depuis .csv !!" } Remove-Variable polluantsNationaux 🞄 🞄 🞄 SN1IR - Powershell Raspberry Pi