Powershell equivilent 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 script как нечто, что можно вызывать из командной строки, но для меня остается доступным легко импортировать его функции и классы в отдельный файл python script без запуска по умолчанию "выполняется из командной строки".

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

Ответ 1

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

A script может действовать как функция: используйте param как первое не общее/пустое пространство в файле для определенных параметров. Непонятно (нужно было попробовать разные комбинации), что произойдет, если вы используете dot-source a script, который запускает param...

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

EDIT: Дополнительно:

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

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

Ответ 2

$MyInvocation.Invocation содержит информацию о запуске script.

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

Ответ 3

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

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

Продемонстрировано с помощью gist