PowerShell에서 무언가를 출력하는 방법


210

배치 파일 내에서 PowerShell 스크립트를 실행하고 있습니다. 스크립트는 웹 페이지를 가져 와서 페이지 내용이 "OK"문자열인지 확인합니다.

PowerShell 스크립트는 오류 수준을 배치 스크립트로 반환합니다.

배치 스크립트는 FTP 자동화 프로그램 인 ScriptFTP 에 의해 실행됩니다 . 오류가 발생하면 ScriptFTP가 전자 메일을 통해 전체 콘솔 출력을 관리자에게 보내도록 할 수 있습니다.

PowerShell 스크립트에서 "OK"가 아닌 경우 웹 사이트에서 반환 값을 출력하고 싶습니다. 따라서 오류 메시지가 콘솔 출력과 상태 메일에 포함됩니다.

PowerShell을 처음 사용하고 어떤 출력 함수를 사용할지 잘 모르겠습니다. 세 가지를 볼 수 있습니다.

  • 쓰기 호스트
  • 쓰기 출력
  • 쓰기 오류

Windows에 해당하는 내용을 쓰는 데 올바른 것은 무엇입니까 stdout?

답변:


196

단순히 무언가를 출력하는 것은 PowerShell이 ​​아름다움의 하나이며 가장 큰 장점 중 하나입니다. 예를 들어, 일반적인 Hello, World! 응용 프로그램이 한 줄로 줄어 듭니다.

"Hello, World!"

문자열 객체를 생성하고 위에서 언급 한 값을 할당하며 명령 파이프 라인의 마지막 항목으로 .toString()메소드를 호출 하고 결과를 STDOUT(기본적으로) 출력합니다 . 아름다움의 것.

다른 Write-*명령은 텍스트를 관련 스트림으로 출력하는 것과 관련이 있으며 그와 같은 위치에 있습니다.


9
그것은 실제로 일어나는 일이 아닙니다. 문자열 리터럴 표현식이며 파이프 라인에서 유일한 것입니다. 따라서와 같습니다 "Hello, World!" | Out-Host. Out-Host반면에 표시 할 개체를 PowerShell 호스트로 보내면 해당 구현은 호스트에 따라 다릅니다. 콘솔 호스트는 Out-Default실제로 표준 출력 핸들로 전달 합니다 (길 을 따라 지나 감 ). PowerShell ISE는이를 출력 창에 표시하지만 다른 호스트는 다른 작업을 수행 할 수도 있습니다.
Joey

5
객체는 맹목적으로 문자열로 변환되지 않지만 객체 로 무엇을할지 결정 하는 포맷터 를 통과 합니다. 따라서 Get-ChildItem예를 들어의 결과가 표 형식으로 표시되고 많은 속성 (예 : WMI)이 기본으로 설정된 결과가 나타납니다 Format-List.
Joey

120

이 경우 Write-Output 이 필요하다고 생각 합니다.

당신이 같은 스크립트를 가지고 있다면

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

그런 다음 리디렉션 된 출력으로 스크립트를 호출하면 yourscript.ps1 > out.txt , 당신은 얻을 것이다 test2화면 test1\ntest3\n은 "out.txt"이다.

"test3"및 Write-Output 행은 항상 텍스트에 새 행을 추가하며 PowerShell에서이를 중지 할 수있는 방법이 없습니다 (즉 echo -n, 기본 명령을 사용하는 PowerShell에서는 불가능 함). 당신이 ( Bash 에서 다소 기본적이고 쉬운 ) 기능 을 원한다면echo -n 원한다면 samthebest의 답변 을 참조하십시오 .

배치 파일이 PowerShell 명령을 실행하면 대부분 Write-Output 명령을 캡처합니다. 시스템 관리자와 콘솔에 무엇을 써야하는지, 무엇을해서는 안되는지에 대해 "긴 토론"을했습니다. 우리는 이제 스크립트가 성공적으로 실행되거나 사망 한 경우에만 정보를 Write-Host가져와야하며 스크립트 작성자가 수행 한 모든 항목이 실행 (업데이트 된 항목, 설정된 필드 등)에 대해 알아야 할 것에 동의했습니다. 쓰기 출력. 이 방법으로 시스템 관리자에게 스크립트를 제출 runthescript.ps1 >someredirectedoutput.txt하면 모든 것이 정상이면 화면에서 쉽게 볼 수 있습니다 . 그런 다음 "someredirectedoutput.txt"를 개발자에게 다시 보내십시오.


9

다음은 Echo와 Write-Host 의 좋은 전시회라고 생각합니다 . test ()가 실제로 하나의 int가 아닌 int의 배열을 실제로 반환하는 방법에 주목하십시오.

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])"

위의 터미널 출력 :

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789

나는이 모든 일을 볼 수 있습니다 ...하지만 왜 $x = test에만 인쇄 123도하지 456?
not2qubit

7

기본 스트림 (출력 및 오류)에 쓰므로 시나리오에서이 중 하나를 사용할 수 있습니다. 출력을 다른 커맨드 렛으로 파이프하는 경우 Write-Output 을 사용하려고합니다. Write-Output 은 결국 Write-Host 에서 종료됩니다 .

이 문서에서는 다양한 출력 옵션에 대해 설명합니다. PowerShell O는 출력용입니다.


1
링크 주셔서 감사합니다. 세상에, 이것은 복잡하다 . Write-host가 일종의 엔드 포인트 또는 플러시 기능인 경우이를 시도한 후 다시보고합니다.
Pekka

3
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta

마젠타는 "System.ConsoleColor"열거 자 값 중 하나 일 수 있습니다 (검정, 진한 파랑, 진한 녹색, 진한 청록, 진한 빨강, 진한 마젠타, 진한 노랑, 회색, 진회색, 파랑, 녹색, 청록, 빨강, 자홍, 노랑, 흰색).

+ $File.FullName선택 사항이며, 쇼는 어떻게 문자열로 변수를 넣어.


2

PowerShell을 사용하여 성가신 개행을 생략 할 수는 없습니다. 이를 수행하는 스크립트 또는 cmdlet이 없습니다.

물론 Write-Host는 리다이렉트 / 파이프 할 수 없기 때문에 절대적으로 넌센스입니다! 당신은 단순히 자신의 것을 작성해야합니다 :

using System;

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

예 :

PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>

powershell 자체 에서이 작업을 수행 할 수 있습니다. [System.Console] :: Write ( "stringy") 그러나 powershell에서는 전혀 리디렉션 할 수 없습니다.
Nicholi

1
물론 넌 할 수있어. 이 질문
Slogmeister Extraordinaire

1

Windows 표준 stdout에 쓰는 데 올바른 방법은 무엇입니까?

효과가 있지만, 매우 불행하게도 , 모두 의 Windows PowerShell 및 PowerShell을 코어 7.0의로 보내 모두 자신의 6 (!)의 출력 스트림표준 출력을 할 때 호출 외부에서 PowerShell을의를 통해, CLI .

  • 이전 버전과의 호환성을 위해 수정되지 않는이 문제가있는 동작에 대한 설명은 이 GitHub 문제 를 참조하십시오 .

  • 실제로 이것은 출력을 보내는 PowerShell 스트림이 외부 호출자의 stdout 출력 으로 표시됨을 의미 합니다.

    • 예를 들어에서 다음을 실행하면 stdout 리디렉션 이 모든 PowerShell 스트림에 동일하게 적용 되므로 출력 cmd.exe이 표시 되지 않습니다NUL .

      • C:\>powershell -noprofile -command "Write-Error error!" >NUL
    • 그러나 - 호기심 - 당신이 경우 표준 오류 리디렉션 , PowerShell을 하지 stderr에 자사의 에러 스트림을 보내 , 그래서 그와 2>당신이 할 수 오류 스트림 출력을 선택적으로 캡처; 다만 다음 출력 'hi'- 성공 스트림 출력 - 파일 에러 스트림 출력을 캡처하는 동안 err.txt:

      • C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt

바람직한 행동 입니다 :

  • PowerShell의 성공 출력 스트림 (number 1)을 stdout으로 보냅니다 .
  • 출력을 전송 하는 모든 다른 스트림열려진 주어진 유일한 옵션이며, 사이 프로세스 만 출력 스트림이 존재 - 표준 출력 (표준 출력)을위한 데이터 및 오류 메시지를 표준 에러 (표준 오차) 그 외의 모든 메시지를 - 예 데이터 가 아닌 상태 정보로 .

  • 현재 존중되지 않더라도 코드에서 이러한 차이를 만드는 것이 좋습니다 .


내부 PowerShell :

  • Write-Host에 대한 표시 출력바이 패스 성공 출력 스트림 - 같은 출력은 둘 (직접) 가변 캡처도 억제도 리디렉션 될 수 없다.

    • 원래 의도는 단순히 사용자 피드백을 작성하고 간단한 콘솔 기반 사용자 인터페이스 (컬러 출력)를 작성하는 것이 었습니다.

    • 인해 포획 또는 리디렉션 종래 무능력 PowerShell을 만든 버전 (5)에 Write-Host새롭게 도입로 정보 스트림 (번호 6), 그럼 이래로 캡처 및 리디렉션 가능한 Write-Host출력.

  • Write-Error비 종료 오류를 오류 스트림 (number ) 에 기록 하기위한 것입니다2 . 개념적으로 오류 스트림은 stderr과 같습니다.

  • Write-Output성공 [출력] 스트림 (number 1)에 씁니다 . 이는 개념적으로 stdout과 같습니다. 그것은 인 기록 스트림에 데이터 행 (결과).

    • 그러나 PowerShell의 암시 적 출력 기능 으로 인해 명시적인 사용 Write-Output이 거의 필요하지 않습니다. .
      • 명시 적으로 캡처, 억제 또는 경로 재 지정되지 않은 명령 또는 표현식의 출력은 자동으로 성공 스트림 으로 전송됩니다 . 예를 들어, Write-Output "Honey, I'm $HOME""Honey, I'm $HOME"도 빠르게 후자뿐만 아니라 것보다 간결와 동일하지만.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.