При написании сценария PowerShell мне приходится запускать его дважды, чтобы любые внесенные изменения вступили в силу для кода, который находится внутри функции. Какие-либо предложения? - PullRequest
0 голосов
/ 06 сентября 2018

Как следует из названия, когда я пишу сценарий powershell в Visual Studio 2013 или Powershell ISE. Если я внесу изменения в сценарий, то при внесении изменений изменения не вступят в силу до тех пор, пока я не выполню его во второй раз. Не только переменные, но и целые строки кода.

Вот пример кода, который вызывает проблему:

Write-Output "Code Updates";
Test;

Function Test{      
    Write-Output "Code Doesn't Update";
}

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

Любые предложения о том, почему это происходит?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Да, вы вызываете функцию до того, как у нее появилось время для повторного объявления функции и получения изменений.

При тестировании вы можете выделить функцию и нажать F8 (в ISE), чтобы повторно объявить функцию без необходимости повторного запуска всего скрипта.

Лучшие практики говорят о том, что вы должны располагать функциями к вершине, а не к какой-либо логике. Поместите функции в файл модуля и импортируйте модули в первый ряд.

С уважением, Эдволи.

0 голосов
/ 07 сентября 2018

Вы не можете использовать код, который не существует. Вы говорите, что используете Visual Studio 2013, что означает, что вы тип разработчика или пытаетесь им быть. Функции аналогичны ссылкам / библиотекам Visual Studio. Вы не можете использовать ссылку / библиотеку, если не загрузите и не создадите ее экземпляр.

Языки сценариев читаются сверху вниз и загружаются для работы сверху вниз.

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

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

Любые пользовательские функции, которые вы пишете, должны быть в первую очередь загружены / прочитаны скриптом.

См. Ниже для получения дополнительных указаний.

Создайте функции PowerShell для повторного использования

Вот несколько вещей, о которых я пытаюсь подумать, когда пишу функцию это будет многоразово:

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

• Функции должны быть дружественными к конвейеру. Функции должны принимать входные объекты из конвейера, а также записывать объекты на трубопровод. Повторно используемая функция никогда не должна использовать Write-Host, если вы не пишете функцию специально для форматирования какой-то особый формат. Помните, что то, что выводится с Write-Host не помещается в конвейер.

• Используйте параметры с умом. Обычно параметры должны всегда иметь значения по умолчанию. Например, Функция Get всегда должна возвращать значение. Параметры могут быть использованы для разрешить пользователю фильтровать выходные данные из командлета. Думать о том, как Get-Process работает. Вы можете указать конкретный процесс, но если вы делаете нет, они все вернулись. Как вы пишете свою функцию, и вы объявить переменную, вы должны спросить себя, является ли это конечный пользователь может захотеть измениться. Если да, укажите хорошее значение по умолчанию, которое большинство людей будут использовать, но позволяют конечному пользователю изменить его, если они хотят к.

• Функции должны быть названы правильно. Убедитесь, что вы используете принятый глагол и хорошо продуманное существительное для вашей функции. если ты придерживаться этих стандартов, другим будет легче ваши функции в их код. Кроме того, это сделает вашу функцию более обнаруживаемые и конечные пользователи будут иметь хорошее представление о том, что ожидать когда они видят название вашей функции.

https://blogs.technet.microsoft.com/heyscriptingguy/2011/05/20/design-your-powershell-functions-to-be-reusable

Windows PowerShell: создание лучшей функции https://technet.microsoft.com/en-us/library/hh360993.aspx

0 голосов
/ 06 сентября 2018

Скрипты Powershell только для чтения сверху вниз. Сначала я должен был объявить функцию, а затем вызвать ее.

...