Скрипту PowerShell не хватает согласованности при запуске через планировщик задач, я что-то упускаю или это Windows является Windows? - PullRequest
3 голосов
/ 14 июля 2020

Я новичок в PowerShell.

Я создал программу PowerShell, которая по утрам работает как будильник. У меня есть планировщик задач, выполняющий его по триггеру времени. Проблема, с которой я столкнулся, - это отсутствие последовательности. Иногда он будет работать правильно без каких-либо помех, в других случаях он откроет PowerShell, выйдет из строя и немедленно закроется без выполнения (без кода ошибки). Когда я сам выполняю его двойным щелчком, кажется, что он работает нормально.

Execution Policy = All-Signed

Task Scheduler

Вкладка триггера:

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

Я впервые задаю здесь вопрос, прошу простить и указать на ошибки в стандартах форума.

Заранее спасибо !

1 Ответ

3 голосов
/ 14 июля 2020

Вот краткое изложение того, что можно сделать для диагностики несогласованного выполнения запланированной задачи.

  • Поскольку ваша задача интерактивна (имеет форму), Запускать ли пользователь входит в систему или нет не следует отмечать. Хотя обычно вы хотите, чтобы он проверялся большую часть времени, задачи, которые взаимодействуют с пользователем (popup / forms / et c ...), не будут работать должным образом, если этот параметр отмечен.

  • Добавьте Start-Transcript -Path "Some\Path\AlarmLog_$(get-date -f 'yyyyMMdd').txt в начале вашего файла и Stop-Transcript в конце, чтобы лучше понять, когда он не работает

  • Обязательно проверьте Вкладка «Условия» , так как существуют дополнительные ограничения, которые могут повлиять на выполнение задачи (например: по умолчанию задача не будет выполняться при питании от батареи)

  • Если задача выполняется под другим пользователем или в другом контексте (например, с высшими привилегиями), попробуйте выполнить свой сценарий в этом контексте, чтобы увидеть, не завершится ли он (например, запустите Vscode / ISE с использованием этого контекста и выполните задачу)

Если у вас есть несколько наборов операций, вы можете заключить их в блок Try / Catch, чтобы в случае сбоя одного набора вы могли выполнить дополнительное ведение журнала, а также решить, следует ли полностью отменить задачу или продолжить выполнение. . (Примечание: при использовании try/catch вам нужно установить -ErrorAction Stop для функций, которые имеют этот параметр, чтобы убедиться, что они правильно попадают в блок catch.

Ссылки

Msdocs - Start-Transcript

Msdocs - Планировщик задач - Контекст безопасности для выполнения задачи

...