#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