programing

작업 스케줄러에서 실행할 때 PowerShell 출력을 리디렉션하려면 어떻게 해야 합니까?

topblog 2023. 7. 27. 21:31
반응형

작업 스케줄러에서 실행할 때 PowerShell 출력을 리디렉션하려면 어떻게 해야 합니까?

작업 스케줄러에서 간단한 PowerShell 스크립트를 실행할 때 출력을 파일로 리디렉션하려고 합니다.

바로 이 주제에 대한 긴 실마리가 여기에 있지만, 그들이 결국 가장 적절한 해결책에 도달했는지는 분명하지 않습니다.Stack Overflow에 있는 사람 중에 이 문제를 해결한 사람이 있는지 궁금합니다. 그리고 그들은 어떻게 해결했나요?

저는 이 문제를 해결하기 위해 대본 기능을 사용합니다.코드에 포함하기만 하면 모든 화면 콘텐츠가 로그 파일로 출력됩니다.

Start-Transcript -path $LogFile -append

<Body of the script>

Stop-Transcript

여기 저를 위해 작동한 명령어가 있습니다.스크립트에서 출력을 리디렉션하는 것은 수동으로 실행하는 것을 어렵게 만들기 때문에 마음에 들지 않았습니다.

powershell -windowstyle minimized -c "powershell -c .\myscript.ps1 -verbose >> \\server\myscript.log 2>&1"

Windows 7(윈도우 7)에서 사용할 수 있는 기능은(는)

 powershell -command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log

Windows 7 작업 스케줄러 GUI에서 다음을 수행합니다.

 program = "Powershell"
 arguments = "-command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log"

파일 이름 뒤의 모든 매개 변수는 파일에 대한 매개 변수로 해석되므로 "-file"은 작동하지 않습니다."2>&1"도 오류 출력을 로그 파일로 리디렉션합니다.이후 버전의 PowerShell에서는 약간 다른 방식으로 이 작업을 수행합니다.

이전의 모든 답변들을 종합해 보니 정말 도움이 되었습니다...

문제는 Packer Provisor의 일부로 WinRM을 통해 PowerShell 스크립트를 실행해야 한다는 것이었는데 권한 문제로 인해 계속 실패했습니다.이 문제를 해결하는 방법은 예약된 작업으로 실행하는 것이지만, 스크립트에 인수를 전달하고 모든 것이 전달되었는지 확인하기 위해 출력도 받아야 했습니다.

이 토막글은 저에게 잘 어울렸습니다.

# Generate a unique ID for this execution
$guid = [guid]::NewGuid()
$logFile = "C:\Windows\Temp\$guid.log"

$argument = "-NoProfile -ExecutionPolicy unrestricted -Command ""& {""$ScriptPath"" $ScriptArgs} 2>&1 > $logFile"""

$a = New-ScheduledTaskAction -Execute "powershell.exe" -Argument $argument
Register-ScheduledTask -TaskName $TaskName  -RunLevel Highest -User $username -Password $password -Action $a | Start-ScheduledTask
do {
    Start-Sleep -Seconds 30
    $task = Get-ScheduledTask -TaskName $TaskName
} while ($task.State -eq 4)

전체 스크립트는 다음에서 확인할 수 있습니다.

https://gist.github.com/dev-rowbot/fa8b8dadf1b3731067a93065db3e1bba

Start-Transcript를 사용하여 파일에 직접 기록하는 것이 더 쉬울 수 있습니다.

# Get script name
$ScriptFullPath = $MyInvocation.MyCommand.Path
# Start logging stdout and stderr to file
Start-Transcript -Path "$ScriptFullPath.log" -Append

[Some PowerShell commands]

# Stop logging to file
Stop-Transcript

로그 파일은 스크립트와 동일한 디렉토리에 있습니다.

제가 할 일은:
스크립트를 호출하는 함수를 만들고 다음과 같이 이 함수의 출력을 리디렉션합니다.

.ps1:

function test{
    # Your simple script commands
    ls c:\temp -Filter *.JPG
    ls z:\ # Non-existent directory
}

test *> c:\temp\log.txt

로그 파일은 다음과 같습니다.

    Répertoire : C:\temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        07/06/2008     11:06     176275 HPIM1427.JPG
-a---        07/06/2008     11:06      69091 HPIM1428.JPG
-a---        07/06/2008     11:06     174661 HPIM1429.JPG


ls : Lecteur introuvable. Il n'existe aucun lecteur nommé « z ».
Au caractère C:\temp\test.ps1:14 : 1
+ ls z:\ #non existent dir
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (z:String) [Get-ChildItem], Driv
   eNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetC
   hildItemCommand

새 V3 리디렉션 연산자를 사용하여 출력할 항목을 제어할 수 있습니다.

Do-Something 3> warning.txt  # Writes warning output to warning.txt
Do-Something 4>> verbose.txt # Appends verbose.txt with the verbose output
Do-Something 5>&1            # Writes debug output to the output stream
Do-Something *> out.txt      # Redirects all streams (output, error, warning, verbose, and debug) to out.txt

Windows Server 2016에서 다음을 테스트했습니다. 호출만powershell이렇게 하면 폴더 이름에 공백이 있을 수 있습니다.

Powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle minimized "scriptName.ps1 *>> '\\servername\sharename\folder name with space\logfilename.log'"

저는 Anders의 댓글 질문(타임스탬프를 어떻게 추가합니까?)과 PowerShell을 두 번 호출하는 여러 응답에 영감을 받아 이 답변을 작성하게 되었습니다. 이 답변은 필요하지 않습니다.작업 스케줄러 프로그램은 분명히 "powershell.exe"이며 인수에 대해 간단히 제안합니다.

-noninteractive -c "scriptpath.ps1 *>>logpath.txt"

하루에 파일을 보관하려면 다음을 수행합니다.

-noninteractive -c "scriptpath.ps1 *>>logpath-$((get-date).ToString('yyyy-MM-dd')).txt"

타임스탬프가 있는 로그 파일을 원할 경우 두 번째 ">"(기존 파일에 추가됨을 나타내는 두 개)를 제거하고 시간 형식을 확장할 수 있습니다.

-noninteractive -c "scriptpath.ps1 *>logpath-$((get-date).ToString('yyyy-MM-dd_HH-mm-ss-fff')).txt"

PowerShell 3 이상에서는 개별 스트림(출력, 상세 및 오류)을 리디렉션할 수 있습니다.그러나 작업 스케줄러는 이를 이해하지 못합니다.리디렉션을 수행하는 것은 PowerShell입니다.

PowerShell이 PowerShell을 호출하고 있기 때문에 @cmcginty의 솔루션은 절반만 작동합니다.표준 스트림(오류 및 출력)만 지원합니다.사용해야 하는 모든 스트림을 사용하려면 다음을 수행합니다.

스크립트: 프그램또스트립크는로:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

인수:-windowstyle minimized –NonInteractive –NoProfile -c "powershell -c path_to_ps1.ps1 4>>verbose.log 5>>debug.log"

시작위치:path_to_ps1

아래는 자세한 출력을 화면으로 보내고 파일에 기록합니다.

something you're doing -Verbose 4>&1 | Tee-Object "C:\logs\verb.log" -Append

언급URL : https://stackoverflow.com/questions/13784382/how-can-i-redirect-powershell-output-when-run-from-task-scheduler

반응형