web-dev-qa-db-fra.com

Comment exécuter un script PowerShell avec une sortie détaillée?

Je me demande s'il existe un moyen d'exécuter un script PowerShell de telle sorte que les commandes et la sortie de chaque ligne du script soient imprimées. Par exemple, dans Bash, vous écririez bash -x myscript ou placez un set -x en haut de votre script. Dans Batch, vous omettriez le @echo off traditionnellement laissé en haut de votre script. PowerShell a-t-il un équivalent de ces constructions?

Ce que j'ai essayé: En cours d'exécution powershell -? | sls verbose, qui n'a rien révélé.

15
James Ko

Va juste montrer, @JamesKo, si vous posez la mauvaise question, vous obtenez la mauvaise réponse : . Plusieurs personnes proposent des réponses de bonne foi ici basées sur (a) le manque d'exposition de Linux et (b) votre utilisation du terme verbeux. Dans ce qui suit, je vais vous expliquer comment Linux est lié à PowerShell sur ce sujet, mais n'hésitez pas à passer à la réponse à la fin si vous êtes pressé. :-)

Contexte

Dans PowerShell, verbose a une signification très spécifique dont la --- (page de manuel PowerShell est même assez vague sur:

Affiche des informations détaillées sur l'opération effectuée par la commande. Ces informations ressemblent à celles d'une trace ou d'un journal des transactions. Ce paramètre fonctionne uniquement lorsque la commande génère un message détaillé.

Cela ressemble même à ce que vous voulez ... mais comparons cela à la documentation Linux pour set -x qui, selon votre version de Linux, pourrait être celle-ci (à partir de projet de pages de manuel ) ...

Le shell doit écrire dans l'erreur standard une trace pour chaque commande après avoir développé la commande et avant de l'exécuter.

ou ceci (de gn ) ...

Imprimez une trace de commandes simples, pour les commandes, les commandes de casse, les commandes de sélection et l'arithmétique des commandes et de leurs arguments ou des listes de mots associées après leur développement et avant leur exécution.

La toute première ligne de votre question est claire et concise. Mais verbeux dans PowerShell est différent. En un mot, activer le mode verbeux (que ce soit avec le -Verbose commutateur de ligne de commande ou $VerbosePreference variable) active simplement la sortie du flux détaillé vers la console. (Tout comme Linux propose deux flux, stdout et stderr, PowerShell propose plusieurs flux: flux de sortie, flux d'erreurs, flux d'avertissement, flux prolixe et flux de débogage. Vous travaillez avec ces flux de manière identique à celle de Linux - vous pouvez même utiliser, par exemple, commands 4>&1 pour fusionner le flux détaillé avec stdout, par exemple. (Vous pouvez en savoir plus sur les multiples flux de sortie de PowerShell dans la section Flux d'écriture de base de PowerShell One-Liners: accès, gestion et écriture des données et une bonne référence rapide est le Guide complet de PowerShell Ponctuation .)

La réponse

La commande Set-PSDebug vous donnera un suivi équivalent à bash. Vous pouvez même ajuster les détails du traçage avec le -Trace paramètre. Tout d'abord, voici le contrôle, avant d'utiliser Set-PSDebug:

PS> Get-PSDepth
0

Avec une valeur de 1 vous obtenez chaque ligne de code lors de son exécution, par exemple:

PS> Set-PSDebug -Trace 1
PS> Get-PSDepth
DEBUG:    1+  >>>> Get-PSDepth
DEBUG:  141+  >>>> {
DEBUG:  142+   >>>> $nest = -1
DEBUG:  143+   >>>> $thisId = $pid
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  145+    >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG:  146+    >>>> $nest++
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  148+   >>>> $nest
0
DEBUG:  149+  >>>> }

Avec une valeur de 2 , vous obtenez également des affectations de variables et des chemins de code:

PS> Set-PSDebug -Trace 2
PS> Get-PSDepth
DEBUG:    1+  >>>> Get-PSDepth
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:  141+  >>>> {
DEBUG:     ! CALL function 'Get-PSDepth'  (defined in file 'C:\Users\msorens\Documents\WindowsPowerShell\profile.ps1')
DEBUG:  142+   >>>> $nest = -1
DEBUG:     ! SET $nest = '-1'.
DEBUG:  143+   >>>> $thisId = $pid
DEBUG:     ! SET $thisId = '9872'.
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  145+    >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG:     ! SET $thisId = '10548'.
DEBUG:  146+    >>>> $nest++
DEBUG:     ! SET $nest = '0'.
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  148+   >>>> $nest
0
DEBUG:  149+  >>>> }

Ce sont des traces d'une simple applet de commande que j'ai écrite appelée Get-PSDepth. Il imprime les commandes, les affectations, etc. avec le préfixe DEBUG, mélangé avec la sortie réelle, qui dans ce cas est la seule ligne contenant juste 0.

23
Michael Sorens

Vous pouvez toujours utiliser ce qui suit dans votre script.

$ VerbosePreference = "Continue"

Remarque: Vous devez ouvrir le shell en mode élevé .

La capture d'écran ci-dessous est pour référence.

$VerbosePreference

J'espère que ça aide.

14
Ranadip Dutta

En fait, c'est très facile, chaque PowerShell CMDLET a une balise Verbose intégrée. Tout ce que vous avez à faire par exemple:

Test-Connection -ComputerName www.google.com -Verbose

C'est ça. J'espère que ça aide

1
kjohnsonthecoder

Si vous utilisez écriture-verbose dans vos scripts, cela se produira automatiquement,

Cependant, si vous devez écrire manuellement une sortie détaillée de vos fonctions, vous devrez vérifier manuellement que chaque fonction est appelée avec l'indicateur détaillé. Cela peut être fait en vérifiant $ PSCmdlet.MyInvocation.BoundParameters ["Verbose"] depuis l'intérieur de votre fonction.

0
Steve Rathbone