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
}