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 link

  1. 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 …​)

  2. Exécuter Microsoft Powershell en tapant pwsh dans la barre de recherche Windows

  3. 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
  4. En s’appuyant sur about_Automatic_Variables link, indiquer en quoi une “variable automatique” comme $PSVersionTable diffère des autres variables.

  5. Au vu de la commande saisie ou du contenu de l’article about_Variables link , que peut-on en déduire sur le nom des variables dans Microsoft Powershell ?

🖮 Travail n° 3 Prise en main

  1. Suivre le PowerShell Beginner’s Guide link

  2. Donner les commandes pour réaliser les actions suivantes.

    (Copier/Coller dans le compte-rendu les commandes et leur résultats.)

    1. Afficher les informations sur le processus winlogon

    2. Obtenir les alias de la cmdlet Set-Location (en principe, il y en a 3)

    3. Lister les répertoires dans la racine du lecteur où est installé Windows (ex : C:\) dont le nom commence par Program

    4. Créer dans votre répertoire personnel (→ variable $home) le fichier bidon.txt et y écrire le texte “Hello world !”

    5. 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é.

    6. 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

get netipconfiguration
  • 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 link.

    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 link (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  

🞄  🞄  🞄