繁体   English   中英

PowerShell 脚本在通过任务调度程序运行时缺乏一致性,是我遗漏了什么还是这个 Windows 是 Windows?

[英]PowerShell script lacks consistency when run through task scheduler, am I missing something or is this Windows being Windows?

我是 PowerShell 的初学者。

我为自己创建了一个 PowerShell 程序来充当我早上的闹钟。 我有任务调度程序在时间触发器上执行它。 我遇到的问题是缺乏一致性。 有时它会正常运行而没有任何干扰,有时它会打开PowerShell,出错并立即关闭而不执行(无错误代码)。 当我自己双击执行它时,它似乎工作得很好。

执行策略 = 全签名

任务计划程序

触发选项卡:

 Trigger: Daily Details: At 8:00 AM every Day Status: Enabled

动作标签:

 Action: Start a Program Program/Script: PowerShell.exe Add arguments: -NoExit D:\Programs\AlarmClock\AlarmClockScript.ps1

脚本:

#define loop start state

$Snoozevar = 'Yes' 

#Import form module (for menu)

[reflection.assembly]::LoadWithPartialName("System.Windows.forms") | Out-Null

#Menu

    $snoozeTxtBox = New-Object System.Windows.Forms.Button
    $snoozeTxtBox.Text = 'Snooze'
    $snoozeTxtBox.Location = '50,15'
    $snoozeTxtBox.Size = '60,23'
    $snoozeTxtBox.DialogResult = [System.Windows.Forms.DialogResult]::Yes  # 'Snooze' = Yes

    $quitTxtBox = New-Object System.Windows.Forms.Button
    $quitTxtBox.Text = 'I`m Up'
    $quitTxtBox.Location = '125,15'
    $quitTxtBox.Size = '50,23'
    $quitTxtBox.DialogResult = [System.Windows.Forms.DialogResult]::No     # 'I`m Up' = No

    $basicForm = New-Object System.Windows.Forms.Form
    $basicForm.StartPosition = 'CenterScreen'
    $basicForm.Size = '250,100'
    $basicForm.Controls.Add($snoozeTxtBox)
    $basicForm.Controls.Add($quitTxtBox)
    $basicForm.TopMost = $true

while ($Snoozevar -eq 'Yes'){

    Start-Process "D:\Programs\Winamp\winamp.exe" /PLAY                    # Start Winamp /autoplay

    Start-Process D:\Programs\nircmd\nircmd.exe -ArgumentList " setsysvolume 65535" #Max Volume

    $Snoozevar = $basicForm.ShowDialog()                                   # Call Menu, assign output to $Snoozevar

    $pro = Get-Process -Name "winamp"                                      # Kill winamp post menu selection
    Stop-Process -Id $pro.Id
    $pro = ""
    
    if ($Snoozevar -eq 'No'){                                              # Clean up powershell
        $pro = Get-Process -Name powershell
        Stop-Process $pro
    } #end if

    $rngvar = Get-Random -Minimum 540 -Maximum 720                         # Time to Snooze (9-12 minutes)
    Start-Sleep -Seconds $rngvar

} #end while
# SIG # Begin signature block
...
# SIG # End signature block

这是我第一次在这里提问,请原谅并指出论坛标准中的错误。

先感谢您!

这里总结了可以用来诊断不一致的计划任务执行的事情。

  • 由于您的任务是交互式的(有一个表单),因此无论用户是否登录,都应该不选中 Run 虽然您通常希望在大多数情况下检查它,但如果选中此选项,与用户交互的任务(弹出 / forms / 等......)将无法正常工作。

  • 在文件开头添加Start-Transcript -Path "Some\Path\AlarmLog_$(get-date -f 'yyyyMMdd').txt并在末尾添加Stop-Transcript以更深入地了解它何时失败

  • 确保检查条件选项卡,因为有可能影响任务执行的其他约束(例如:默认情况下,如果使用电池电源,任务将不会执行)

  • 如果任务在不同的用户或不同的上下文中运行(例如:具有最高权限),请尝试在该上下文中执行您的脚本以查看它是否失败(例如,使用该上下文启动 Vscode / ISE 并运行任务)

如果您有多组操作,您可以将它们包装在Try / Catch块中,这样如果一组失败,您可以执行额外的日志记录并决定是否应该完全取消任务或继续执行任务。 (注意:使用try/catch时,您需要在具有该参数的函数上设置-ErrorAction Stop以确保它们在catch块中被正确捕获。

参考

Msdocs - 开始-成绩单

Msdocs - 任务调度程序 - 运行任务的安全上下文

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM