Como produzir algo em PowerShell

estou a executar um script PowerShell de dentro de um ficheiro em lote. O script obtém uma página web e verifica se o conteúdo da página é a string "OK".

o programa PowerShell devolve um nível de erro ao programa em lote.

o programa em lote é executado por ScriptFTP , UM programa de automação FTP. Se ocorrer um erro, eu posso ter ScriptFTP enviar a saída completa da consola para o Administrador por e-Mail.

no script PowerShell, eu gostaria de apresentar o return value from the web site if it is not "OK", so the error message gets included in the console output, and thus in the status mail.

sou novo no PowerShell e não sei qual a função de saída a usar para isto. Posso ver três:

  • Máquina De Escrever
  • Write-Output
  • Erro De Escrita

Qual seria a coisa certa a usar para escrever nas janelas equivalente a {[[0]}?

Author: Pekka 웃, 2010-01-10

7 answers

Simplesmente expor algo é uma coisa de beleza e uma das suas maiores forças. Por exemplo, o Olá comum, mundo! o pedido é reduzido para uma única linha:
"Hello, World!"

Ele cria um objecto de cadeia de caracteres, atribui o valor acima mencionado, e sendo o último item no pipeline de comandos chama o método .toString() e produz o resultado para STDOUT (por omissão). Uma beleza.

Os outros comandos Write-* são específicos para transmitir o texto aos seus associados riachos, e ter o seu lugar como tal.

 161
Author: Goyuix, 2014-12-29 11:35:50

Eu acho que neste caso você vai precisar Write-Output .

Se tiver um guião como

Write-Output "test1";
Write-Host "test2";
"test3";

Então, se você chamar o script com saída redirecionada, algo como yourscript.ps1 > out.txt, você vai obter test2 na tela test1\ntest3\n No " out.txt".

Note que "test3" e a linha de Escrita-saída irá sempre adicionar uma nova linha ao seu texto e não há nenhuma maneira em PowerShell para parar isto (isto é, echo -n é impossível em PowerShell com os comandos nativos). Se você quiser (o um pouco básico e fácil em Bash) funcionalidade de echo -n então veja a resposta do samthebest.

Se um ficheiro em lote executar um comando PowerShell, irá provavelmente capturar o comando Write-Output. Eu tive "longas discussões" com administradores de sistema sobre o que deve ser escrito para o console e o que não deve. Nós agora concordamos que a única informação se o script executado com sucesso ou morreu tem que ser Write-Host'ed, e tudo que é o autor do script pode a necessidade de saber sobre a execução (quais itens foram atualizados, quais campos foram definidos, etc.) vai para Write-Output. Desta forma, quando você enviar um script para o administrador do sistema, ele pode facilmente {[[7]} e ver na tela, se tudo estiver bem. Em seguida, envie o " someredirected output.TXT " de volta para os desenvolvedores.

 106
Author: naivists, 2017-05-23 11:54:50

Você pode usar qualquer um destes no seu cenário, uma vez que eles escrevem para os fluxos padrão (saída e erro). Se estivesse a encaminhar o resultado para outra 'commandlet', iria querer usar Write-Output, a qual terminará eventualmente em Write-Host.

Este artigo descreve as diferentes opções de saída: PowerShell O é para a saída

 7
Author: GrayWizardx, 2014-12-27 14:28:31

Eu acho que o seguinte é uma boa exibição de Echo vs. Write-Host . Observe como test () realmente retorna um array de ints, não um único int como alguém poderia facilmente ser levado a acreditar.

function test {
    Write-Host 123
    echo 456 # AKA 'Write-Output'
    return 789
}

$x = test

Write-Host "x of type '$($x.GetType().name)' = $x"

Write-Host "`$x[0] = $($x[0])"
Write-Host "`$x[1] = $($x[1])"

Saída do Terminal acima:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789
 6
Author: user2426679, 2017-06-04 12:14:46
Simplesmente não consegues que o PowerShell omita essas novas linhas chatas. Não há nenhum script ou cmdlet que faça isso. É claro que a máquina de escrever é um disparate absoluto porque não se pode redireccionar/pipe dela! Você simplesmente tem que escrever o seu próprio:
using System;

namespace WriteToStdout
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args != null)
            {
                Console.Write(string.Join(" ", args));
            }
        }
    }
}

Por exemplo

PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>
 2
Author: samthebest, 2012-10-06 14:32:29
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta
A Magenta pode ser um dos "sistemas".ConsoleColor " enumerator values-Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White.

O + $File.FullName é opcional, e mostra como colocar uma variável no texto.

 2
Author: jordan.peoples, 2015-02-02 22:15:26

Use um programa externo como dentro do seu programa PowerShell:

cmd /c echo "Long string: $LongStr" 

isto é estúpido e caro em termos de executar um processo separado, mas PowerShell é mal projetado.

 -11
Author: PowerlessShellUser, 2014-12-27 14:35:24