попробовать-поймать-сбой с PowerShell и Schtasks - PullRequest
7 голосов
/ 09 февраля 2012

Я новичок в powershell, но я пытаюсь вывести несколько простых записей в журнале, который я пишу, для создания запланированных задач.Мой код ниже.Кажется, что это не выдает исключение, когда вы получаете ошибку со счётчиками.Другой вопрос SO упомянул об этом с действиями fileIO и предложил сделать «-ea stop», но это не работает со schtasks.

#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 ""
    }
}

Я проверил, что «Add-Content -path» \ servername !coming \ Deploy\ log.txt "-value" test "'работает, поэтому, как я уже сказал, я вполне уверен, что он просто не выдает исключение.

1 Ответ

11 голосов
/ 09 февраля 2012

Для работы Try / Catch PowerShell требуется завершающее исключение. При запуске командлета в блоке Try это можно сделать с помощью -erroraction Stop (или псевдонима -ea). Как вы уже поняли, SCHTASKS.EXE не может этого сделать. Без завершающего исключения код в блоке Catch никогда не запустится.

Что вам нужно сделать, так это выйти из коробки, так сказать, и самостоятельно проверить, не удалось ли Schtasks. Если да, то вы можете использовать Write-Error в вашем блоке Try.

Одна вещь, которую вы можете попробовать, это использовать 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...