Организация скриптов (все мои функции загромождают мой скрипт) - PullRequest
8 голосов
/ 20 февраля 2012

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

Ответы [ 5 ]

13 голосов
/ 20 февраля 2012

Попробуйте #Region и # EndRegion

Если вы используете редактор сценариев PowerGUI , вы можете использовать следующие регионы:

#region Set of functions A

function foo {
    Write-Host "Just a function"
}

function bar {
    return "Just another function"
}

#endregion

При открытии сценария в PowerGUIВ редакторе сценариев регионы будут свернуты, поэтому вам не придется прокручиваться, чтобы добраться до основной логики.Это также работает в Microsoft ISE. Хотя не все редакторы сценариев учитывают теги регионов.

Попробуйте использовать точечный источник или импортировать как модуль

Другой способ заключается в экстернализации ваших функций.либо в другой скрипт, и сделайте так называемый точечный источник . C:\myfunctions.ps1, либо поместите их в файл модуля с именем .psm1 и используйте Import-Module.

9 голосов
/ 20 февраля 2012

Полезный метод - поместить весь скрипт в функцию:

#!/bin/sh

main()
{
  # The majority of the code is here
}

foo()
{
  # auxiliary functions go here
}

main "$@" # invoke the main function

Я только что заметил, что этот вопрос был помечен powershell, а приведенный выше пример относится к Борну. Техника, вероятно, действительна, но синтаксис может отличаться.

8 голосов
/ 22 февраля 2012

Попробуйте модули

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

Структура папки

Module-Name\
    Subfolder1\
    Subfolder2\
    ...
    Module-Name.psm1

.psm1 файл

Module-Name.psm1 (находится под папкой с тем же именем - обязательно)

# Script Module for Company Functions
Function Get-ScriptDirectory {
    # $MyInvocation is an Automatic variable that contains runtime details and
    # we can use this to get information about where the file is run from.
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    Split-Path $Invocation.MyCommand.Path
}

Get-ChildItem (Get-ScriptDirectory) -Recurse `
    | Where-Object { $_.Name -like "func_*" } `
| %{
    . $_.FullName
}

Файл профиля

Microsoft.PowershellISE_profile.ps1 / Microsoft.Powershell_profile.ps1

$LocalLibraries = "C:\Local\Path\On\Disk\"
$env:PSModulePath = $env:PSModulePath + ";$LocalLibraries"

Приведенный выше код означает, что вам не нужно хранить модуль в том же месте, что и остальные (полезно в нашем случае, так как мы используем SVN дляи поделитесь нашими материалами с нашей командой).

Резюме

Напомним:

  • Назовите файлы функций как "func_ {Verb} - {Namespace} {Существительное} .ps1 "
  • Создайте папку верхнего уровня для хранения файла модуля psm1
  • Создайте подпапки для классификации и хранения функций, например, Утилиты, Active Directory, Exchange и т. д.
  • Создайте свой файл "psm1"
  • Необязательно: Добавить добавитьРасположение модуля itional в вашем профиле

Мы ставим файлы "ps1" перед "func_", чтобы при завершении табуляции имени функции, если она находилась в том же каталоге, что и файл, она не путалась,Кроме того, мы добавляем пространство имен (инициалы компании и т. Д.) Впереди, чтобы имена наших функций не сталкивались с другими добавленными функциями.

Удобная функция перезагрузки

Еще один полезный совет:во время разработки может пригодиться определение псевдонима «перезагрузка» в нашем случае, который заставит модуль перезагрузиться.Это означает, что после того, как вы изменили файл, все, что вам нужно сделать, это набрать его, и он будет снова возвращен в память с вашими изменениями.

# Function to reload Module
Function int_ModuleNameModuleLoad {
    Import-Module Module-Name -Force -WarningAction SilentlyContinue
    Write-Host "Module-Name Reloaded"
}

# Set Aliases
If (-not(Get-Alias "reload" -ErrorAction SilentlyContinue)) {
    New-Alias -Name reload -Value int_ModuleNameModuleLoad -Force
}

Причина, по которой я использую "int_" вместонаша нормальная структура имен такова, что эта функция находится в нашем профиле, и я считаю ее внутренней, а не полноценной функцией.

Надеюсь, это даст вам несколько хороших идей, она отлично сработала для нас!

-Адам

4 голосов
/ 20 февраля 2012

Одна вещь, о которой нужно быть осторожным, это сфера. Это не будет работать:

function main{
    function1
    function2
    function3
 }

function load-functions{
     function function1 {"This is function1"}
     function function2 {"This is function2"}
     function function3 {"This is function3"}
}

load-functions
main

Функция load-functions будет иметь собственную область видимости, а созданные ею функции будут существовать только в своей локальной области видимости. Они исчезнут после завершения функции и удаления области действия.

Вам нужно будет запустить их в локальной области видимости, используя точечные источники функций, таких как:
(Обратите внимание, что между точкой и именами функций есть пробел.)

function main{
    function1
    function2
    function3
}

function load-functions{
    function function1 {"This is function1"}
    function function2 {"This is function2"}
    function function3 {"This is function3"}
}

. load-functions
. main

Это будет работать, если main не запущен в локальной области, но если вы передадите аргументы скрипту, вам нужно будет сделать это, чтобы он использовал $args в области скрипта.

1 голос
/ 20 февраля 2012

Другое возможное решение - разбить функции на отдельные файлы и упаковать их в модуль. Затем вы можете просто импортировать модуль в основной скрипт.

В итоге вы получаете несколько файлов .ps1, но это значительно облегчает управление (и тестирование) каждой отдельной функции.

Веб-трансляция о том, как это сделать (около 1/2 дюйма):

[http://powershell.com/cs/media/p/8773.aspx][1] [1]: http://powershell.com/cs/media/p/8773.aspx

Также имеется удобный модуль для создания модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...