web-dev-qa-db-ja.com

タスクスケジューラから実行するときにPowerShell出力をリダイレクトする方法は?

タスクスケジューラから単純なPowerShellスクリプトを実行するとき、出力をファイルにリダイレクトしたいと思います。

このトピックについて長いスレッドがあります here 、まだ最終的に最も適切なソリューションに到達したかどうかは不明です。 SOの誰かがこの問題を解決し、彼らがそれをどうやってやったのか興味があります。

38
cmcginty

ここに私のために働いたコマンドがあります。手動で実行するのが難しくなるため、スクリプトの出力をリダイレクトするという考えは好きではありませんでした。

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

これを支援するために、トランスクリプト機能を使用しています。コードに含めるだけで、すべての(そうなるはずの)画面コンテンツがログファイルに出力されます。

    Start-Transcript -path $LogFile -append

    <body of script>

    Stop-Transcript
29
TAC

Windows 7では次のように動作します:

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

Win7タスクスケジューラGUIの場合:

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

「-file」は、ファイル名の後のすべてのパラメーターがファイルのパラメーターとして解釈されるため、機能しないことに注意してください。 「2>&1」はエラー出力もログファイルにリダイレクトすることに注意してください。 Powershellの以降のバージョンでは、これがわずかに異なる方法で行われます。

17
amtwister

私はこれがすでに数回答えられていることを理解していますが、上記のすべての答えの組み合わせは本当に助けになりました...

私の問題は、Packerプロビジョニングツールの一部として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

1
dev-rowbot

私はやる:あなたのスクリプトを呼び出す関数を作成し、この関数の出力を次のようにリダイレクトする:

.ps1:

function test{
    #your simple script commands
    ls c:\temp -Filter *.JPG
    ls z:\ #non existent dir
}

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
1
Loïc MICHEL

Wards上のPowershell 3では、個々のストリーム(out、verbose、error)をリダイレクトできます。ただし、タスクスケジューラはそれらを理解しません。そのリダイレクトを行う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

0
Adarsha

ファイルに直接ログを記録するために、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
Stop-Transscript

ログファイルは、スクリプトと同じディレクトリにあります。

0
Orsiris de Jong