2012-02-09 12 views
6

私はpowershellを使い慣れていませんが、私はスケジュールされたタスクを作成するために書いているpsで簡単なログを出力しようとしています。私のコードは以下の通りです。 schtasksでエラーが発生したときに例外をスローしないようです。別のSOの質問は、fileIOのアクションでこれを言い、 "-ea stop"を行うことを示唆しましたが、schtasksでは動作しません。powershellとschtasksでtry-catch-fail

#create log file 
$log = "\\servername\!incoming\Deploy\log.txt" 
Clear-Content $log 

#get input file list 
$txtServerList = Gc "\\servername\!incoming\Deploy\serverlist.txt" 
#loop through each server 
ForEach($strServername In $txtServerList) 
{ 
    try 
    { 
     #install task from XML template 
     schtasks /create /s $strServername /tn InventoryServer /XML "\\servername\!incoming\Deploy\TaskTemplate.xml" 
     #run the task immediately 
     schtasks /run /s $strServername /tn InventoryServer 
    } 
    catch [exception] 
    { 
     Add-Content -path $log -value $strServername 
     #Add-Content -path $log -value $_.Exception 
     #Add-Content -path $log -value $_.Exception.Message 
     #Add-Content -path $log -value "" 
    } 
} 

は、私が確認している」を追加 - コンテンツ-path 『\サーバー名を!入ってくる\展開の\ log.txtという』を 『テスト』 - 値の作品、私はそれだけで投げていないかなり確信していると述べたようなので、例外。

+0

申し訳ありませんが、これはずっと前です。私の仕事は3月に大きくシフトしたので、私はこれを終えたことさえ確信していません。私はあなたのためにそれを見つけることを試みる少し時間を過ごすでしょう。 –

+0

ありがとうございます。完全なサンプルソースコードを手に入れるのは素晴らしいことです。 – Kiquenet

答えて

9

Try/Catchが機能するためには、PowerShellは終了例外を必要とします。 Tryブロックでコマンドレットを実行する場合は、-erroraction Stopを使用するか、-eaエイリアスを使用してコマンドレットを実行できます。 SCHTASKS.EXEがこれを行うことはできません。終了例外がなければ、Catchブロック内のコードは決して実行されません。

あなたがしなければならないことは、言い換えれば、ステップアウトして、Schtasksが失敗したかどうかを個別に確認することです。もしそうなら、TryブロックでWrite-Errorを使うことができます。

試してみることの1つは、Start-Processを使用して終了コードを確認することです。 0以外はエラーでなければなりません。

Try { 
get-date 
$p=Start-Process schtasks.exe -ArgumentList "/Create foo" -wait -passthru 
if ($p.exitcode -ne 0) { 
    write-error "I failed with error $($p.exitcode)" 
} 
} 

Catch { 
"oops" 
$_.Exception 
} 
関連する問題