Запуск PowerShell скриптів за розкладом.
До завдань практично будь-якого системного адміністратора входить написання різних скриптів і їх запуск. Запланувати запуск скрипта за розкладом за допомогою Task Sheduler - завдання нескладне, але при використанні PowerShell є деякі нюанси, про які я розповім в цій статті.
Отже, припустимо, у мене є скрипт start.ps1, який мені необхідно запускати щодня протягом 10 днів. Є два способи вирішити цю задачу.
Спосіб 1Для запуску скрипта скористаємося оснащенням Task Scheduler, він же планувальник завдань. Знайти його можна в розділі Administrative Tools, або натиснувши Win + R і ввівши команду taskschd.msc. Відкриваємо планувальник і в розділі Actions вибираємо пункт Create Task.
На вкладці General вказуємо ім'я та опис завдання, а також (за потребою) користувача, від імені якого завдання буде запускатися. Для того, щоб завдання виконувалося незалежно від того, залягання користувач в системі, вибираємо опцію «Run whether user is logged on or not».Якщо для виконання завдання потрібно підвищення привілеїв, то відзначаємо опцію «Run with highest privileges».
далі йдемо на вкладку Triggers і створюємо новий тригер, в якому буде зберігатися розклад запуску нашого завдання. В поле Start вказуємо дату і час запуску, а в поле Expire - дату і час завершення завдання.Вказуємо виконувати завдання щодня (Daily) і задаємо період повтору (Recur every) 1 день.
Примітка. Якщо ви хочете запускати завдання частіше, ніж раз в день, то треба вибрати одноразове виконання (One time), а в розділі Advanced settings поставити галочку навпроти пункту Repeat task every і вказати час повторення, мінімум 5 хвилин, максимум 1 годину.Якщо цього недостатньо, то додатково в поле Delay task for up to можна вказати тимчасову затримку.
І основне. Переходимо на вкладку Action і вказуємо дію для запланованого завдання. Нагадаю, що в цілях безпеки PowerShell скрипти можуть виконуватися тільки інтерактивно, тобто спочатку треба запустити оболонку PowerShell і вже в ній вказати шлях до скрипту.Тому в поле «Action» вказуємо запуск powershell.exe, а в поле «Add Arguments» параметр -File і шлях до нашого скрипту, ось так:
-File "C: \ Scripts \ start.ps1"
Також в поле аргументи можна вказати:
-Command - виконує зазначені команди і будь-які інші параметри. Цей параметр теж можна використовувати для запуску скрипта, наприклад: -Command "& {C: \ Scripts \ start.ps1} ". Крім того, з його допомогою можна передавати в скрипт параметри: -Command "& {C: \ Scripts \ start.ps1 -a 1 -b 3}";
-ExecutionPolicy - задає політику виконання скриптів для поточного сеансу, може набувати значень Unrestricted, RemoteSigned, AllSigned і Restricted. Задана політика буде діяти тільки в поточному сеансі та має пріоритет над будь-якими раніше створеними політиками;
-NonInteractive - відключити висновок інтерактивних запитів до користувача;
-WindowStyle Hidden - запуск вікна PowerShell в прихованому режимі, непомітно для користувача;
-NoProfile - запобігає завантаженню профілю, що може дещо прискорити виконання скрипта;
-NoExit - залишити оболонку відкритою після відпрацювання скрипта.Це може знадобитися при перевірці і налагодженні скрипта.
Заповнивши необхідні поля тиснемо ОК і зберігаємо завдання. Тепер скрипт буде запускатися за розкладом щодня в заданий час протягом 10 днів.
Спосіб 2В PowerShell 3.0 з'явився новий функціонал Sheduled Job, що дає можливість створювати заплановані завдання прямо з консолі, не користуючись оснащенням планувальника.Скористаємося їм для планового запуску нашого скрипта.
Спочатку створюємо розклад запуску (щодня о пів на п'яту вечора, протягом 10 днів):
$ t = New-JobTrigger -Daily -At 4: 30PM -DaysInterval 10
Потім зберігаємо в змінної облікові дані:
$ cred = Get-Credential contoso \ administrator
в якості опції вказуємо запуск завдання з підвищеними привілеями :
$ o = New-ScheduledJobOption -RunElevated
І реєструємо завдання з ім'ям Start:
Register-ScheduledJob -Name Start -FilePath C: \ Scripts \ start.ps1 -Trigger $ t -Credential $ cred -ScheduledJobOption $ o
Щоб переконається в тому, що завдання створено, можна відкрити планувальник і знайти наше завдання в розділі Microsoft \ Windows \ PowerShell \ SheduledJobs.
Примітка. Для кожного запланованого завдання PowerShell в директорії% systemdrive% \ Users \% username% \ AppData \ Local \ Microsoft \ Windows \ PowerShell \ ScheduledJobs створюється однойменна папка.У цій папці знаходиться саме завдання в XML-файлі і папка Output, в якій, в підпапках за часом виконання, зберігається історія виконання завдання - результат виконання (файлs Result.xml) і статус завдання (Status.xml). Ці файли можуть стати в нагоді для налагодження і діагностики в тому випадку, якщо завдання відпрацьовується належним чином.
Execution Policy
На закінчення нагадаю про один важливий момент, а саме про політику виконання скриптів Execution Policy. Подивитися поточне значення політики можна командою Get-ExecutionPolicy. Політика виконання може мати значення:
• Restricted - блокується виконання будь-яких скриптів.Значення за замовчуванням;
• AllSigned - дозволено виконання скриптів, що мають цифровий підпис;
• RemoteSigned - скрипти, підготовлені на локальному комп'ютері, можна запускати без обмежень, скрипти, завантажені з Інтернету - тільки при наявності цифрового підпису;
• Unrestricted - дозволено виконання будь-яких скриптів.При запуску непідписаного скрипта, який був завантажений з Інтернету, програма може зажадати підтвердження;
• Bypass - нічого не блокується, ніякі попередження та інші запити не з'являються.
Зазвичай для безпроблемного виконання скриптів досить задати значення RemoteSigned .Змінити поточне значення можна командою Set-ExecutionPolicy, наприклад:
Set-ExecutionPolicy RemoteSigned -force
Примітка. Якщо зазначена в команді політика виконання суперечить груповій політиці, то параметр запишеться в реєстр, але діяти не буде.
.