Тест, если сценарий PowerShell, называемый с Вызывать-выражением?

Существует ли способ сказать, называют ли сценарий с помощью Вызывать-выражения, а не называют непосредственно? Я хочу сделать что-то другое, например, паузу для входа, если сценарий называют непосредственно, но пропустите это, если это называют от другого местоположения.

1
задан 9 June 2015 в 20:47
2 ответа

Короче говоря, я бы сказал нет.

Вместо этого вы должны структурировать код таким образом, чтобы вы можете сообщить коду, что он должен или не должен запрашивать, например, с помощью параметра -Prompt или чего-то подобного.

Я не могу дать более конкретный совет, не видя код или не зная, что это такое. вы пытаетесь это сделать.

1
ответ дан 4 December 2019 в 00:06

Используя Invoke-Expression, я нашел единственный способ - использовать Get-PSCallStack.

Так, например, если у меня есть скрипт с именем foo1.ps1, в который я помещаю:

$CallStack = Get-PSCallStack | select -ExpandProperty Command
$CallStack[($CallStack.count-2)]

, затем создайте второй сценарий с именем foo2.ps1, который просто содержит:

Invoke-Expression .\foo1.ps1

Если я запустил foo1.ps1 непосредственно в приглашении PS, он вернет foo1.ps1, если я запустил foo2.ps1, он вернет вместо этого имя сценария.

] Другой метод, который я нашел, - это использование $ MyInvocation, но, похоже, он не работает с Invoke-Expression. Если вы просто вызываете сценарий с помощью «&. \ Foo1.ps1» или даже просто «. \ Foo1.ps1», он работает.С помощью этого метода, если вы поместите следующее в foo1.ps1:

if ($MyInvocation.ScriptName -eq "") {Write-Host "Run directly"}
else {Write-Host "Called from " $MyInvocation.ScriptName }

Он отобразит либо то, что вы вызвали его напрямую, либо вернет путь к сценарию (например, foo2.ps1), который его вызвал.

0
ответ дан 4 December 2019 в 00:06

Теги

Похожие вопросы