bestsource

Write-Host 문을 파일로 리디렉션

bestsource 2023. 10. 11. 20:50
반응형

Write-Host 문을 파일로 리디렉션

디버깅 중인 PowerShell 스크립트가 있으며 모든 Write-Host 문을 파일로 리디렉션하려고 합니다.쉽게 할 수 있는 방법이 있습니까?

까지 PowerShell 4.0 .Write-Host호스트로 개체를 보냅니다.개체를 반환하지 않습니다.

PowerShell 5.0 이상부터Write-Host입니다.Write-Information를 사용하여 하고 로 수 .6>> file_name.

http://technet.microsoft.com/en-us/library/hh849877.aspx

은이 .Write-Host문,합니다.Write-Log 또는 할지, 할지, ,로 할 수 .

확인도:

Write-Host에 대한 프록시 함수를 만들 수 있습니다. 이 함수는 객체를 단순히 인쇄하는 것이 아니라 표준 출력 스트림으로 보냅니다.저는 이 목적으로만 아래 cmdlet을 작성하였습니다.현재 파이프라인의 기간 동안만 지속되는 프록시를 즉시 생성합니다.

여기 제 블로그에 전체적인 글이 올라와 있지만, 아래에 코드를 적어두었습니다.사용.-Quiet스위치를 눌러 콘솔 쓰기를 억제합니다.

용도:

PS> .\SomeScriptWithWriteHost.ps1 | Select-WriteHost | out-file .\data.log  # Pipeline usage
PS> Select-WriteHost { .\SomeScriptWithWriteHost.ps1 } | out-file .\data.log  # Scriptblock usage (safer)

function Select-WriteHost
{
   [CmdletBinding(DefaultParameterSetName = 'FromPipeline')]
   param(
     [Parameter(ValueFromPipeline = $true, ParameterSetName = 'FromPipeline')]
     [object] $InputObject,

     [Parameter(Mandatory = $true, ParameterSetName = 'FromScriptblock', Position = 0)]
     [ScriptBlock] $ScriptBlock,

     [switch] $Quiet
   )

   begin
   {
     function Cleanup
     {
       # Clear out our proxy version of write-host
       remove-item function:\write-host -ea 0
     }

     function ReplaceWriteHost([switch] $Quiet, [string] $Scope)
     {
         # Create a proxy for write-host
         $metaData = New-Object System.Management.Automation.CommandMetaData (Get-Command 'Microsoft.PowerShell.Utility\Write-Host')
         $proxy = [System.Management.Automation.ProxyCommand]::create($metaData)

         # Change its behavior
         $content = if($quiet)
                    {
                       # In quiet mode, whack the entire function body,
                       # simply pass input directly to the pipeline
                       $proxy -replace '(?s)\bbegin\b.+', '$Object'
                    }
                    else
                    {
                       # In noisy mode, pass input to the pipeline, but allow
                       # real Write-Host to process as well
                       $proxy -replace '(\$steppablePipeline\.Process)', '$Object; $1'
                    }

         # Load our version into the specified scope
         Invoke-Expression "function ${scope}:Write-Host { $content }"
     }

     Cleanup

     # If we are running at the end of a pipeline, we need
     #    to immediately inject our version into global
     #    scope, so that everybody else in the pipeline
     #    uses it. This works great, but it is dangerous
     #    if we don't clean up properly.
     if($pscmdlet.ParameterSetName -eq 'FromPipeline')
     {
        ReplaceWriteHost -Quiet:$quiet -Scope 'global'
     }
   }

   process
   {
      # If a scriptblock was passed to us, then we can declare
      #   our version as local scope and let the runtime take
      #   it out of scope for us. It is much safer, but it
      #   won't work in the pipeline scenario.
      #
      #   The scriptblock will inherit our version automatically
      #   as it's in a child scope.
      if($pscmdlet.ParameterSetName -eq 'FromScriptBlock')
      {
        . ReplaceWriteHost -Quiet:$quiet -Scope 'local'
        & $scriptblock
      }
      else
      {
         # In a pipeline scenario, just pass input along
         $InputObject
      }
   }

   end
   {
      Cleanup
   }
}

보조 PowerShell 셸에서 스크립트를 실행하고 다음과 같이 출력을 캡처할 수 있습니다.

powershell -File 'Your-Script.ps1' > output.log

그것은 저에게 효과가 있었습니다.

리디렉션을 사용하면 Write-Host가 중단됩니다.이는 Write-Host가 현재 사용 중인 단말기와 관련된 다양한 포맷 문제를 다루기 때문입니다.스크립트가 정상적으로 출력되도록 유연성을 갖추기를 원하는 경우(기본값은 셸, 기능은 다음과 같습니다.>,2>, 등), Write-Output을 사용합니다.

그렇지 않으면 현재 단말기의 특징을 포착하고 싶다면 시작-변환이 시작하기에 좋습니다.그렇지 않으면 손으로 테스트하거나 복잡한 테스트 세트를 작성해야 합니다.

*e 전에>모든 스트림을 리디렉션하려면:

- powershell - Your-Script.ps1* > output.log

때 만 해당됩니다.Success Stream(1>)이(가) 리디렉션됩니다.Write-Host는 에 대한 별칭입니다.Write-Information다에 를 Information Stream(6>모든 스트림을 리디렉션하려면 다음을 사용합니다.*>.

파워셸-7.1은 다중 출력 스트림의 리디렉션을 지원합니다.

  • (#1): PowerShell 2.0Write-Output
  • (#2): PowerShell 2.0Write-Error
  • (#3): PowerShell 3.0Write-Warning
  • (#4): PowerShell 3.0Write-Verbose
  • (#5): PowerShell 3.0Write-Debug
  • (#6): PowerShell 5.0Write-Information
  • 모든 스트림(*): PowerShell 3.0

며칠 전에 작성한 첫 번째 PowerShell 스크립트에서는 이 작업이 효과적이었습니다.

function logMsg($msg)
{
    Write-Output $msg
    Write-Host   $msg
}

스크립트에서의 사용:

logMsg("My error message")
logMsg("My info message")

PowerShell 스크립트 실행 호출:

ps> .\myFirstScript.ps1 >> testOutputFile.txt

이 질문에 대한 정확한 답변은 아니지만 콘솔에 대한 로깅과 로그 파일에 대한 출력을 모두 달성하려는 사람에게 도움이 될 수도 있습니다. 여기에 도달한 작업을 수행합니다. :)

Write-Host라는 함수를 정의합니다.파일에 쓰도록 합니다.일부 호출에서 이상한 인수 집합을 사용하는 경우 문제가 발생할 수 있습니다.또한 Snapin 자격이 없는 호출에 대해서만 작동합니다.

의 Write-Host 할 수 "6>>"파일로 리디렉션 연산자:

Write-Host "Your message." 6>> file_path_or_file_name

Microsoft에서 제공하는 "Example 5: Insuppress output from Write-Host"를 about_Operators에 맞게 수정한 것입니다.

대본 상단에 Start-Transcript, 하단에 Stop-Transcript를 추가했습니다.

을 (으)로 지정하려고 .<folder where script resides>-<datestamp>.rtf하지만 치 못한 .

메시지를 파일에 저장하려면 Write-Host를 사용하면 안 됩니다.이것은 호스트에게 쓰는 것만을 위한 것입니다.

대신 로깅 모듈 또는 Set/Add-Content를 사용해야 합니다.

호스트 UI가 있는지를 감지하고 그에 따라 동작하는 로깅 기능을 사용하는 것이 가장 좋은 방법임을 알게 되었습니다.스크립트가 대화형 모드에서 실행되면 호스트 UI에 세부 정보가 표시되지만 WinRM을 통해 실행되거나 대화형 모드가 아닌 경우 Write-Output에서 다시 실행되므로 다음을 사용하여 스크립트를 캡처할 수 있습니다.>아니면*>

function Log-Info ($msg, $color = "Blue") {
    if($host.UI.RawUI.ForegroundColor -ne $null) {
        Write-Host "`n[$([datetime]::Now.ToLongTimeString())] $msg" -ForegroundColor $color -BackgroundColor "Gray"
    } else {
        Write-Output "`r`n[$([datetime]::Now.ToLongTimeString())] $msg"
    }
}

Write-Host 컬러링으로 전체 출력을 캡처하려는 경우 Get-ConsoleAsHtml.ps1 스크립트를 사용하여 호스트의 스크롤 버퍼를 HTML 또는 RTF 파일로 내보낼 수 있습니다.

Write-Output 대신 Write-Output을 사용하고 다음과 같은 파일로 리디렉션합니다.

Deploy.ps1 > mylog.log or Write-Output "Hello World!" > mylog.log

Write-Output 대신 Write-Output을 사용해 보십시오.

출력은 파이프라인을 따라 내려가지만, 파이프의 끝인 경우에는 콘솔로 넘어갑니다.

> Write-Output "test"
test
> Write-Output "test" > foo.txt
> Get-Content foo.txt
test

언급URL : https://stackoverflow.com/questions/5588689/redirect-write-host-statements-to-a-file

반응형