Powershell эквивалент python, если __имя__ == ‘__основной__’:

#powershell

Вопрос:

Мне очень нравится способность 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 аналогичное средство, которое я мог бы использовать? И если это не так, как я должен организовать свою библиотеку функциональных файлов, чтобы я мог легко выполнять некоторые из них во время их разработки?

Ответ №1:

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

 If ($MyInvocation.InvocationName -eq 'amp;') {
    "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:

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

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

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

ИЗМЕНИТЬ: Дополнительные:

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

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

Комментарии:

1. Итак, что-то вроде: если (! $MyInvocation.Line. Trim().StartsWith («. «)) {Здесь происходит вызов типа сценария#}

2. @MarkMascolino: после быстрого теста может быть .<tab>script не просто пробел. Я бы использовал -match '^s .s ' .

Ответ №3:

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

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

и

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

Ответ №4:

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

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

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

Комментарии:

1. Это сработало для меня в виртуальной машине Windows 10, $PSVersionTable:PSVersion = 5.1.17763.107