실행 중에 PowerShell 출력을 파일로 리디렉션하는 방법


198

출력을 파일로 리디렉션하려는 PowerShell 스크립트가 있습니다. 문제는이 스크립트가 호출되는 방식을 변경할 수 없다는 것입니다. 그래서 나는 할 수 없습니다 :

 .\MyScript.ps1 > output.txt

PowerShell 스크립트가 실행되는 동안 출력을 어떻게 리디렉션합니까?

답변:


192

아마도 Start-Transcript당신을 위해 일할 것입니다. 이미 실행 중이면 중지 한 다음 시작하고 완료되면 중지하십시오.

$ ErrorActionPreference = "SilentlyContinue"
정지 대본 | 널이 아닌
$ ErrorActionPreference = "계속"
시작 스크립트-경로 C : \ output.txt-추가
# 몇 가지 일을
정지 대본

또한 작업하는 동안 이것을 실행하고 나중에 참조 할 수 있도록 명령 행 세션을 저장하도록 할 수 있습니다.

복사하지 않은 대화 내용을 중지하려고 할 때 오류를 완전히 억제하려면 다음을 수행하십시오.

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
start-transcript는 Write-Error, Write-Verbose 또는 Write-Debug ... 표준 출력 만 기록하지 않습니다.
Richard Berg

6
@ richard : 지금 그렇게 나타납니다. 어쩌면 이것은 2.0 추가 일 것입니다.이 답변이 모두 1.0에 적용되는지 확실하지 않습니다.
Robert S Ciaccio

위의 거의 동일한 코드를 사용하고 있습니다. 내 문제는 스크립트 작성이 시작되지 않은 경우 Stop-Transcript out-null이 여전히 오류 출력을 보내는 것입니다. 레이아웃이 엉망이되어 메시지를 표시하지 않아야합니다. -erroraction은 자동적으로 도움이되지 않습니다. 어떤 아이디어?
Mel

4
마침내 Start-Transcript에 대한 문서를 찾았습니다 . (절약 적으로 Powershell 버전 번호가 표시되어 있지 않습니다). 그것은 말한다 "성적표 모든 명령이 사용자 유형 및 콘솔에 나타나는 모든 출력 포함"을. 그러나 Powershell 2.0에서 Start-Transcript를 테스트했으며 @Richard가 옳다는 것을 알았습니다. 표준 오류 대화 내용에 저장 되지 않습니다 . 짜증나!
Colonic Panic

이 방법은 실제로 지정된 위치에 쓸 수있는 권한이 있으면 경고하지 않습니다.
demongolem

51

Microsoft는 Powershell의 Connections 웹 사이트 (2012-02-15 (4:40 PM)) 에서 버전 3.0에서이 문제에 대한 솔루션으로 리디렉션을 확장 했다고 발표했습니다 .

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

자세한 내용과 예는 "about_Redirection"도움말을 참조하십시오.

help about_Redirection

1
이 솔루션이 마음에 들지 않습니다. 사실, 나는 추악하고 기억하기 어렵고 융통성이 없다고 생각합니다. Out- *, Set-Content 및 Add-Content Cmdlet에 스트림 캡처 매개 변수를 추가하는 것이보다 강력한 방식으로 트릭을 수행 한 것처럼 보입니다. 이들이있는 동안 -PassThru 매개 변수도 추가해야합니다. 유용하지 않은 Tee-Object Cmdlet을 쓸모 없게 만드는 것입니다.
Nathan Hartley

혼란 스러워요. 질문에 대한 답변이 어떻게 되나요? " 실행 중에 PowerShell 스크립트의 출력을 어떻게 리디렉션 합니까?"
Zoredache

당신은 맞습니다, @Zoredache, "이 스크립트가 호출되는 방식을 바꿀 수 없습니다"요구 사항을 간과 한 것 같습니다. 대부분의 출력을 캡처 할 때 Start-Transcript가 좋습니다. 이 답변을 제거해야합니까?
Nathan Hartley

1
일반적인 리디렉션을 위해 여기에 오는 사람들을 위해 Powershell은 이후 -OutVariable -WarningVariable -ErrorVariable을 추가하여 1 월 3 '14 해설에 직접 답변합니다.
Nathan Hartley

2
아니요, 그대로 두는 것이 좋습니다. 업 투표 수를 감안할 때 분명히 유용합니다. 이 질문은 거의 확실하게 스크립트 호출 방식을 바꿀 수있는 사람들로부터 Google의 인기를 얻고 있습니다.
Zoredache

36

사용하다:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
"실행 중"작동하지 않기 때문에 OP의 질문을 해결하지 못합니다. 그러나 어쨌든 Powershell에 파이프하는 방법을 아는 것이 유용하기 때문에 +1을주었습니다.
Paul Masri-Stone

28

나는 당신이 수정할 수 있다고 생각합니다 MyScript.ps1. 그런 다음 다음과 같이 변경하십시오.

$(
    Here is your current script
) *>&1 > output.txt

방금 PowerShell 3으로 이것을 시도했습니다 . Nathan Hartley의 답변 에서와 같이 모든 리디렉션 옵션을 사용할 수 있습니다 .


나는이 해결책을 좋아한다. >> output.txt를 사용하여 추가 할 수 있습니다. 유니 코드 대신 ASCII를 만들 수있는 방법이 있는지 아는 사람이 있습니까?
Von Lemongargle 교수

1
다음과 같이 시도해 볼 수 *>&1 | Out-File $log -Encoding ascii -Append -Width 132있지만 출력을 정확하게 제어 해야하는 경우 Powershell이 ​​실제로 추악합니다.
mplwork

스크립트에서 작동하기 때문에 이것을 선호합니다. 방랑자에게 적합합니다.
user3505901

25

상황에 따라 허용되는 한 가지 해결책 :

  1. MyScript.ps1의 이름을 TheRealMyScript.ps1로 바꿉니다.
  2. 다음과 같은 새 MyScript.ps1을 만듭니다.

    . \ TheRealMyScript.ps1> output.txt


18
powershell ".\MyScript.ps1" > test.log

1
이것은이었다 단지 내 스크립트 출력을 위해 일하는 많은 옵션의.
cori

17

cmdlet Tee-Object를 살펴볼 수 있습니다 . 출력을 Tee로 파이프 할 수 있으며 파이프 라인과 파일에도 쓰게됩니다.


1
"출력"| Set-Content -PassThru 및 ​​"출력"| Add-Content -PassThru는 Tee-Object와 같이 작동하며 인코딩을 설정할 수있는 추가 이점이 있습니다.
Nathan Hartley

16

모든 출력을 파일로 직접 리디렉션하려면 다음을 사용하십시오 *>>.

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

이것은 파일로 직접 리디렉션되므로 콘솔로 출력되지 않습니다 (종종 도움이 됨). 콘솔 출력을 원하면 모든 출력을와 결합한 *&>1후 다음을 사용하여 파이프하십시오 Tee-Object.

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

이러한 기술은 PowerShell 3.0 이상에서 지원된다고 생각합니다. PowerShell 5.0에서 테스트 중입니다.


4

스크립트 자체에 내장되어 있지 않고 명령 행에서 수행하려면 다음을 사용하십시오.

.\myscript.ps1 | Out-File c:\output.csv

7
asker는 스크립트 호출을 변경할 수 없다고 명시 적으로 설명하고 있습니다.
Fer

2
질문과 관련이 없지만 저에게 도움이되는 파이프로 파일에 올바른 구문을 얻기 위해 인터넷 검색을하고있었습니다.
gReX 2019

0

이것을 스크립트에 포함시키기 위해 다음과 같이 할 수 있습니다 :

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

그 트릭을해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.