Сценарий Powershell не будет корректно выполняться в планировщике задач

#powershell #batch-file #cmd #command-line #scripting

Вопрос:

Недавно я создал некоторый код PowerShell, который отлично работает сам по себе или через командную строку (или файл .bat). Черт возьми, он тоже отлично работает как файл .cmd. Когда я создаю задачу планировщика задач для ее автоматического запуска, в результате утверждается, что задание выполняется «успешно», но в папке назначения нет никаких выходных данных.

Вся цель скрипта состоит в том, чтобы просмотреть определенную подпапку в outlook и найти файлы с определенным именем. Затем он выводит последние связанные вложения в определенное место назначения.

Сценарий PowerShell

 $olFolderInbox = 6
$limit = (Get-Date).AddDays(-1)
$filepath = "C:Scriptsattachment ProjectSpreadsheets"
$ol = New-Object -com outlook.application;
$ns = $ol.GetNamespace("MAPI");
$acct = $ns.GetDefaultFolder($olFolderInbox)
$targetfolder = $acct.Folders | where-object { $_.name -eq "Training" }
$targetfolder.Items | foreach {
    if ($_.ReceivedTime -ge $limit) { 
            $_.attachments |
            foreach {
                Write-Host "attached file: ",$_.filename
                If ($_.filename -match 'SessionCompletions' -or $_.filename -match 'Certifications'){
                    $_.saveasfile((Join-Path $filepath $_.FileName))
                    $ol.quit()
                } 
            } 
    }
}
 

Я перепробовал все, чтобы заставить задачу в планировщике задач работать, и пока, похоже, ничего не помогает. Для начала я попытался использовать базовый файл bat для запуска задачи. Имейте в виду, что этот базовый формат работал со многими другими задачами, связанными с PowerShell, которые я настроил для запуска через файл bat.

Базовый сценарий Bat

 powershell -file extract-spreadsheets.ps1
 

Теперь иногда мне также приходилось включать аргумент-executionpolicy, но, к сожалению, в этом случае это не сработало.

Немного более сложный сценарий

 Powershell.exe -executionpolicy RemoteSigned -File  "C:Scriptsattachment Projectextract spreadsheets.ps1"
 

Примечание: Я убедился, что политика get-executionpolicy на компьютере была / установлена в значение RemoteSigned. Я также пробовал Неограниченные возможности.

I’ve also tried even more complex / different approaches such as . . .

Even more Complex of a Script

 @ECHO OFF
SET ThisScriptsDirectory=C:ScriptsDavid attachment Project
SET PowerShellScriptPath=%ThisScriptsDirectory%extract-spreadsheets.ps1
PowerShell -NoProfile -ExecutionPolicy RemoteSigned -Command "amp; {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy RemoteSigned -File ""%PowerShellScriptPath%""' -Verb RunAs}";
 

And I’ve even tried getting a .cmd file going and trying to use that within Task Scheduler:

 @@:: This prolog allows a PowerShell script to be embedded in a .CMD file.
@@:: Any non-PowerShell content must be preceeded by "@@"
@@setlocal
@@set POWERSHELL_BAT_ARGS=%*
@@if defined POWERSHELL_BAT_ARGS set POWERSHELL_BAT_ARGS=%POWERSHELL_BAT_ARGS:"="%
@@PowerShell -Command Invoke-Expression $('$args=@(^amp;{$args} %POWERSHELL_BAT_ARGS%);' [String]::Join(';',$((Get-Content '%~f0') -notmatch '^^@@'))) amp; goto :EOF

$olFolderInbox = 6
$limit = (Get-Date).AddDays(-1)
$filepath = "C:Scriptsattachment ProjectSpreadsheets"
$ol = New-Object -com outlook.application;
$ns = $ol.GetNamespace("MAPI");
$acct = $ns.GetDefaultFolder($olFolderInbox)
$targetfolder = $acct.Folders | where-object { $_.name -eq "Training" }
$targetfolder.Items | foreach {
    if ($_.ReceivedTime -ge $limit) { 
            $_.attachments |
            foreach {
                Write-Host "attached file: ",$_.filename
                If ($_.filename -match 'SessionCompletions' -or $_.filename -match 'Certifications'){
                    $_.saveasfile((Join-Path $filepath $_.FileName))
                    $ol.quit()
                } 
            } 
    }
}
 

In terms of Task Scheduler, I’ve tried a multitude of things. To start . . .

For Program / script, I tried various relative and explicit destinations / paths for bat, cmd and PowerShell.

Some examples:

  1. Powershell.exe (again I’ve also done the full path as well)
  2. C:Scriptsattachment ProjectTraining_Reports.bat
  3. Training_Reports.bat
  4. C:Scriptsattachment Projectextract-spreadsheets.cmd

Note: I’ve added the above Programs / Actions with and without quotes.

Again, the more frustrating thing is the basic format of Training_Reports.bat with the start in (optional) field of:

C:Scriptsattachment Project or C:Scriptsattachment Project

Has worked with every other script / task I have set up in this format!

I’ve tried numerous arguments for Execution Policy such as RemoteSigned, Bypass and Unrestricted. I’ve Added other arguments like: -NoProfile, -noninteractive, -File, -command, -NoLogo etc etc.

Examples of what the Arguments Field has looked like within Task Scheduler:

 -ExecutionPolicy Bypass -File "C:Scriptsattachment Projectextract-spreadsheets.ps1"
-NoLogo -NonInteractive -ExecutionPolicy RemoteSigned -File "C:Scriptsattachment Projectextract-spreadsheets.ps1"
-NoProfile -ExecutionPolicy Unrestricted -Command "C:Scriptsattachment Projectextract-spreadsheets.ps1"
 

I tried using various accounts to ‘run the task‘.

  1. моя учетная запись домена (которая является администратором глобального домена и имеет полные разрешения)
  2. учетная запись локального администратора
  3. другая Учетная запись Администратора Домена
  4. Я пробовал даже СИСТЕМУ

Ни один из приведенных выше счетов не изменил результата. Другие настройки, которые я рассматривал, которые, как утверждают люди, могут мешать выполнению задач.

  1. Отключено «Запуск задачи только в том случае, если компьютер подключен к сети переменного тока«
  2. Выполнил задачу независимо от того, вошел пользователь в систему или нет
  3. Также запустил его как при входе пользователя в систему
  4. Установите для него «Самые высокие привилегии«
  5. Я попытался запустить задачу в раскрывающемся меню «Настроить для» для Windows 10 и Windows 7 / Server 2008.

Другие вещи, которые я пробовал:

  1. В первоначальном сценарии PowerShell были сопоставлены места назначения дисков. Я изменил код, чтобы использовать места на диске C.
  2. Явно предоставляя этой учетной записи пользователя полный контроль над соответствующими каталогами.
  3. Изменение владельца соответствующих каталогов для одного и того же пользователя.
  4. Изменение разрешений безопасности на ps1, cmd, bat, outlook.exe файлы, которые всегда будут запускаться от имени администратора.
  5. Попытался запустить сценарий с запущенным и не запущенным Outlook. Примечание. запуск его вручную работает независимо от того, запущен ли Outlook.

Почему эта задача в планировщике задач выводится неправильно?

Комментарии:

1. Чтобы определить, находится ли проблема в части запланированной задачи или в части сценария, я бы рекомендовал запланировать простой сценарий, например, тот, который записывает Hello world в текстовый файл на C:, и посмотреть, будет ли он выполнен.

2. @KJ Я об этом не думал. Итак, если разобраться, Outlook 64-разрядный, а PowerShell 64-разрядный. С точки зрения разрешений, все три имеют одинаковый набор разрешений. В основном потому, что компьютер является частью домена. Так что, к сожалению, это не помогает. Один из пользователей, которых я пробовал, является локальным администратором, а также администратором глобального домена. Например, Глобальный администратор имеет полные права доступа ко всем трем приложениям (Планировщик задач, PowerShell и Outlook).

3. @Astrotrain Я сделал, как ты предложил. Я запланировал файл bat, чтобы запустить простой вывод PS «hello world» в текстовый файл в той же структуре папок, и он работал нормально. Я поставил задачу иметь нормальную / базовую структуру, как и другие сценарии, которые я настроил.

4. @KJ Спасибо. Я покопаюсь в ссылке и посмотрю, что смогу найти. Размышляя о вашем посте больше, я не думаю, что это имеет значение с точки зрения перспективы, когда дело доходит до планировщика задач. В основном потому, что планировщик задач будет либо запускать файл PS, либо bat, а затем эти две вещи будут напрямую ссылаться на outlook, верно? С другой стороны … как и предполагал другой плакат, я создал тестовый PS, который выводится в папку через файл bat из планировщика задач. Все прошло нормально.