PowerShell과 티 (티없이 명령을

이 명령을 사용하여 콘솔과 파일 모두에서 출력을 볼 수 있습니다.

powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc

예상대로 작동하지 않으며 몇 가지 질문이 있습니다.

  1. stderr을 파일로 리디렉션하는 방법은 무엇입니까?
  2. 출력이 매우 이상하게 작동합니다. 일부 명령의 경우 텍스트가 인쇄되고 콘솔 / 파일이 업데이트되는 데 상당한 지연이 있습니다. 다른 명령의 경우 텍스트가 인쇄 될 때 출력이 업데이트 된 것으로 보입니다 (티없이 명령을 실행하고 인쇄 해야하는 것을 알고 있습니다). 이 지연은이 티를 거의 쓸모 없게 만듭니다. 중대한 오류가 인쇄되어 명령을 중지해야하는데 너무 늦을 때까지 아무것도 보이지 않습니까?

    일부 명령의 경우 출력은 전체 명령이 완료된 후에 만 ​​인쇄됩니다.

  3. 또한 명령이 사용자 입력을 요구하더라도 콘솔 / 파일 출력은 비어 있습니다! 그 명령을 위해 나는 그것이 필요한 것을 알고 맹목적으로 필요한 텍스트를 인쇄하고 작동했지만 다른 사람들에게는-출력이 없으면 명령이 내 입력을 기다리는 동안 무언가가 무한정 기다릴 것입니다!

이러한 문제에 대한 해결책이 있습니까? 그렇지 않은 경우 PowerShell의이 티는 완전히 쓸모가 없습니다.



답변

  1. My-Command 2>&1 | Tee-Object 'myfile.log'. 참조하십시오 Get-Help about_Redirection.
  2. Ctrl+에 의존하지 않고 트래핑 오류가 있어야합니다 C. 참조하십시오 Get-Help about_Try_Catch_Finally. 명령이 외부 프로그램 또는 스크립트를 실행하고 있습니까?
  3. 내가 이해하는 것처럼 일반적으로 문자열 끝 문자는 줄 끝 문자에 도달 할 때까지 파이프로 전송되지 않습니다. 그 이유는 매우 간단합니다. 이렇게하지 않으면 부분 (읽기 : 불완전한) 문자열이 파이프로 내려갑니다. Tee부분 문자열은 잘 처리 할 수 ​​있지만 다른 cmdlet은 ForEach-Object그렇지 않거나 Select-Object확실하지 않습니다. 참고 Get-Content특별한 스위치가 -ReadCount어느 정도이 동작을 무시하고,과는 것이다 심각하게 혼란 Select-Object -Skip/-First/-Last/-Unique파이프 아래로 더 명령.

실행중인 외부 프로그램이 PowerShell이 ​​기대하는 규칙을 따르지 않을 수도 있습니다. Tee예를 들어,이라는 이름이 적절하게 지정 Tee-Object되어있어 작업하기에 좋은 종류를 알려줍니다. 이 경우 콘텐츠를 즉시 전달하도록 설계된 GNU Win32 Utils 또는 MSYStee.exe 에서 더 많은 정보를 얻을 수 있습니다.