Quero que meu script do PowerShell imprima algo como isto:
Enabling feature XYZ......Done
O script é mais ou menos assim:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Mas Write-Output
sempre imprime uma nova linha no final, para que minha saída não esteja em uma linha. Existe uma maneira de fazer isso?
powershell
Amit G
fonte
fonte
Respostas:
fonte
Write-Output
, que tem uma função muito diferente daWrite-Host
. Os leitores devem observar essa grande discrepância antes de copiar / colar a resposta.Write-Host
quase nunca é a resposta certa. É o equivalente a fazer>/dev/tty
no Unixland.Write-Progress
pode ser apropriado em alguns casos, veja o exemplo abaixo.Write-Output
.Write-Output
não possui o-NoNewLine
parâmetroInfelizmente, conforme observado em várias respostas e comentários,
Write-Host
pode ser perigoso e não pode ser canalizado para outros processos eWrite-Output
não possui o-NoNewline
sinalizador.Mas esses métodos são as maneiras "* nix" de exibir a progressão, a maneira como o "PowerShell" faz isso
Write-Progress
: exibe uma barra na parte superior da janela do PowerShell com informações sobre o progresso, disponível no PowerShell 3.0 em diante, consulte o manual para detalhes.E, tomando o exemplo do OP:
fonte
Embora possa não funcionar no seu caso (como você está fornecendo uma saída informativa ao usuário), crie uma string que possa ser usada para anexar a saída. Quando chegar a hora de produzi-lo, basta imprimir a string.
Ignorando, é claro, que este exemplo é bobo no seu caso, mas útil no conceito:
Exibe:
fonte
Write-Output
. Solução razoável, mas não uma solução.Sim, como outras respostas têm estados, isso não pode ser feito com Write-Output. Onde o PowerShell falha, use o .NET, existem algumas respostas do .NET aqui, mas elas são mais complexas do que precisam.
Apenas use:
Não é o PowerShell mais puro, mas funciona.
fonte
Write-Host
, exceto que as pessoas não esperam isso.Para gravar em um arquivo, você pode usar uma matriz de bytes. O exemplo a seguir cria um arquivo ZIP vazio, no qual você pode adicionar arquivos:
Ou use:
fonte
Uma simplificação à resposta de FrinkTheBrave:
fonte
O problema que percebi foi que a Write-Output na verdade quebra a linha ao usar o PowerShell v2, pelo menos para o stdout. Eu estava tentando escrever um texto XML no stdout sem sucesso, porque seria difícil envolver o caractere 80.
A solução alternativa era usar
Este não foi um problema no PowerShell v3. O Write-Output parece estar funcionando corretamente lá.
Dependendo de como o script do PowerShell é chamado, pode ser necessário usar
antes de escrever para stdout.
fonte
Parece não haver maneira de fazer isso no PowerShell. Todas as respostas anteriores não estão corretas, porque não se comportam da maneira como
Write-Output
se comporta, mas são mais parecidas com asWrite-Host
que não têm esse problema.A solução de fechamento parece ser usada
Write-Host
com o-NoNewLine
parâmetro Você não pode canalizar isso que geralmente é um problema, mas existe uma maneira de substituir essa função, conforme descrito em Host de Gravação => Exportar para um arquivo , para que você possa aceitar facilmente o parâmetro de um arquivo de saída. Isso ainda está longe de ser uma boa solução. ComStart-Transcript
isso, é mais utilizável, mas esse cmdlet tem problemas com aplicativos nativos.Write-Output
simplesmente não pode fazer o que você precisa em um contexto geral.fonte
Write-Host
é terrível, um destruidor de mundos, mas você pode usá-lo apenas para exibir o progresso de um usuário enquanto estiver usando oWrite-Output
log (não que o OP solicite o log).fonte
Write-Progress
.Você simplesmente não pode fazer com que o PowerShell omita essas novas linhas desagradáveis ... Não existe script ou cmdlet. Obviamente, Write-Host é um absurdo absoluto, porque você não pode redirecionar / canalizar a partir dele!
No entanto, você pode escrever seu próprio arquivo EXE para isso, o que eu expliquei como fazer na questão do Stack Overflow. Como gerar algo no PowerShell .
fonte
A resposta da shufler está correta. Em outras palavras: em vez de passar os valores para Write-Output usando o ARRAY FORM,
ou o equivalente por várias chamadas para Write-Output,
concatene seus componentes em uma STRING VARIABLE primeiro:
Isso impedirá os CRLFs intermediários causados pela chamada Write-Output várias vezes (ou ARRAY FORM), mas é claro que não suprimirá o CRLF final do comando write-Output. Para isso, você precisará escrever seu próprio commandlet, usar uma das outras soluções complicadas listadas aqui ou aguardar até que a Microsoft decida dar suporte ao
-NoNewline
opção de Saída de gravação.Seu desejo de fornecer um medidor de progresso de texto ao console (por exemplo, "...."), em vez de gravar em um arquivo de log, também deve ser satisfeito usando o Write-Host. Você pode realizar ambos coletando o texto da mensagem em uma variável para gravar no log E usando o Write-Host para fornecer progresso ao console. Essa funcionalidade pode ser combinada em seu próprio comando para obter a melhor reutilização de código.
fonte
Write-Output
, você simplesmente não pode vê-lo porque é a última coisa escrita. Solução razoável, mas não uma solução. Pode haver algo consumindo a saída resultante que não pode lidar com a nova linha à direita.A seguir, colocará o cursor de volta no início da linha anterior. Cabe a você colocá-lo na posição horizontal correta (usando $ pos.X para movê-lo para o lado):
Sua saída atual é de 27 espaços, portanto $ pos.X = 27 pode funcionar.
fonte
$pos.X
também. O problema é que, se você o canalizar para um arquivo, duas linhas separadas serão exibidas.Pode não ser muito elegante, mas faz exatamente o que o OP solicitou. Note que o ISE mexe com StdOut, então não haverá saída. Para ver este script funcionar, não pode ser executado dentro do ISE.
fonte
[System.Console]
não pode ser redirecionado para um arquivo.Eu trapacei, mas acredito que esta é a única resposta que atende a todos os requisitos. Nomeadamente, isso evita o CRLF à direita, fornece um local para a outra operação ser concluída nesse meio tempo e redireciona adequadamente para o stdout, conforme necessário.
fonte
fonte
o / p desejado: Ativando o recurso XYZ ...... Concluído
você pode usar o comando abaixo
$ a = "Ativando o recurso XYZ"
Saída de gravação "$ a ...... Concluído"
você precisa adicionar variável e instrução dentro de aspas. espero que isso seja útil :)
Obrigado Techiegal
fonte
Já há muita resposta aqui, ninguém vai rolar aqui. De qualquer forma, também existe uma solução para escrever texto sem uma nova linha no final, com o seguinte:
Saída de arquivo com codificação:
Saída de consol:
fonte
Você pode absolutamente fazer isso. Write-Output tem um sinalizador chamado " NoEnumerate " que é essencialmente a mesma coisa.
fonte