Equivalente de eco no PowerShell para teste de script

233

Gostaria de gerar variáveis ​​e valores em um script do PowerShell configurando sinalizadores e vendo os dados matriculados em todo o script.

Como eu faria isso?

Por exemplo, qual seria o PowerShell equivalente ao seguinte código PHP?

echo "filesizecounter: " . $filesizecounter 
phill
fonte
Confira o editor de script / depurador que acompanha o PowerGUI . Pode ser adequado para o que você está fazendo. Entendo que o Powershell 2 também vem com um depurador (mas ainda não tentei).
dan-gph

Respostas:

275

Existem várias maneiras:

Write-Host: Escreva diretamente no console, não incluído na saída da função / cmdlet. Permite que a cor do primeiro plano e do plano de fundo seja definida.

Write-Debug: Escreva diretamente no console, se $DebugPreferencedefinido como Continuar ou Parar.

Write-Verbose: Escreva diretamente no console, se $VerbosePreferencedefinido como Continuar ou Parar.

O último é destinado a informações opcionais adicionais, Write-Debugpara depuração (portanto, parece caber neste caso).

Adicional : No PSH2 (pelo menos), os scripts que usam a ligação de cmdlet obtêm automaticamente os parâmetros -Verbosee -Debugswitch, ativando localmente Write-Verbosee Write-Debug(ou seja, substituindo as variáveis ​​de preferência), como os cmdlets e provedores compilados.

Richard
fonte
4
O bom de Write-Debug e Write-Verbose é que você pode deixar suas instruções de depuração em seu código e apenas ativar a saída quando precisar, usando a variável de preferência apropriada. Economiza tempo e é um recurso interessante para outros usuários de suas funções.
JasonMArcher
5
Você também deseja se familiarizar com Out-String, porque com qualquer objeto não trivial, será necessário usá-lo para converter o objeto em uma string com capacidade de exibição antes de usar qualquer um desses três cmdlets Write- *.
Jaykul
113

O Powershell possui um eco de mapeamento de alias para Write-Output, portanto:

echo "filesizecounter : $filesizecounter"

Justin R.
fonte
7
echoé um alias para Write-Outputcomo por Microsoft do TechNet e discutido aqui
Glenn Lawrence
2
Graças à Glenn, parece que o apelido foi remapeado nos 6 anos desde que eu publiquei isso. O que é bom, realmente não se deve usar o Write-Host, pois ignora o pipeline. Atualizei minha resposta para indicar isso. Obrigado!
Justin R.
3
Por que você não gostaria de ignorar o pipeline se tudo o que você quer fazer é ecoar a saída "debug" no console para rastrear a execução de um script? Write-Output tem um efeito colateral estranho, onde o conteúdo da última chamada para Write-Output será deixado na pilha, substituindo qualquer variável que você tentar retornar explicitamente de uma função. Efeitos colaterais como esse parecem uma maneira terrivelmente maluca de um idioma se comportar.
Craig
33

O PowerShell interpola, não é?

Em PHP

echo "filesizecounter: " . $filesizecounter 

também pode ser escrito como:

echo "filesizecounter: $filesizecounter" 

No PowerShell, algo assim deve atender às suas necessidades:

Write-Host "filesizecounter: $filesizecounter"
John T
fonte
9
PHP não tem nada a ver com nada nesta questão
reggaeguitar
25
Write-Host "filesizecounter : " $filesizecounter 
aforia
fonte
14

De longe, a maneira mais fácil de ecoar no PowerShell, é apenas criar o objeto String e deixar o pipeline produzir:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Obviamente, você abre mão de alguma flexibilidade ao não usar os métodos Write- *.

Goyuix
fonte
9

eco é alias para Write-Output, embora pareça o mesmo que Write-Host .

Não é qual é a diferença entre eco e Host de gravação no PowerShell? .

echo é um alias para Write-Output, que grava no fluxo de saída Success. Isso permite que a saída seja processada por meio de pipelines ou redirecionada para arquivos. O Write-Host grava diretamente no console, para que a saída não possa mais ser redirecionada / processada.

Paul Fijma
fonte
8

O host de gravação funciona bem.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";
ali Darabi
fonte
5

Não sei se é sensato fazê-lo, mas você pode simplesmente escrever

"filesizecounter: " + $filesizecounter

E deve gerar:

filesizecounter: value

Peter
fonte
1
"filesizecounter: $filesizecounter"é ainda mais curto.
precisa saber é o seguinte
3

O PowerShell possui aliases para vários comandos comuns, como echo. Digite o seguinte no PowerShell:

Get-Alias echo

para obter uma resposta:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

Até Get-Alias ​​tem um alias gal -> Get-Alias. Você pode escrever gal echopara obter o alias para echo.

gal echo

Outros aliases estão listados aqui: https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren

Russ Van Bert
fonte
2

Experimentar Get-Content .\yourScript.PS1 e você verá o conteúdo do seu script.

Além disso, você pode inserir esta linha no seu código de script:

get-content .\scriptname.PS1
script code
script code

....

Luis
fonte
Não mostra os valores reais processados ​​(por exemplo, substituição de env var), portanto, não é uma resposta para a pergunta.
Iisystems 26/08/19
0

Também deve ser mencionado que Set-PSDebug é semelhante ao echo oncomando em lote da velha escola :

Set-PSDebug -Trace 1

Este comando resultará na exibição de todas as linhas do script em execução:

Quando o Traceparâmetro tem o valor 1, cada linha de script é rastreada à medida que é executada. Quando o parâmetro tem um valor 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 da execução de cada linha do script.

lauxjpn
fonte