В PowerShell, как определить функцию в файле и вызвать ее из командной строки PowerShell? - PullRequest
200 голосов
/ 16 мая 2011

У меня есть файл .ps1, в котором я хочу определить пользовательские функции.

Представьте, что файл называется MyFunctions.ps1, а его содержимое выглядит следующим образом:

Write-Host "Installing functions"
function A1
{
    Write-Host "A1 is running!"
}
Write-Host "Done"

Комузапустить этот скрипт и теоретически зарегистрировать функцию A1, я перехожу к папке, в которой находится файл .ps1, и запускаю файл:

.\MyFunctions.ps1

Это выводит:

Installing functions
Done

Пока что,когда я пытаюсь вызвать A1, я просто получаю сообщение об ошибке, в котором говорится, что нет команды / функции с таким именем:

The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
 of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
    + CategoryInfo          : ObjectNotFound: (A1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Я должен неправильно понять некоторые концепции PowerShell.Могу ли я не определять функции в файлах сценариев?

Примечание , что я уже установил свою политику выполнения на «RemoteSigned».И я знаю, что нужно запускать файлы .ps1, используя точку перед именем файла:. \ MyFile.ps1

Ответы [ 7 ]

222 голосов
/ 16 мая 2011

Попробуйте это в командной строке PowerShell:

. .\MyFunctions.ps1
A1

Оператор точки используется для включения скрипта.

192 голосов
/ 18 мая 2011

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

Итак, сначала переименуйте файл .ps1, в котором есть все ваши функции, в MyFunctions.psm1 (вы только что создали модуль!),Теперь для правильной загрузки модуля вы должны сделать с файлом определенные вещи.Сначала, чтобы Import-Module увидел модуль (вы используете этот командлет для загрузки модуля в оболочку), он должен находиться в определенном месте.Путь к папке модулей по умолчанию: $ home \ Documents \ WindowsPowerShell \ Modules.

В этой папке создайте папку с именем MyFunctions и поместите в нее файл MyFunctions.psm1 (файл модуля должен находиться впапка с точно таким же именем, что и файл PSM1).

Как только это будет сделано, откройте PowerShell и выполните следующую команду:

Get-Module -listavailable

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

Чтобы использовать модуль, введите в оболочке следующее (или поместите эту строку в свой профиль $, или поместите ее в качестве первой строки в скрипте):

Import-Module MyFunctions

Теперь вы можете запускать свои функции.Круто то, что когда у вас будет 10-15 функций, вы забудете имя пары.Если они есть в модуле, вы можете запустить следующую команду, чтобы получить список всех функций в вашем модуле:

Get-Command -module MyFunctions

Это довольно мило, и крошечные усилия, которые требуются для установкина лицевой стороне ПУТЬ стоит.

15 голосов
/ 05 февраля 2015

. "$PSScriptRoot\MyFunctions.ps1" MyA1Func

Доступно начиная с версии 3, до этого см. Как узнать расположение файловой системы сценария PowerShell? . Это ОЧЕНЬ распространено.

P.S. Я не подписываюсь под правилом «все является модулем». Мои сценарии используются другими разработчиками вне GIT, поэтому я не люблю помещать вещи в определенное место или изменять системные переменные среды до запуска моего сценария. Это всего лишь сценарий (или два, или три).

6 голосов
/ 16 мая 2011

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

Сначала необходимо проверить, загружена ли функция, запустив:

ls function:\ | where { $_.Name -eq "A1"  }

И убедитесь, что он появляется в списке (должен быть список из 1!), А затем сообщите нам, какой вывод вы получите!

3 голосов
/ 24 июня 2017

Вы можете добавить функцию к:

c:\Users\David\Documents\WindowsPowerShell\profile.ps1

Функция будет доступна.

2 голосов
/ 02 октября 2017

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

Param($Param1)

Затем вы можете вызвать его, например, следующим образом:

.\MyFunctions.ps1 -Param1 'value1'

Это делает его намного более удобным, если вы хотите легко вызывать только эту функцию без необходимости импорта функции.

0 голосов
/ 02 октября 2018

Предполагается, что у вас есть файл модуля с именем Dummy-Name.psm1, который имеет метод с именем Function-Dumb ()

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...