programing

PowerShell에서 줄 바꿈 없이 텍스트를 출력하려면 어떻게 해야 합니까?

powerit 2023. 4. 19. 00:34
반응형

PowerShell에서 줄 바꿈 없이 텍스트를 출력하려면 어떻게 해야 합니까?

PowerShell 스크립트를 다음과 같이 인쇄하고 싶습니다.

Enabling feature XYZ......Done

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

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

★★★★★★★★★★★★★★★★★.Write-Output항상 끝에 새 줄을 인쇄하기 때문에 출력은 한 줄에 있지 않습니다.법이있??? ??

쓰기 호스트 - No Newline "XYZ 기능 활성화..."

몇알 수 행히,, 、 unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun unfortun 。Write-Host 수 .Write-Output does 。-NoNewline

진행 상황을 이며, ""*nix" 방식인 것으로 .Write-Progress: PowerShell 창 상단에 진행 상황 정보가 표시된 바가 표시됩니다. 자세한 내용은 매뉴얼을 참조하십시오.

# 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

파일에 쓰려면 바이트 배열을 사용할 수 있습니다.다음 예제에서는 파일을 추가할 수 있는 빈 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)

네, 다른 답변에는 상태가 있기 때문에 Write-Output으로는 할 수 없습니다.PowerShell이 실패할 경우 로 이동합니다.NET, 심지어 몇 개 있습니다.NET은 여기에 답변합니다만, 필요 이상으로 복잡합니다.

사용방법:

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

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

PowerShell power power power power power power power 。틀렸습니다.,하지 않기 때문입니다.그렇게 동작하지 않기 때문입니다.Write-Output는 하지만, 는 할 수 없습니다.Write-Host이치노

에서는 「」를 사용하고 것 .Write-Host-NoNewLine파라미터를 지정합니다.일반적으로 문제가 되는 파이핑은 할 수 없지만 Write-Host = > Export to file에서 설명한 바와 같이 이 기능을 덮어쓰는 방법이 있으므로 출력 파일의 파라미터를 쉽게 받아들일 수 있습니다.이것은 아직 좋은 해결책과는 거리가 멀다.와 함께Start-Transcript이 방법이 더 유용하지만 해당 cmdlet에 네이티브 애플리케이션에 문제가 있습니다.

Write-Output일반적인 맥락에서 필요한 것을 할 수 없습니다.

문제는 PowerShell v2를 사용할 때 Write-Output이 적어도 stdout을 위해 라인브레이크를 발생시킨다는 것입니다.XML 텍스트를 stdout에 쓰려고 했지만 성공하지 못했습니다. 왜냐하면 이 텍스트는 80자로 하드랩 되어 있기 때문입니다.

이 문제를 해결하려면

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

PowerShell v3에서는 이 문제가 발생하지 않았습니다.Write-Output은 정상적으로 동작하고 있는 것 같습니다.

PowerShell 스크립트의 호출 방법에 따라서는

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

스투우트에게 편지를 쓰기 전에 말이야

슈플러의 답은 정확하다.다른 방법으로 설명:ARRAY FORM을 사용하여 값을 Write-Output에 전달하는 대신

Write-Output "Parameters are:" $Year $Month $Day

또는 Write-Output에 대한 여러 호출에 의해 동등하게 처리됩니다.

Write-Output "Parameters are:"
Write-Output $Year
Write-Output $Month
Write-Output $Day
Write-Output "Done."

먼저 구성 요소를 STRING VARILE에 연결합니다.

$msg="Parameters are: $Year $Month $Day"
Write-Output $msg

이것에 의해, Write-Output 커맨드 렛의 복수의 콜(ARRE FORM)에 의해서 발생하는 중간 CRLF는 회피됩니다만, 물론 Write-Output 커맨드렛의 최종 CRLF는 억제되지 않습니다.중하거나, 가 이 합니다.-NoNewline옵션을 선택합니다.

로그 파일에 쓰는 것이 아니라 콘솔에 텍스트 진행률 미터(즉, "....")를 제공하려는 경우에도 Write-Host를 사용하여 만족해야 합니다.로그 쓰기용 변수로 msg 텍스트를 수집하고 Write-Host를 사용하여 콘솔에 진행 상황을 제공하면 둘 다 수행할 수 있습니다.이 기능을 독자적인 커맨드렛에 조합하여 코드를 최대한 재사용할 수 있습니다.

저는 사기를 쳤지만, 이것이 모든 요구사항을 충족하는 유일한 답변이라고 생각합니다.즉, 이것에 의해 CRLF의 후행은 회피되고, 그 사이에 다른 조작을 완료할 장소가 제공되어 필요에 따라서 stdout으로 적절히 리다이렉트 됩니다.

$c_sharp_source = @"
using System;
namespace StackOverflow
{
   public class ConsoleOut
   {
      public static void Main(string[] args)
      {
         Console.Write(args[0]);
      }
   }
}
"@
$compiler_parameters = New-Object System.CodeDom.Compiler.CompilerParameters
$compiler_parameters.GenerateExecutable = $true
$compiler_parameters.OutputAssembly = "consoleout.exe"
Add-Type -TypeDefinition $c_sharp_source -Language CSharp -CompilerParameters $compiler_parameters

.\consoleout.exe "Enabling feature XYZ......."
Write-Output 'Done.'

Frink The Brave의 응답은 다음과 같습니다.

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

PowerShell이 그 성가신 줄거리를 생략하도록 할 수는 없습니다.이 기능을 수행하는 스크립트나 cmdlet은 없습니다.물론, Write-Host는 리다이렉트/파이프를 할 수 없기 때문에 전혀 말도 안 됩니다.

다만, 독자적인 EXE 파일을 작성할 수 있습니다.스택 오버플로우 질문 PowerShell에서 출력하는 방법에서 설명한 대로입니다.

Write-Host끔찍해, 세계의 파괴자이지만, 사용 중 사용자에게 진행 상황을 표시하기 위해서만 사용할 수 있습니다.Write-Output(OP가 로깅을 요구한 것은 아닙니다)

Write-Output "Enabling feature XYZ" | Out-File "log.txt" # Pipe to log file
Write-Host -NoNewLine "Enabling feature XYZ......."
$result = Enable-SPFeature
$result | Out-File "log.txt"
# You could try{}catch{} an exception on Enable-SPFeature depending on what it's doing
if ($result -ne $null) {
    Write-Host "complete"
} else {
    Write-Host "failed"
}
$host.UI.Write('Enabling feature XYZ.......')
Enable-SPFeature...
$host.UI.WriteLine('Done')

난 전문가는 아니지만, 이건 왜 안 되지?


Write-Output "hello" | ForEach-Object {  $PSItem.Trim() } | Do-Whatever

이렇게 하면 파이프라인의 의미가 유지되지만 다음에 수행해야 할 모든 작업에 파이프라인에서 전달하기 전에 새 행 문자가 트리밍됩니다.만약 그게 파일에 쓰는 거라면, 그렇게 해.그것이 호스트에 쓰는 것이라면, 그렇게 할 수 있지만, 호스트에 쓰는 경우는, 을 사용하는 것을 잊지 말아 주세요.| Write-Host -NoNewline

업데이트: 제 코멘트: "내 답변이 왜 작동하지 않는지 알겠습니다.Powershell은 불가피하게 외부 프로그램에 파이핑할 때 파이프 시멘틱스의 일부로 새 줄 문자를 추가합니다.다음 내용을 참조하십시오.github.com/PowerShell/PowerShell/issues/5974 따라서 잘라낸 텍스트를 파이프라인에 전달하면 새 줄 문자가 입력으로 다시 표시됩니다."

다음은 커서를 이전 행의 시작 부분에 다시 배치합니다.올바른 수평 위치($pos 사용)에 배치하는 것은 사용자에게 달려 있습니다.X를 옆으로 이동):

$pos = $host.ui.RawUI.get_cursorPosition()
$pos.Y -= 1
$host.UI.RawUI.set_cursorPosition($Pos)

현재 출력은 27공간 이상입니다. $pos입니다.X = 27이 작동할 수 있습니다.

매우 우아하지는 않지만 OP가 요청한 대로 작동합니다.ISE는 StdOut과 간섭하므로 출력은 없습니다.이 스크립트는 ISE 내에서 실행할 수 없습니다.

$stdout=[System.Console]::OpenStandardOutput()
$strOutput="Enabling feature XYZ... "
$stdout.Write(([System.Text.Encoding]::ASCII.GetBytes($strOutput)),0,$strOutput.Length)
Enable-SPFeature...
$strOutput="Done"
$stdout.Write(([System.Text.Encoding]::ASCII.GetBytes($strOutput)),0,$strOutput.Length)
$stdout.Close()

인라인 연결을 사용하는 가장 간단한 방법 - 대신 'Write-Output'으로 이동합니다. 예를 들어, 탭 문자(문자열) 2개, 리터럴/버터팀(문자열):

Write-Output ("`t`t" + '${devArg}')

개인적으로 저는 그냥 그런 것을 사용합니다. "user $($user)"라고 적습니다.first name)는 온라인입니다.

$()를 사용하지 않으면 $user만 해석되며 $user는 해석되지 않습니다.이름

안부 전합니다

desired o/p: 기능 XYZ 활성화 중...다 했어요.

다음 명령을 사용할 수 있습니다.

$a = "기능 XYZ 활성화"

쓰기 출력 "$a...완료"

따옴표 안에 변수와 문을 추가해야 합니다.이것이 도움이 되기를 바랍니다:)

테크에갈 감사합니다

코멘트 링크에서 이 답변은 다음과 같습니다.

Write-Output "Some text $( $var.Name )"

잘 먹혔어요.$( )Name 값을 개별적으로 취득하기 위해 ExpandProperty가 필요한 경우에는 용장성이 없습니다.그렇지 않은 경우에는 해결된 값이 아닌 다음과 같이 출력됩니다.

@{Name=Name; Address=Address; City=City}.Name

넌 분명히 할 수 있어.Write-Output에는 기본적으로 동일한 "No Enumerate"라는 플래그가 있습니다.

언급URL : https://stackoverflow.com/questions/3896258/how-do-i-output-text-without-a-newline-in-powershell

반응형