#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'";
Примечание: Этот сценарий будет хорошо работать для сохранения / загрузки простых типов значений, таких как строки, числа, даты и т.д. Но если вы надеетесь сохранить целые объекты, вам может потребоваться поискать другие решения. Или придумайте способы хранения определенных фрагментов информации, которые позволили бы вам восстановить этот объект.