Powershell, эквивалентный Python, если __name__ == '__main__': - PullRequest
11 голосов
/ 14 января 2011

Мне очень нравится способность Python делать такие вещи:

if __name__ == '__main__':
    #setup testing code here
    #or setup a call a function with parameters and human format the output
    #etc...

Это хорошо, потому что я могу трактовать файл скрипта Python как что-то, что можно вызвать из командной строки, но оно остается доступнымчтобы я мог легко импортировать его функции и классы в отдельный файл скрипта Python, не вызывая «запуск из командной строки» по умолчанию.

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

Ответы [ 3 ]

5 голосов
/ 14 января 2011

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

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

Модули могут напрямую выполнять код, а также экспортировать функции, переменные, ... и могут принимать параметры. Возможно, $MyInvocation в модуле позволит обнаружить два случая.

РЕДАКТИРОВАТЬ: Дополнительно:

$MyInvocation.Line содержит командную строку, используемую для выполнения текущего скрипта или функции. Его свойство Line содержит текст сценария, используемый для выполнения, при точечном источнике это будет начинаться с ".", но не при запуске в качестве сценария (очевидно, это случай использования соответствия регулярному выражению, чтобы учесть переменное пространство вокруг период).

В скрипте, выполняемом как функция

2 голосов
/ 07 апреля 2011

$MyInvocation.Invocation содержит информацию о том, как был запущен скрипт.

If ($MyInvocation.InvocationName -eq '&') {
    "Called using operator: '$($MyInvocation.InvocationName)'"
} ElseIf ($MyInvocation.InvocationName -eq '.') {
    "Dot sourced: '$($MyInvocation.InvocationName)'"
} ElseIf ((Resolve-Path -Path $MyInvocation.InvocationName).ProviderPath -eq $MyInvocation.MyCommand.Path) {
    "Called using path: '$($MyInvocation.InvocationName)'"
}
0 голосов
/ 28 декабря 2017

Отказ от ответственности: это проверено только на Powershell Core на Linux.Это может не работать так же для Windows.Если кто-нибудь попробует это сделать в Windows, я был бы признателен, если бы вы могли проверить это в комментариях.

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