Как запустить PowerShell script при запуске компьютера?
У меня есть сценарий PowerShell, который контролирует папку с изображениями. Мне нужно найти способ автоматического запуска этого скрипта после запуска компьютера.
Я уже попробовал следующие методы, но не смог заставить его работать.
-
Используйте msconfig
и добавьте сценарий PowerShell при запуске, но я не могу найти сценарий PowerShell в этом списке.
-
Создайте ярлык и поместите его в папку автозагрузки. Неудачно.
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
или же
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
Вот мой скрипт PowerShell:
$folder = "C:\\Doc\\Files"
$dest = "C:\\Doc\\Files\\images"
$filter = "*.jpg"
$fsw = new-object System.IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubDirectories=$false
NotifyFilter = [System.IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
Start-Sleep -s 10
Move-Item -Path C:\Doc\Files\*.jpg C:\Doc\Files\images
}
-
Я также попытался добавить основную задачу с помощью taskschd.msc
. Это все еще не работает.
Вот что я нашел, и, возможно, это поможет отладить его.
Если я открываю окно PowerShell и запускаю там скрипт, он работает. Но если я запускаю его в командной строке,
powershell.exe -File "C:\Doc\Files\FileMonitor.ps1"
Она не будет работать. Я не уверен, что это проблема разрешения или что-то еще.
Кстати, у меня установлен PowerShell 3.0, и если я наберу $ host.version, он покажет 3 там. Но мой powershell.exe, похоже, все еще v1.0.
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
Ответы
Ответ 1
Наконец-то я получил скрипт PowerShell для автоматического запуска при каждом запуске. Вам нужно будет создать два файла: первый - это скрипт Powershell (например, script.ps1
), а второй - файл .cmd, который будет содержать команды, которые будут выполняться в командной строке (например, startup.cmd
).
Второй файл - это то, что нужно выполнить, когда компьютер запускается, и простое копирование .ps1 в папку автозагрузки не сработает, потому что это на самом деле не выполняет скрипт - он только открывает файл с помощью Блокнота. Вам необходимо выполнить .cmd, который сам будет выполнять .ps1 с помощью PowerShell. Хорошо, достаточно болтовни и на ступеньках:
- Создайте скрипт .ps1 и поместите его в папку. Я положил его на свой рабочий стол для простоты. Путь будет выглядеть примерно так:
C:\Users\<имя_пользователя>\Desktop\script.ps1
- Создайте файл .cmd и поместите его в
C:\Users\<имя_пользователя>\AppData\Roaming\Microsoft\Windows\Меню Пуск\Programs\Автозагрузка\startup.cmd
При этом файл cmd будет запускаться каждый раз при запуске. Вот ссылка на то, как создать файл .cmd, если вам нужна помощь.
- Откройте файл .cmd в текстовом редакторе и введите следующие строки:
PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
PowerShell C:\Users\<user_name>\Desktop\script.ps1 >> "%TEMP%\StartupLog.txt" 2>&1
Это сделает две вещи:
- Установите Политику выполнения вашей PowerShell на Неограниченный. Это необходимо для запуска сценариев, иначе PowerShell не сделает этого.
- Используйте PowerShell для выполнения сценария .ps1, найденного по указанному пути.
Этот код специально для PowerShell v1.0. Если вы используете PowerShell v2.0, он может немного отличаться. В любом случае, проверьте этот источник для кода .cmd.
- Сохраните файл .cmd
Теперь, когда у вас есть файлы .ps1 и .cmd по соответствующим путям и со сценарием для каждого, все готово.
Ответ 2
Вы можете настроить его как запланированную задачу и задать триггер задачи "При запуске"
Ответ 3
Я создаю ярлык, который я размещаю в shell: startup.
Ярлык имеет следующее:
Цель: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command "C:\scripts\script.ps1"
(заменив скрипты \scripts.ps1 тем, что вам нужно)
Начать вход: C:\scripts
(замена скриптов на папку с script)
Ответ 4
Скопируйте ps1 в эту папку и при необходимости создайте его. Он будет запускаться при каждом запуске (до входа пользователя в систему).
C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
Также это можно сделать с помощью GPEDIT.msc, если он доступен в вашей ОС (более низкая ОС, возможно, нет).
Ответ 5
У меня есть script, который также запускает наблюдателя файловой системы, но после закрытия окна script наблюдатель умирает. Он будет работать весь день, если я запустил его из окна powershell и оставил его открытым, но в тот же момент, когда я закрою его, script перестает делать то, что он должен.
Вам нужно запустить script и оставить его открытым.
Я попробовал множество способов сделать это, но тот, который действительно работал, был от http://www.methos-it.com/blogs/keep-your-powershell-script-open-when-executed
param ( $Show )
if ( !$Show )
{
PowerShell -NoExit -File $MyInvocation.MyCommand.Path 1
return
}
Вставка этого в начало script - вот что заставило его работать.
Я запускаю script из командной строки с помощью
powershell.exe -noexit -command "& \path\to\script.ps1"
Ответ 6
Относительно короткий путь к указанию скрипта Powershell для выполнения при запуске в Windows может быть:
- Нажмите кнопку Windows (кнопка Windows + r)
- Введите это:
оболочка: запуск
-
Создать новый ярлык правой кнопкой мыши и в контекстном меню выбрать пункт меню: Новый => Ярлык
-
Создайте ярлык для вашего скрипта, например:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Команда "C:\Users\someuser\Documents\WindowsPowerShell\Scripts\somesscript.ps1"
Обратите внимание на использование -NoProfile. Если вы много инициализируете в файле $ profile, неэффективно загружать его, чтобы просто запустить скрипт Powershell. -NoProfile пропустит загрузку файла вашего профиля и будет разумно указать, если нет необходимости запускать его перед выполнением сценария Powershell.
Здесь вы видите такой ярлык, созданный (файл .lnk со значком Powershell с символом ярлыка):
Ответ 7
Это сработало для меня. Создано запланированное задание с подробностями ниже: Триггер: при запуске
Действия: Программа/скрипт: powershell.exe Аргументы: -file
Ответ 8
Вы можете увидеть сценарии и многое другое, запланированное для запуска в диспетчере задач на вкладке "Автозагрузка". Вот как добавить новый элемент в запланированные элементы автозагрузки.
Во-первых, откройте проводник в оболочке: местоположение запуска с помощью кнопки start => run:
оболочка проводника: запуск
Щелкните правой кнопкой мыши в этой папке и в контекстном меню выберите новый ярлык. Введите следующее:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "C:\myfolder\somescript.ps1"
Это запустит сценарий Powershell без запуска сценариев $ profile для более быстрого выполнения. Это обеспечит запуск сценария powershell.
Папка оболочки: автозагрузка находится в:
$ ENV: APPDATA\Microsoft\Windows
А потом в папку:
Пуск\Programs\Автозагрузка
Как обычно, Microsoft делает некоторые вещи несколько громоздкими, когда путь содержит пробелы, поэтому вам нужно поместить кавычки вокруг полного пути или просто нажать вкладку внутри Powershell, чтобы в этом случае выполнить автозаполнение.
Ответ 9
Вы можете создать задачу планировщика, которая запускается автоматически при запуске, даже если пользователь не вошел в систему:
schtasks /create /tn "FileMonitor" /sc onstart /delay 0000:30 /rl highest /ru system /tr "powershell.exe -file C:\Doc\Files\FileMonitor.ps1"
Запустите эту команду один раз из PowerShell от имени администратора, и она создаст для вас задачу по расписанию. Вы можете перечислить задачу следующим образом:
schtasks /Query /TN "FileMonitor" /V /FO List
или удали его
schtasks /Delete /TN "FileMonitor"
Ответ 10
Убедитесь, что когда вы хотите, чтобы PowerShell запускался автоматически/в фоновом режиме/неинтерактивно, рекомендуется указать параметры -ExecutionPolicy Bypass
в PowerShell.exe
PowerShell.exe -ExecutionPolicy Bypass