Comment exécuter un script PowerShell avec une sortie verbose?

je me demande s'il y a un moyen d'exécuter un script PowerShell tel que les commandes et la sortie de chaque ligne du script soient imprimées. Par exemple, dans Bash vous écririez bash -x myscript ou placer un set -x en haut de votre script. Dans le Lot, vous omettez l' @echo off traditionnellement à gauche en haut de votre script. Ne PowerShell ont un équivalent de ces constructions?

Choses que j'ai essayé: Exécution powershell -? | sls verbose, qui n'ont rien révélé.

10
demandé sur James Ko 2016-12-26 01:13:08

4 réponses

va Juste pour montrer, @JamesKo, si vous vous posez la mauvaise question, vous obtenez la mauvaise réponse :-(. Plusieurs personnes ont proposé des réponses de bonne foi basées sur (a) le manque D'exposition à Linux et (b) votre utilisation du terme commentaire. Dans ce qui suit, je vais vous montrer comment Linux se rapporte à PowerShell sur ce sujet, mais n'hésitez pas à sauter à la réponse à la fin si vous êtes pressé. : -)

Background

dans PowerShell, verbose a un signification très spécifique que le PowerShell page de manuel de est même assez vague sur:

affiche des informations détaillées sur l'opération effectuée par le commande. Cette information ressemble à l'information dans une trace ou dans un journal des transactions. Ce paramètre fonctionne uniquement lorsque la commande génère un message verbeux.

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

le shell doit écrire à l'erreur standard une trace pour chaque commande après il élargit la commande et avant son exécution.

ou ce (à partir de gnu)...

imprimer une trace de commandes simples, pour les commandes, les commandes case, sélectionnez les commandes, et de l'arithmétique pour les commandes et leurs arguments ou associé les listes de mots après qu'ils sont élargis et avant qu'ils soient exécuter.

la toute première ligne de votre question est clairement et concise d'accord avec ceux-ci. Mais verbose dans PowerShell est différent. En un mot, activer le mode verbeux (que ce soit avec le -Verbose commutateur de ligne de commande ou l' $VerbosePreference variable) permet simplement la sortie du flux verbeux vers la console. (Tout comme Linux offre deux flux, stdout et stderr, PowerShell offre plusieurs flux: flux de sortie, erreur stream, avertissement stream, en clair ruisseau, et de déboguer des flux. Vous travaillez avec ces flux d'une manière identique à celle de Linux--vous pouvez même utiliser, par exemple,commands 4>&1 pour fusionner le flux verbeux à stdout, par exemple. (Vous pouvez en savoir plus sur les flux de sortie multiples de PowerShell dans la section Flux D'écriture de base de PowerShell One-Liners: l'Accès, la Manipulation et l'Écriture de Données et une bonne référence rapide est l' guide complet de PowerShell La ponctuation.)

La Réponse

Set-PSDebug la commande vous donnera un traçage équivalent à bash. Vous pouvez même ajuster le tracé de détail -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 comme il exécute, 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 avez aussi la variable les affectations et les 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 les traces d'un cmdlet simple que j'ai écrit appelé Get-PSDepth. Il imprime les commandes, les devoirs, etc. avec l' DEBUG préfixe, mélangé avec la sortie réelle, qui dans ce cas est la ligne simple contenant juste 0.

18
répondu Michael Sorens 2016-12-26 18:01:25

vous pouvez toujours utiliser ce qui suit dans votre script.

$VerbosePreference= "Continue"

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

ci-dessous screenshot est pour référence.

$VerbosePreference

j'Espère que ça aide.

6
répondu Ranadip Dutta 2016-12-26 03:06:04

c'est en fait très facile chaque cmdlet PowerShell a une étiquette verbeuse intégrée. Tout ce que vous avez à faire par exemple:

Test-Connexion -ComputerName www.google.com -Commentaire

Qui est-il. J'espère que cette aide

1
répondu kjohnsonthecoder 2016-12-26 03:59:53

si vous utilisez write-verbose dans vos scripts, cela se produira automatiquement,

cependant, si vous avez besoin d'écrire manuellement la sortie verbose de vos fonctions, vous aurez besoin de vérifier manuellement que chaque fonction est appelée avec le drapeau verbose. Cela peut être fait en vérifiant$PSCmdlet.MyInvocation.BoundParameters ["Verbose"] à partir de l'intérieur de votre fonction.

0
répondu Steve Rathbone 2016-12-25 23:08:51