Powershell, эквивалентный Python, если __name__ == '__main__':

Мне очень нравится способность 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 ответа

Решение

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

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

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

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

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

В скрипте запускается как функция

$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)'"
}

На данный момент я вижу 2 работающих варианта

if ($MyInvocation.InvocationName -ne '.') {#do main stuff}

а также

if ($MyInvocation.CommandOrigin -eq 'Runspace') {#do main stuff}

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

function IsMain() {
  (Get-Variable MyInvocation -Scope Local).Value.PSCommandPath -Eq (Get-Variable MyInvocation -Scope Global).Value.InvocationName
}

Демонстрируется суть

Другие вопросы по тегам