AppScript-F. Informer de la progression

I. Présentation

Cette étape n’est pas capitale pour scripts de déploiement, mais peut donner une indication d’activité et une touche plus sympathique aux processus d’installation.

Nativement, le MDT se charge d’informer en présentant le nom de la tâche en cours et le détail de la progression pour certaines actions, mais pas pour les applications.

MDT-Progress

Pour gérer cet affichage de progression, le MDT s’appuie sur l’outil “TSProgressUI.exe” situé dans le dossier “\Tools\architectureCPU” qui est principalement sollicité par le script ZTIUtility.vbs. Cette fonction n’est toutefois opérationnelle qu’a la condition que le script s’exécute au sein d’une séquence de taches.

Si cela vous intéresse, vous pouvez également recourir à une variante écrite sous la forme d’un module Powershell, ici et les explications sur l’usage ici 

Note : Dans le cadre d’une séquence de tache MDT, vous pouvez utiliser le composant de gestion de la boite de dialogue de progression ‘microsoft.sms.tsprogressui’. Les explication sont ici . Pour tester cette fonction, vous devrez passer en environnement LTI car le composant ne peut être chargé dans un environnement standard.

Vous trouverez également un exemple d’usage avancé de cette barre de progression MDT avec des taches imbriquées ici

Quoi qu’il en soit, en  règle générale, pour les processus d’installation relativement longs, il peut être intéressant d’ajouter une indication de progression, mais il existe différentes techniques en fonction du langage utilisé et du type de sortie souhaité (console ou graphique) .

.
_Progress

II. Informer de la progression

Dans tous les cas, il sera nécessaire de créer une boucle de traitement au sein de laquelle les itérations successives ou simplement le temps passé seront comptabilisés.

(Batch)
En batch, à ma connaissance les solutions sont plutôt pauvres et il faut rivaliser d’imagination pour obtenir un résultat élégant. Par exemple, certains proposent d’utiliser la commande “ping” pour réaliser un compteur de temps en seconde, ou bien d’exploiter la directive “timeout”, mais cela donne lieu à des scripts plus ou moins complexes à maintenir.

Voici quelques exemples (pompés sur le Net, j’avoue :-S ) :

@echo off
::PROGRESS BAR
set /a full = 50
for /l %%a in (1,1,%full%) do (
 CALL:ADDSPACE)
for /l %%b in (1,1,%full%) do (
 CALL:PROGRESS %%b
)
del _temp.bat
exit/b
:ADDSPACE
 set "fullBar=%fullBar%_"
 set "tags=%tags%#"
 exit/b
:PROGRESS
set number=%~1
set /a pct=full-number
 (
 echo/echo/[%%tags:~0,%~1%%%%fullBar:~0,%pct%%%]
 )>_temp.bat
 call _temp.bat
 timeout 1 1>nul&cls

A mon avis, ce procédé génère un effet visuel désagréable lié à l’effacement systématique de la console via la commande “cls”.
Je trouve l’exemple suivant plutôt original et discret, du fait qu’il exploite la barre de titre de l’invite de commande pour afficher la progression.

 
@echo off
setlocal EnableDelayedExpansion

rem Compte le nombre de fichiers dans le dossier courant (pour l'exemple uniquement)
set n=0
for %%f in (*.*) do set /A n+=1

rem Remplit la variable "bar" avec 70 caractères (X)
set "bar="
for /L %%i in (1,1,70) do set "bar=!bar!X"

rem Remplit la variable "space" avec des soulignements (_)
set "space="
for /L %%i in (1,1,110) do set "space=!space!_"

rem Traitement des fichiers et affichage de la progression dans la barre de titre
set i=0
echo Processus en cours:
for %%f in (*.*) do (
 set /A i+=1, percent=i*100/n, barLen=70*percent/100
 for %%a in (!barLen!) do title !percent!%% !bar:~0,%%a!%space%
 echo !i!- %%f
 ping -n 1 localhost > NUL
)

Une autre technique similaire pourrait consister à utiliser le batch “ProgressMeter” (http://www.robvanderwoude.com/3rdpartybatchfiles.php#ProgressMeter) de Roy Holt très légèrement modifié ci-dessous :

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET ProgressPercent=%1
SET /A NumBars=%ProgressPercent%/2
SET /A NumSpaces=50-%NumBars%

SET Meter=

FOR /L %%A IN (%NumBars%,-1,1) DO SET Meter=!Meter!:
FOR /L %%A IN (%NumSpaces%,-1,1) DO SET Meter=!Meter! 

TITLE Progression: [%Meter%] %ProgressPercent%%%
ENDLOCAL
GOTO :EOF

Pour la démonstration, j’ai renommé le script “pm.bat”, et il suffit d’entrer la commande suivante :

for /l %x in (1, 1, 100) do (@call .\pm.bat %x)

Note : Pensez à doublez les % si vous inscrivez cette commande dans un batch

Une autre variante ici : http://ss64.org/viewtopic.php?id=1499

Nous sommes bien loin d’avoir fait le tour des possibilités mais rien ne vous empêche d’écrire un script spécialisé pour ce genre de besoin.

(VBscript)
Malheureusement le vbscript est aussi pauvre en ce domaine, et il faut se contenter de possibilités très limitées au batch en mode console ou faire appel à un objet “InternetExplorer” (http://www.northatlantawebdesign.com/index.php/2009/07/16/simple-vbscript-progress-bar/  ) ou code HTA pour un affichage en mode graphique. (https://gallery.technet.microsoft.com/scriptcenter/cbdd527c-f512-4e9f-bfbf-ed3933e638c3)

 

(PShell)
En Powershell, vous pouvez utiliser l’applet de commande “write-progress” comme suit :

for ($i = 1; $i -lt 30; $i++){ 
 start-sleep 1
 write-progress -activity "Boucle de démonstration" -status "%Effectué:" -percentcomplete $($i*100/30)
 } 

Vous pouvez également vous inspirer de l’exemple précédent en batch afin d’afficher la progression dans la barre de titre de la console:

# Exemple de fonction d'affichage d'une progression
# dans la barre de titre de la console Powershell

Function Show-Progress {
 param ($Progress, $Max, $Name)
 [int]$Percent = ($Progress/$Max)*100
 [int]$Bar0 = 100 - $Percent
 [int]$Bar1 = 100 - $Bar0
 [string]$Meter= "X" * ($Bar1/10) + "o" * ($Bar0/10)
 if ($Progress -lt $Max) { $Ended = " - En cours..." }
 else { $Ended = " - Terminé." }
 if ($Name -eq $null) { $Name = "Progression" }
 $host.ui.RawUI.WindowTitle = "$Name : [$Meter] $Percent`%$Ended"
 # Temporisation de démonstration
 sleep -Seconds 3
 }

#Sauvegarde le contenu de la barre de titre
$title = $host.ui.RawUI.WindowTitle

# Execution de votre script ou fonction
# "Appel de la fonction en passant le "Numéro" d'ordre sur "nombre" d'opération."
Show-Progress -Progress 1 -Max 3 
Show-Progress -Progress 2 -Max 3
Show-Progress -Progress 3 -Max 3

# "ou dans un pipeline" - Max doit être égal au nombre d'éléments entrants
1..8 | % { Show-Progress -Progress $_ -Max 8 -Name "Action N°$_ - Total " }

pause
# Restauration du contenu de la barre de titre
$host.ui.RawUI.WindowTitle = $title

Et pleins d’autres exemples ici

Retour au sujet principal

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. Apprenez comment les données de vos commentaires sont utilisées.