Script do PowerShell, mostrando comandos executados

37

Estou brincando com os scripts do PowerShell e eles estão funcionando muito bem. No entanto, estou me perguntando se há alguma maneira de também mostrar todos os comandos que foram executados, como se você estivesse digitando manualmente eles mesmos. Isso seria semelhante a "eco" em arquivos em lotes. Examinei os argumentos da linha de comando do PowerShell, os cmdlets, mas não achei nada óbvio. Obrigado!

Nelson Rothermel
fonte

Respostas:

45

O comando a seguir produzirá cada linha de script para Write-Debug-

Set-PSDebug -Trace 1

A partir de man Set-PSDebug

Quando o parâmetro Trace é definido como 1, cada linha de script é rastreada à medida que é executada. Quando o parâmetro é definido como 2, atribuições de variáveis, chamadas de função e chamadas de script também são rastreadas. Se o parâmetro Step for especificado, você será solicitado antes que cada linha do script seja executada.

Spongeboy
fonte
Se você adicionar isso a um script usado Param, certifique-se de colocar esta linha abaixo do bloco de definição de parâmetros, ou poderá causar falhas.
kayleeFrye_onDeck
4

Onde eu usei echo onno CMD, eu uso agora Write-Verbosee Set-PSDebug -Stepem vez disso. Eles não são os mesmos, mas são mais poderosos se usados ​​com habilidade.

Jay Bazuzi
fonte
2

Feio:

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 >

O problema com o exposto acima é que, se você tiver comandos de várias linhas como este:

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

O exemplo acima falhará com o meu exemplo acima, se for colocado em foo.ps1 com essa estrutura ...

Marco Shaw
fonte
Sim, continuo encontrando meias soluções como esta. Eu realmente acho que não há uma "bala de prata" para o que eu quero. Obrigado por ser criativo com essas soluções. Agora tenho algumas opções e terei que decidir para onde ir daqui.
Nelson Rothermel
2
help about_History 

Contará sobre todos os comandos e

Get-History [options]  

retornará a lista completa para você manipular \ display etc.

Helvick
fonte
2
Encontrei "set-psdebug -trace 1" que mostrará os comandos, mas não há muito "ruído" extra. get-history não produz nada em um script. Se isso acontecesse, eu poderia colocá-lo no final de um script, mas os comandos não estariam alinhados (antes da saída do comando) e quaisquer exceções o ignorariam (a menos que eu entendesse, é claro). Ainda é bom ter em mente ... Alguma outra idéia?
Nelson Rothermel
Ah - você quer capturar a entrada e a saída, ou pelo menos deseja repetir os comandos de entrada imediatamente seguidos pela saída correspondente? Uma maneira de fazer isso é enviar os resultados para uma matriz e, em seguida, percorrer os resultados do get-history emitindo o comando seguido por sua saída.
Helvick 13/01/10
A start-transcript também pode fazer o que você procura, mas será limitada apenas à parte do texto do console da ação.
Helvick
Você conseguiu - da mesma maneira que um arquivo em lotes funciona. Agora temos um monte de arquivos em lotes e estou analisando a viabilidade de substituí-los por scripts do PowerShell. Temos software para agendamento, manutenção do histórico de saída, etc. Sem o eco do comando de entrada, é mais difícil depurar. Suponho que pressionar os resultados requer que você faça isso em todos os comandos, certifique-se de capturar exceções etc. para não perder nada. Outra opção, mas não exatamente o que estou procurando. Podemos apenas escolher uma opção e executar com ela.
Nelson Rothermel
Eu tentei start-transcript, mas ele só registrou que começou / parou, mas nada no meio. Li em algum lugar para comandos interativos.
Nelson Rothermel