#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:
- Powershell.exe (again I’ve also done the full path as well)
- C:Scriptsattachment ProjectTraining_Reports.bat
- Training_Reports.bat
- 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‘.
- моя учетная запись домена (которая является администратором глобального домена и имеет полные разрешения)
- учетная запись локального администратора
- другая Учетная запись Администратора Домена
- Я пробовал даже СИСТЕМУ
Ни один из приведенных выше счетов не изменил результата. Другие настройки, которые я рассматривал, которые, как утверждают люди, могут мешать выполнению задач.
- Отключено «Запуск задачи только в том случае, если компьютер подключен к сети переменного тока«
- Выполнил задачу независимо от того, вошел пользователь в систему или нет
- Также запустил его как при входе пользователя в систему
- Установите для него «Самые высокие привилегии«
- Я попытался запустить задачу в раскрывающемся меню «Настроить для» для Windows 10 и Windows 7 / Server 2008.
Другие вещи, которые я пробовал:
- В первоначальном сценарии PowerShell были сопоставлены места назначения дисков. Я изменил код, чтобы использовать места на диске C.
- Явно предоставляя этой учетной записи пользователя полный контроль над соответствующими каталогами.
- Изменение владельца соответствующих каталогов для одного и того же пользователя.
- Изменение разрешений безопасности на ps1, cmd, bat, outlook.exe файлы, которые всегда будут запускаться от имени администратора.
- Попытался запустить сценарий с запущенным и не запущенным 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 из планировщика задач. Все прошло нормально.