2016-05-03 52 views
0

try/catchのpowershellスクリプトを使用して、エラーをログファイルに書き込みます。これはPowershell ISEではうまく動作しますが、Powershellコンソールではうまく動作しません。スクリプトは次のとおりです。Powershellコンソールでは動作しませんが、ISEで動作します

$serverfile = "C:\Serverlist.txt" 
$Logfile = "C:\Deploy_Log.txt" 

$startdate= "01/05/2016" 
$starttime = 13 

Set-StrictMode -Version latest 
$ErrorActionPreference = "Stop" 
$WarningPreference = "Stop" 

function LogWrite { 
    param([string]$logstring) 
    Add-Content $Logfile -Value $logstring 
} 

function DeployTask { 
    param([string]$server1) 

    $arguments = '/Create', '/S', "$server1", '/RU', 'domain\user', '/RP', 'pa$$w0rd', '/SC', 'ONCE', '/st', "$starttime`:00:00", '/sd', "$startdate", '/TN', 'Task_InstallUpdates', '/TR', 'C:\patchday\InstallUpdates.bat', '/RL', 'HIGHEST', '/F' 
    Write-Host "$startdate, $starttime`:00" 

    if (Test-Connection $server1 -Quiet) { 
     # delete scheduled task 
     try { 
      schtasks.exe /S $server1 /delete /tn Task_InstallUpdates /f 
     } catch { 
      $ErrorMessage = $_.Exception.Message 
      LogWrite "$server1 : Error deleting scheduled task - $ErrorMessage" 
     } 

     # create scheduled task 
     try { 
      & schtasks.exe $arguments 
     } catch { 
      $ErrorMessage = $_.Exception.Message 
      LogWrite "$server1 : Error creating scheduled task - $ErrorMessage" 
     } 
    } else { 
     LogWrite "$server1 is not available" 
    } 
} 

$servers = Get-Content -Path $serverfile 
foreach ($server1 in $servers) { 
    Write-Host $server1 
    try { 
     DeployTask $server1 
    } catch { 
     $ErrorMessage = $_.Exception.Message 
     LogWrite "$server1 : $ErrorMessage" 
    } 
} 

どのようなアイデアですか? $ErrorActionPreference$WarningPreferenceを「停止」に設定し、厳格モードを有効にしました。 ISEでログファイルが作成され、内容は次のようなものです:

srv17:エラーがスケジュールされたタスクの作成 - WARNING:タスクが実行されないことがありますので、/ STが現在時刻よりも早いです。
srv18:スケジュールされたタスクの作成中にエラーが発生しました - 警告:/ STが現在時刻よりも前になっているため、タスクが実行されないことがあります。

Powershellコンソールでは、ログファイルは作成されず、すべてのエラーと警告がコンソールに表示されます。

+1

してください[編集]あなたの質問や(詳細で)精巧な違いは何ですか? – JosefZ

答えて

1

あなたは外部コマンドを実行しています。それらは通常、PowerShellの例外をスローしません。代わりに$LASTEXITCODE評価:私はerrosを処理するための別の方法を発見したので

$output = & schtasks.exe /S $server1 /delete /tn Task_InstallUpdates /f 2>&1 
if ($LASTEXITCODE -ne 0) { 
    LogWrite "$server1 : Error deleting scheduled task - $output" 
} 

# create scheduled task 
$output = & schtasks.exe $arguments 2>&1 
if ($LASTEXITCODE -ne 0) { 
    LogWrite "$server1 : Error creating scheduled task - $output" 
} 
+0

答えをありがとう、私はまだ$ LASTEXITCODE変数を知らなかった。しかし、なぜ彼らはISEでは例外をスローしますが、コンソールでは例外をスローしませんか? –

+0

理由はわかりませんが、ISEは、一部の点では通常のPowerShellコンソールとは異なる動作をする異なるホスト環境です。 –

0

は私も同じ問題を持っていた:

$error.clear() #before the command 
<you commands> 
if ($error.Count -gt 0){ #adter the commands 
    $problem = $Error[0].Exception.Message 
    Write-Host $problem 

} 
関連する問題