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