从本机应用程序恢复 powershell 错误

powershell error recovery from native applications

在 windows 2008R2 服务器上,我必须使用本机 schtasks 来安排任务。我创建了以下脚本,它首先删除 ID 为 Watson 的所有旧任务,然后安排它。唯一的问题是化妆品。 Schtasks /DELETE 会给出一个错误:

ERROR: The system cannot find the path specified

如果任务本来就没有。不是一个非常友好的消息。我想做一个

schtasks /QUERY  /TN $name

找出它当前是否存在,然后才将其删除。但是我的 powershell 技能达不到。我尝试了一个 TRY 块,但它似乎不适用于本机应用程序)

有什么建议吗?

start-transcript -Path install.log -Append
Write-Host "schedule.ps1 Script`r`n"

$reg = Get-Item -Path "hklm:\SOFTWARE\Draper Laboratory\EGPL\GeoLibrarian" 
$path = $reg.GetValue('VHDPath').ToString()


$name = "Watson"
$bin = "powershell.exe"
$trigger = "ONCE"
$ts = New-TimeSpan -Minutes 1
$time = (get-date) + $ts
$when = "{0:HH\:mm}" -f $time
$policy ="-executionpolicy Unrestricted"
$profile = "-noprofile"
$file = "$path\setup\boot-watson.ps1"
$sixtyfour = [Environment]::Is64BitProcess
Write-Host "64-Bit Powershell: "$sixtyfour
Write-Host "PowerShell Version: "$PSVersionTable.PSVersion
Write-Host "Deleting old watson task"
schtasks /DELETE /TN $name /F 2>&1 | %{ "$_" } 
Write-Host "If watson was not scheduled, ignore ERROR: The system cannot find the path specified"
Write-Host "Adding new watson start-up task"
#schtasks /CREATE /TN $name /TR "$bin $policy $profile -file $file" /SC $trigger /ST $when /RU SYSTEM /RL HIGHEST  2>&1 | %{ "$_" } | Out-Host
schtasks /CREATE /TN $name /TR "$bin $policy $profile -file $file" /SC ONSTART /RU SYSTEM /RL HIGHEST 2>&1 | %{ "$_" } | Out-Host

更新:

我尝试执行 /query,但如果任务不存在,它本身会转储大量错误文本。

schtasks : ERROR: The system cannot find the file specified.
At G:\wwwroot\setup\uninstall.ps1:11 char:1
+ schtasks /QUERY /TN $name | Out-Null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (ERROR: The syst...file specified.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

您可以使用指示最后退出代码的两个自动变量之一:$LASTEXITCODE$?

如果schtasks /query成功,$LASTEXITCODE将是0$?将是$true

另一方面,如果 schtasks /query 调用失败,$LASTEXITCODE 将包含非 0 退出代码并且 $? 将计算为 $false:

schtasks /QUERY /TN $name > $null 2>&1
if($?){
    schtasks /DELETE /TN $name /F
}

或者,使用 $LASTEXITCODE:

schtasks /QUERY /TN $name > $null 2>&1
if($LASTEXITCODE -eq 0){
    schtasks /DELETE /TN $name /F
}

使用 output redirection$null 来抑制 schtasks

中的 error/output