簡體   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