2012-02-09 77 views
6

我是新来的PowerShell,但我想输出一些简单的日志记录我正在写创建计划任务。我的代码如下。看起来,当你遇到schtasks错误时它不会抛出异常。另一个SO问题用fileIO动作提到了这个问题,并建议做“-ea stop”,但这不适用于schtasks。尝试赶上失败与powershell和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 "" 
    } 
} 

我验证了“添加内容-path‘\服务器!传入\部署\ log.txt的’值‘测试’的作品,所以就像我说的,我相当肯定,它只是不引发例外。

+0

对不起,这是一个懒惰的时间。我的工作在3月份显着改变了,所以我甚至不确定我是否完成了这个任务。我会花一点时间试着为你找到它。 – 2012-09-07 16:24:15

+0

谢谢,这将是伟大的获取完整的示例源代码工作。 – Kiquenet 2012-09-12 18:55:49

回答

9

为了使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 
}