Как сценарий PowerShell может сохранить состояние и продолжить работу после перезагрузки компьютера?

#c# #powershell

#c# #powershell

Вопрос:

Я начинаю с рассказа о моих текущих сценариях Powershell, но это окажется скорее проблемой C #…

У меня есть 3 сценария Powershell, которые все работают должным образом. Первый включает в себя графический интерфейс, который позволяет пользователю выбирать различные функции. После выбора функций он последовательно выполняет каждую из них. Однако есть пара, которые требуют перезагрузки локального компьютера. Например, переименование компьютера и присоединение к домену.

Часть «перезапуска» не слишком сложна, поскольку — когда это необходимо — сценарий устанавливает раздел реестра RunOnce, который, в свою очередь, вызывает 2-й сценарий после завершения перезагрузки. При необходимости (в зависимости от выбранных исходных параметров) он устанавливает другой ключ RunOnce для вызова 3-го скрипта после очередной перезагрузки.

Моя проблема до сих пор заключается в том, как сохранить переменные / состояния для процессов после перезагрузки.

Допустим, пользователь выбирает 5 вариантов…

-Переименовать компьютер -Присоединиться к домену -Отключить гибернацию -Настроить WSUS -Сбросить индексацию

Мой 3-й сценарий содержит функции для этих последних 3 элементов другие. Я хочу, чтобы этот 3-й сценарий «знал», какие параметры / функции были выбраны изначально, и запускал только те, а не другие, которые НЕ были выбраны.

Теперь я начал писать это на PS, потому что большинство моих задач связаны с настройкой системы, и я чувствовал, что PS является более подходящим языком для этого. Однако я не могу найти способ завершить это так, как я хочу. У меня «ограниченный» опыт работы с C # — достаточно, чтобы выполнять все функции, которые я хочу, или, по крайней мере, использовать C # в качестве оболочки, вызывающей PS-скрипты. Но я не уверен, как я могу сохранить состояние выбранных элементов, которые могут вызываться при любых последующих перезагрузках.

Ценю любые ответы.

Спасибо! Майк

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

1. Вопрос: Я не уверен, как я могу сохранить состояние выбранных элементов, которые могут вызываться при любых последующих перезагрузках. О: Ваш сценарий PS записывается в файл на диске? Затем ваш сценарий после перезагрузки прочитает (и, возможно, удалит) его?

2. Я изменил заголовок вашего вопроса на Как сценарий PowerShell может сохранить состояние, а затем продолжить работу после перезагрузки компьютера? поскольку это суть вашего вопроса. Не так важно, что именно делают сценарии; какие есть опции и как вам удалось перезагрузиться. Рассмотрите возможность сгущения вашего вопроса в соответствии с этими строками

Ответ №1:

Если все, что вы пытаетесь сделать, это сохранить несколько переменных и их значения, чтобы вы могли повторно загрузить их позже, вы, вероятно, могли бы выполнить это, записав их в файл, а затем повторно загрузив этот файл при запуске сценария. Ему нужно знать, чтобы проверить наличие этого файла.

Я ничего не знаю о ключах RunOnce, но, возможно, вы могли бы добавить параметр к вызову скрипта, чтобы ему был предоставлен файл восстановления.

Что-то вроде этого:

Этот скрипт принимает 3 параметра, затем записывает их в файл в формате JSON.

 param (
    [Parameter()][string]$foo,
    [Parameter()][string]$bar,
    [Parameter()][int]$baz
)

Write-Host "Do some stuff"

Write-Host "Save state before rebooting"

$state = @{
    'foo' = $foo;
    'bar' = $bar;
    'baz' = $baz;
};

$state | ConvertTo-Json | Set-Content -Path resume.json
 

Этот сценарий принимает 1 параметр, путь к файлу, указывающий на файл json, который вы только что создали с помощью предыдущего сценария, он заполняет переменные, а затем выдает их:

 param (
    [Parameter()][string]$StateFile
)

if ($StateFile) {
    $state = Get-Content -Path $StateFile | ConvertFrom-Json
    $foo = $state.foo;
    $bar = $state.bar;
    $baz = $state.baz;
}

Write-Host "foo: '$foo' | bar: '$bar' | baz: '$baz'";
 

Примечание: Этот сценарий будет хорошо работать для сохранения / загрузки простых типов значений, таких как строки, числа, даты и т.д. Но если вы надеетесь сохранить целые объекты, вам может потребоваться поискать другие решения. Или придумайте способы хранения определенных фрагментов информации, которые позволили бы вам восстановить этот объект.