![PowerShell 쓰기 호스트가 동기적이지 않음](https://rvso.com/image/658747/PowerShell%20%EC%93%B0%EA%B8%B0%20%ED%98%B8%EC%8A%A4%ED%8A%B8%EA%B0%80%20%EB%8F%99%EA%B8%B0%EC%A0%81%EC%9D%B4%EC%A7%80%20%EC%95%8A%EC%9D%8C.png)
서버의 일부 속성을 확인하기 위해 PowerShell 스크립트를 작성 중입니다. 다음 cmdlet을 실행할 때순서대로, 출력이 예상한 순서대로 표시되지 않습니다.
Write-Host "=== Operating System ==="
Get-WmiObject -computername $ServerName -class Win32_OperatingSystem | select Caption | ft -HideTableHeaders -AutoSize
Write-Host "=== Pagefile ==="
Get-WmiObject -ComputerName $ServerName -Class Win32_PageFileSetting
Write-Host "=== Locale ==="
Get-WmiObject -ComputerName $ServerName -class Win32_OperatingSystem | select Locale | ft -HideTableHeaders -AutoSize | Write-Output
산출:
=== 운영 체제 ===
마이크로소프트 윈도우 서버 2012 기준
=== 페이지 파일 ===
=== 로케일 ===
MaximumSize 이름 캡션
----------- ---- -------
4000 C:\pagefile.sys C:\ 'pagefile.sys'0813
페이지 파일 출력이 제목 아래에 표시되지 않는 이유는 무엇입니까? Get-WmiObject
비동기적으로 실행되고 즉시 다음 제목(로케일)을 작성하는 것 같습니다 .
어떻게 하면 이를 방지할 수 있나요? Write-Output을 사용할 때 작동하지만 컬러 텍스트를 사용할 수 없습니다.
답변1
화면의 일부 텍스트는 다음을 통과하는 개체에서 나옵니다.파워셸 파이프라인, 일부는 Write-Host
파이프라인을 건드리지 않고 즉시 화면에 인쇄됩니다.
페이지 파일에 대한 WMI 정보를 수집하는 데는 시간이 걸리고 파이프라인에 출력되지만 해당 파이프라인이 완료되기 전에 스크립트는 이미 로케일 메시지 인쇄로 이동했습니다.
(운영 체제)에서는 이런 일이 발생하지 않습니다. 해당 파이프라인이 ft -AutoSize
(Format-Table)로 끝나기 때문입니다. 이는 스크립트를 일시 중지하고 파이프라인의 모든 것을 기다리므로 열 크기 조정 방법을 결정할 때 가능한 한 많은 정보를 얻을 수 있습니다. ft
화면에 인쇄되면 스크립트는 PageFile 메시지로 이동합니다 .
대신 파이프라인을 통해 텍스트를 보내는 데 사용해야 합니다 Write-Output
. 이렇게 하면 리디렉션과 같은 다른 PowerShell 기능과 잘 통합되어 파일 및 변수에서 명령 출력을 수집합니다.
Write-Host
Jeffrey Snover(PowerShell 수석 설계자)는 자신의 블로그에서 권장되지 않는 이유에 대해 다음과 같이 썼습니다 .http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/
다음은 의 동작을 설명하는 링크입니다 Format-Table
.
열 너비 최적화
파이프라인 프로세스는 실시간으로 이루어지기 때문에 PowerShell은 열 요소가 차지하는 공간의 너비를 알 수 없습니다. 결과적으로 열 크기 조정이 관대해지는 경향이 있습니다. -AutoSize 매개변수를 지정하면 Format-Table은 모든 요소의 최대 너비를 설정하기 전에 먼저 모든 결과를 수집합니다. 출력을 최적화할 수 있지만 결과는 더 이상 실시간으로 출력되지 않습니다.