콘솔 앱을 개발하는 동안 PowerShell에서 출력을 자체적으로 파이프 할 수 없음을 발견했습니다.
다음과 같이 작동하는 작은 재현 (아래 소스)을 만들었습니다.
PS> .\but-why.exe print # continuously prints a random number every 500 ms
1746112985
1700785785
331650882
...
PS> .\but-why.exe read # echoes stdin
foo # this was typed
read 'foo'
bar # this too
read 'bar'
PS> "foo","bar" | .\but-why.exe read
read 'foo'
read 'bar'
그러나 나는의 출력을 공급하려고 할 때 print
에 read
아무 일도 발생하지 않습니다를 :
PS> .\but-why.exe print | .\but-why.exe read
모든 출력을 성공 스트림으로 리디렉션 할 때도 동일합니다.
PS> .\but-why.exe print *>&1 | .\but-why.exe read
그러나 CMD를 사용하면 모든 것이 예상대로 작동합니다.
CMD> but-why.exe print | but-why.exe read
read '317394436'
read '1828759797'
read '767777814'
...
디버깅을 통해 두 번째 인스턴스 .\but-why.exe read
가 시작되지 않은 것 같습니다.
아마도 그것은 나의 오래된 PS 버전일까요?
PS> $host.Version
Major Minor Build Revision
----- ----- ----- --------
5 1 19041 610
콘솔 앱 소스 (net5.0) :
using System;
using System.Threading;
switch (args[0]) {
case "print": Print(); break;
case "read": Read(); break;
}
void Print() {
var rng = new Random();
while (true) {
Console.WriteLine(rng.Next());
Thread.Sleep(500);
}
}
void Read() {
string? text;
while ((text = Console.ReadLine()) != null) {
Console.WriteLine($"read '{text}'");
}
}
당신은보고있는 디자인 제한 에서 Windows PowerShell을 하기 때문에 크로스 플랫폼에서 수정되었습니다 PowerShell을 [코어] 7+ 버전 :
Windows PowerShell 이 외부 프로그램간에 텍스트 를 파이프 할 때 예기치 않게 일반적인 스트리밍 동작 이 나타나지 않습니다 .
즉, 수신 되는대로 출력 줄을 전달하는 대신 PowerShell 은 첫 번째 프로그램에서 모든 출력 을 수집 한 다음 두 번째 프로그램으로 전달하려고합니다.
귀하의 경우 첫 번째 프로그램이 출력 생성을 멈추지 않기 때문에 Windows PowerShell 엔진은 모든 출력이 수집 되기를 기다리는 것을 멈추지 않으므로 효과적으로 중단됩니다 (결국 메모리가 부족할 때까지). 대상 프로그램이 시작되지도 않습니다. 출력 수집이 완료된 후에 만 발생합니다 .
해결 방법 :
가능한 경우이 제한이 제거 된 PowerShell [Core] 7+로 전환합니다 .
Windows PowerShell에서 cmd.exe
관찰 한대로 예상되는 스트리밍 동작을 나타내는를 통해 파이프 라인을 호출합니다 .
# Workaround via cmd.exe
cmd /c '.\but-why.exe print | .\but-why.exe read'
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다