[powershell] PowerShell에서 줄 바꿈없이 텍스트를 어떻게 출력합니까?

PowerShell 스크립트가 다음과 같이 인쇄되기를 원합니다.

Enabling feature XYZ......Done

스크립트는 다음과 같습니다.

Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"

그러나 Write-Output항상 줄 바꿈을 인쇄하여 출력이 한 줄에 있지 않습니다. 이것을 할 수있는 방법이 있습니까?



답변

Write-Host -NoNewline "기능 XYZ 사용 가능 .."


답변

불행히도 여러 답변과 의견에서 언급했듯이 Write-Host위험 할 수 있으며 다른 프로세스로 파이프 될 수 없으며 플래그 Write-Output가 없습니다 -NoNewline.

그러나 이러한 방법은 진행률을 표시하는 “* nix”방식, “PowerShell”방식은 다음과 같습니다 Write-Progress. PowerShell 창의 맨 위에 표시 줄에 PowerShell 3.0부터 사용 가능한 진행률 정보가 표시 됩니다. 세부.

# Total time to sleep
$start_sleep = 120

# Time to sleep between each notification
$sleep_iteration = 30

Write-Output ( "Sleeping {0} seconds ... " -f ($start_sleep) )
for ($i=1 ; $i -le ([int]$start_sleep/$sleep_iteration) ; $i++) {
    Start-Sleep -Seconds $sleep_iteration
    Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) ( " {0}s ..." -f ($i*$sleep_iteration) )
}
Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) -Completed "Done waiting for X to finish"

그리고 OP의 예를 들어 보자.

# For the file log
Write-Output "Enabling feature XYZ"

# For the operator
Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... " )

Enable-SPFeature...

# For the operator
Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... Done" )

# For the log file
Write-Output "Feature XYZ enabled"


답변

사용자에게 유익한 출력을 제공하기 때문에 귀하의 경우에는 작동하지 않을 수 있지만 출력을 추가하는 데 사용할 수있는 문자열을 만드십시오. 출력 할 때 문자열 만 출력하십시오.

물론이 예제가 어리석지 만 개념에는 유용하다는 것을 무시하십시오.

$output = "Enabling feature XYZ......."
Enable-SPFeature...
$output += "Done"
Write-Output $output

디스플레이 :

Enabling feature XYZ.......Done


답변

예, 다른 답변에는 상태가 있으므로 Write-Output으로 수행 할 수 없습니다. PowerShell이 ​​실패하면 .NET으로 전환하십시오. 여기에 .NET 답변이 몇 개 있지만 필요한 것보다 더 복잡합니다.

그냥 사용하십시오 :

[Console]::Write("Enabling feature XYZ.......")
Enable-SPFeature...
Write-Output "Done"

가장 순수한 PowerShell은 아니지만 작동합니다.


답변

파일에 쓰려면 바이트 배열을 사용할 수 있습니다. 다음 예제는 파일을 추가 할 수있는 빈 ZIP 파일을 만듭니다.

[Byte[]] $zipHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
[System.IO.File]::WriteAllBytes("C:\My.zip", $zipHeader)

또는 사용하십시오 :

[Byte[]] $text = [System.Text.Encoding]::UTF8.getBytes("Enabling feature XYZ.......")
[System.IO.File]::WriteAllBytes("C:\My.zip", $text)


답변

FrinkTheBrave의 답변 단순화 :

[System.IO.File]::WriteAllText("c:\temp\myFile.txt", $myContent)


답변

필자가 겪은 문제는 PowerShell v2를 사용할 때 Write-Output이 실제로 stdout에 출력을 줄 바꿈한다는 것입니다. 문자 80으로 줄 바꿈되기 때문에 XML 텍스트를 성공하지 않고 stdout에 쓰려고했습니다.

해결 방법은

[Console]::Out.Write($myVeryLongXMLTextBlobLine)

PowerShell v3에서는 문제가되지 않았습니다. 쓰기 출력이 제대로 작동하는 것 같습니다.

PowerShell 스크립트가 호출되는 방식에 따라 사용해야 할 수도 있습니다.

[Console]::BufferWidth =< length of string, e.g. 10000)

stdout에 쓰기 전에