【问题标题】:try-catch-fail with powershell and schtasks使用 powershell 和 schtasks 尝试捕获失败
【发布时间】:2012-02-09 18:26:30
【问题描述】:

我是 powershell 的新手,但我正在尝试在我正在编写的 ps 中输出一些简单的日志记录以创建计划任务。我的代码如下。当您收到 schtasks 错误时,它似乎不会引发异常。另一个 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!incoming\Deploy\log.txt" -value "test"' 有效,所以就像我说的,我很确定它只是没有抛出异常。

【问题讨论】:

  • 抱歉,这是很久以前的事了。我的工作在三月份发生了重大变化,所以我什至不确定我是否完成了这项工作。不过,我会花一点时间帮你找到它。
  • 谢谢,让完整的示例源代码正常工作会很棒。

标签: powershell powershell-2.0


【解决方案1】:

为了使 Try/Catch 工作,PowerShell 需要一个终止异常。在 Try 块中运行 cmdlet 时,您可以使用 -erroraction Stop(或使用 -ea 别名)来实现。正如您已经意识到 SCHTASKS.EXE 无法做到这一点。如果没有终止异常,Catch 块中的代码将永远不会运行。

您要做的就是跳出框框,可以这么说,独立检查 Schtasks 是否失败。如果是这样,您可以在 Try 块中使用 Write-Error。

您可能会尝试的一件事是使用 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
}

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2016-08-02
    • 2018-01-10
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2014-12-01
    相关资源
    最近更新 更多