В рамках сценария автоматизации сборки системы (который я использую для создания AMI AWS) я хочу, чтобы система перезагружалась, а затем выполнялись дополнительные задачи настройки после загрузки, но только один раз (чтобы при создании образа системы, а затем образ, используемый для запуска нового экземпляра, он не будет запускать задачи настройки после загрузки снова).
Я начал это реализовывать так: сценарий начальной настройки (написанный на Powershell) использует Register-ScheduleJob -Trigger (New-JobTrigger -AtStartup) ... -Name PostBootSetup
чтобы настроить другой сценарий Powershell, запускаемый сразу после загрузки. В сценарии после загрузки у меня есть:
Get-JobTrigger -Name PostBootSetup | ?{$_.Enabled} | Disable-JobTrigger
Но когда он запускается, я получаю эту ошибку (я записываю весь вывод сценария после загрузки в файл):
Powershell : A scheduled job definition with Name PostBootSetup could not be found.
Что странно, потому что это результат работы, которая выполняется в данный момент. Я также добавил простые вызовы в Get-ScheduledJob
и Get-JobTrigger -Name PostBootSetup
которые должны выводить соответствующие записи, но от них нет абсолютно никакого вывода - даже если я запускаю эти команды на консоли Powershell после запуска машины, я получаю ожидаемый результат.
Возможно ли, что задание не может получить доступ к собственной записи запланированного задания во время выполнения? Если да, то есть ли обходной путь? или я что-то упускаю? Если это не лучший способ выполнять одноразовую работу после загрузки, что бы вы посоветовали?
В качестве дальнейшего примечания, мне не очень комфортно работать с пакетом, поэтому я был бы признателен за решения, использующие Powershell или .Net или что-то более выразительное, чем пакетное.
Используйте один из разделов реестра RunOnce, они предназначены именно для такого рода задач.
Они бегут один раз, а потом исчезают.
HKEY_LOCAL_MACHINE \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ RunOnce
HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ RunOnce
Создайте новый ключ строкового значения, где имя - любое, а данные - это CLI EXE и переключаются на то, что вы хотите запустить.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa376977%28v=vs.85%29.aspx
PS C:\> new-itemproperty -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce -name "myInstall" -value '"c:\temp\borland\setup.exe" /this /that /other'