Maintenant que vous commencez à avoir quelques notions de Powershell, nous allons nous lancer dans l’installation d’une application.

Le but va donc être d’installer 7zip en .msi et en .exe.

Pour le test, j’ai choisi d’ouvrir une Sandbox Windows… Si vous ne savez pas ce qu’est une Sandbox, je vous invite à aller voir le tuto => Sandbox Windows (lien disponible bientôt).

Nous allons créer 2 dossiers que nous allons nommer :
7Zip.msi_install
7Zip.exe_install

L’un servira pour l’installation du .msi et l’autre pour l’installation du .exe.

Ouvrons maintenant le dossier « 7Zip.exe_install » et glissez l’exécutable de 7Zip en .exe préalablement téléchargé sur le site officiel de 7Zip
=> 7Zip-x64 download link

Faites un clic droit dans ce dossier et créez un fichier texte avec le « bloc-notes » Windows :

Dans ce fichier texte, vous allez copier-coller le script ci-dessous (nous allons entièrement le décrypter dans ce tuto).

# Chemin du script
$scriptPath = $PSScriptRoot
$exePath = Join-Path -Path $scriptPath -ChildPath "7z2601-x64.exe"

# Vérifier si le fichier .exe existe
if (-not (Test-Path -Path $exePath)) {
    Write-Error "Le fichier 7z2601-x64.exe est introuvable dans : $scriptPath"
    exit 1
}

# Installer 7-Zip en silencieux
Write-Host "Installation de 7-Zip via EXE..."
Start-Process -FilePath $exePath -ArgumentList "/S" -Wait

Write-Host "Installation de 7-Zip ok !."

Cela donne ça :

Enregistrez ensuite ce fichier en .ps1 (l’extension de fichier Powershell) sous le nom « install ».

Vous devriez avoir maintenant 2 fichiers dans le dossier 7Zip.exe_install :

En l’état, vous ne pourrez pas lancer ce script car par défaut, l’exécution de ce type de script n’est pas autorisé sur les machines (sauf si vous avez effectuez les modifications suivantes).

Ouvrez maintenant Powershell :

A l’ouverture de la console, entrez la commande suivante (que nous avons vu dans « Base de Powershell »)

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Maintenant nous allons pouvoir lancer le script d’installation de 2 manières différentes :
– Soit via la console Powershell admin
– Soit en lançant le fichier « install.ps1 »

-> Via la console Powershell

Rendez vous dans le dossier via la commande « cd« , pour moi le chemin de destination est le suivant :
C:\Users\WDAGUtilityAccount\Desktop\7Zip.exe_install

Pour vous, cela sera surement :
C:\Users\votre_nom_de_compte_windows\Desktop\7Zip.exe_install

cd C:\Users\WDAGUtilityAccount\Desktop\7Zip.exe_install

Vous êtes maintenant placé dans le dossier qui contient le script d’installation « install.ps1 » et le binaire de 7Zip « 7z2601x64.exe ».

Entrez maintenant la commande suivante pour lancer l’installation de 7Zip via votre script .ps1 :

.\install.ps1

Bingo !

ZZip est bien installé !
Vérifiez en effectuant une recherche :

-> Via le fichier de script .ps1

La commande précédente « Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass » ne sera pas suffisante pour lever les droits sur l’exécution du fichier en .ps1.
Cette commande ne persistera pas et sera utile uniquement pour la session Powershell en cours, à la fermeture de la console, la politique reviendra à sa valeur par défaut qui est généralement « Restricted« .

J’ai volontaire voulu vous faire exécuter la commande précédente pour vous montrer différentes politiques de restriction sur PowerShell.

Ouvrez une console Powershell et tapez la commande suivante :

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

Cela aura pour effet de lever la restriction pour l’utilisateur courant et vous permettra de lancer le script depuis le fichier install.ps1 même si la console est fermée.

Faites maintenant un clic-droit sur le fichier puis cliquez sur « Run with PowerShell » (en français ça donne : Exécuter avec PowerShell).

Bingo !

Pour le Fichier en .msi, l’opération est exactement la même, seul le script change :

# Chemin du script (équivalent à %~dp0 en batch)
$scriptPath = $PSScriptRoot
$msiPath = Join-Path -Path $scriptPath -ChildPath "7z2601-x64.msi"

# Vérifier si le fichier .msi existe
if (-not (Test-Path -Path $msiPath)) {
    Write-Error "Le fichier 7z2601-x64.msi est introuvable dans le dossier du script : $scriptPath"
    pause
    exit 1
}

# Installer 7-Zip en silencieux
Write-Host "Installation de 7-Zip via MSI..."
Start-Process -FilePath "msiexec.exe" -ArgumentList "/i `"$msiPath`" /qn /norestart" -Wait

Write-Host "Installation de 7-Zip ok !"
pause


Nous allons maintenant pouvoir décortiquer le script afin de le comprendre.

Prenons la première partie :

# Chemin du script (équivalent à %~dp0 en batch)
$scriptPath = $PSScriptRoot
$msiPath = Join-Path -Path $scriptPath -ChildPath "7z2601-x64.msi"

# Chemin du script (équivalent à %~dp0 en batch) => c’est un commentaire pour expliquer ce qui vient ensuite.
Première ligne :
$scriptPath = $PSScriptRoot => On déclare une variable qui s’appelle $scriptPath et dont le chemin est un chemin relatif via une variable automatique $PSScriptRoot, équivalente à %~dp0 en Batch.
Exemple : si le script est dans C:\Deploy\Tools\install.ps1
Alors $PSScriptRoot retourne => C:\Deploy\Tools\*


$PSScriptRoot rend le script portable car cette variable utilise toujours son propre emplacement.

Deuxième ligne :
$msiPath = Join-Path -Path $scriptPath -ChildPath « 7z2601-x64.msi »

$msiPath => On déclare une nouvelle variable dans laquelle on met les cmdlet suivantes :
Join-Path => est une cmdlet PowerShell qui construit le chemin complet à partir de :
-> -Path => le dossier parent (ici $scriptPath, notre variable plus haut)
-> -ChildPath => Le nom du fichier ou sous-dossier à ajouter (ici notre binaire d’installation 7-z2601-x64.msi)

La suite…

# Vérifier si le fichier .msi existe
if (-not (Test-Path -Path $msiPath)) {
    Write-Error "Le fichier 7z2601-x64.msi est introuvable dans le dossier du script : $scriptPath"
    pause
    exit 1
}

if (-not (Test-Path -Path $msiPath)) { =>if est une condition, cette commande peut se traduire simplement par : si le fichier n’existe pas dans le répertoire défini dans la variable $msiPath.
Le reste de la condition est toujours entre { }.

  • Si le fichier existeTest-Path retourne $true.
  • Si le fichier n’existe pasTest-Path retourne $false.
  • -not est l’opérateur de négation en PowerShell (équivalent à ! dans d’autres langages).
  • -not (Test-Path ...) signifie : « Si le fichier n’existe pas… ».

Write-Error => Affiche une erreur en rouge dans la console.

pause => Pause dans le script qui invite l’utilisateur à appuyer sur entrée avant de continuer.

exit 1 => Quitte le script, le code 1 est un code d’erreur qui indique que le script a échoué, 0 étant un succès.

Et pour finir :

# Installer 7-Zip en silencieux
Write-Host "Installation de 7-Zip via MSI..."
Start-Process -FilePath "msiexec.exe" -ArgumentList "/i `"$msiPath`" /qn /norestart" -Wait

Write-Host "Installation de 7-Zip ok !"
pause

Write-Host => Affiche le message « Installation de 7-Zip via MSI… »

Start-Process => Cmdlet qui lance un processus externe (ici « msiexec.exe« )

-FilePath « msiexec.exe » => Spécifie le programme à exécuter qui est msiexec.exe, l’installateur Windows des fichier en .msi

-ArgumentList « /i "$msiPath » /qn /norestart » => Cette partie donne des arguments liés à msiexec.exe :

  • /i => Installe le package msi
  • « $msiPath » => Chemin du binaire qui est dans cette variable
  • /qn => En mode silencieux (sans interface graphique)
  • /norestart => Pas de redémarrage après l’installation

-Wait => On attend la fin du processus d’installation

Write-Host « Installation de 7-Zip ok ! » => On affiche le message « Installation de 7-Zip ok ! »

pause => Fait une pause à la fin du script et demande à l’utilisateur d’appuyer sur entrée pour fermer la fenêtre.