Script PowerShell, montrant les commandes exécutées

37

Je joue avec les scripts PowerShell et ils fonctionnent très bien. Cependant, je me demande s’il existe un moyen d’afficher également toutes les commandes exécutées, comme si vous les tapiez manuellement vous-même. Ce serait similaire à "echo on" dans les fichiers de commandes. J'ai examiné les arguments de ligne de commande PowerShell, les applets de commande, mais je n'ai rien trouvé d'évident. Merci!

Nelson Rothermel
la source

Réponses:

45

La commande suivante affichera chaque ligne de script dans Write-Debug-

Set-PSDebug -Trace 1

De man Set-PSDebug

Lorsque le paramètre Trace est défini sur 1, chaque ligne de script est suivie au fur et à mesure de son exécution. Lorsque le paramètre est défini sur 2, les attributions de variable, les appels de fonction et les appels de script sont également suivis. Si le paramètre Step est spécifié, vous êtes invité à exécuter chaque ligne du script.

Spongeboy
la source
Si vous ajoutez ceci à un script qui l'utilise Param, assurez-vous de placer cette ligne sous le bloc de définition des paramètres, sinon cela pourrait provoquer des échecs.
kayleeFrye_onDeck
4

Où j’ai utilisé echo ondans CMD, j’utilise maintenant Write-Verboseet à la Set-PSDebug -Stepplace. Ils ne sont pas identiques, mais ils sont plus puissants s'ils sont habilement manipulés.

Jay Bazuzi
la source
2

Laid:

PS > get-content foo.ps1|foreach-object{$_;invoke-expression "$_"}
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
powershell
PS > get-content foo.ps1
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
PS >

Le problème avec ce qui précède est que si vous avez des commandes multilignes comme celle-ci:

foreach($proc in $procs){
  $proc.processname
}

Ce qui précède va échouer avec mon exemple ci-dessus s'il est placé dans foo.ps1 avec cette structure ...

Marco Shaw
la source
Oui, je continue à trouver des demi-solutions comme celle-ci. Je pense vraiment qu'il n'y a pas de solution miracle à ce que je veux. Merci d'être créatif avec ces solutions. J'ai quelques options maintenant et devra décider où aller à partir de maintenant.
Nelson Rothermel
2
help about_History 

Je vous parlerai de toutes les commandes et

Get-History [options]  

renverra la liste complète pour que vous puissiez manipuler \ display etc.

Helvick
la source
2
J'ai trouvé "set-psdebug -trace 1" qui affichera les commandes, mais beaucoup de "bruit" supplémentaire que je ne veux pas. get-history ne génère rien dans un script. Si c'était le cas, je pourrais le coller à la fin du script, mais les commandes ne seraient pas en ligne (avant la sortie de la commande) et les exceptions l'ignoreraient (à moins que je ne le récupère, bien sûr). C'est toujours une bonne chose à garder à l'esprit ... Une autre idée?
Nelson Rothermel
Ah - voulez-vous dire que vous voulez capturer l'entrée et la sortie, ou du moins que vous voulez faire écho aux commandes d'entrée immédiatement suivies de la sortie correspondante? Une façon de le faire consiste à insérer les résultats dans un tableau, puis à parcourir les résultats de get-history en affichant la commande suivie de sa sortie.
Helvick
start-transcript peut également faire ce que vous cherchez, mais il sera limité à la partie texte de la console de l'action.
Helvick
Vous l’avez eu - de la même manière qu’un fichier batch. Nous avons un tas de fichiers de commandes maintenant et j'examine la possibilité de les remplacer par des scripts PowerShell. Nous avons un logiciel pour la planification, la maintenance de l'historique de sortie, etc. Sans écho de la commande d'entrée, il est plus difficile de déboguer. J'imagine que pour faire avancer les résultats, il faut que vous fassiez cela à chaque commande, assurez-vous de capturer les exceptions, etc. afin de ne rien manquer. Une autre option, mais pas tout à fait ce que je cherche. Nous devrons peut-être simplement choisir une option et l'utiliser avec.
Nelson Rothermel
J'ai essayé start-transcript, mais il a seulement noté que cela avait commencé / arrêté, mais rien entre les deux. J'ai lu quelque part qu'il est destiné aux commandes interactives.
Nelson Rothermel