Testar se o script do PowerShell é chamado com Invoke-Expression?

1

Existe uma maneira de saber se um script está sendo chamado usando Invoke-Expression em vez de chamado diretamente? Eu quero fazer algo diferente, por exemplo pausa para entrada, se o script está sendo chamado diretamente, mas pule se ele estiver sendo chamado de outro local.

    
por Don Zacharias 09.06.2015 / 19:47

2 respostas

1

Em suma, eu diria que não.

Em vez disso, você deve estruturar o código de maneira que você possa informar o código que deve ou não ser solicitado, como um parâmetro -Prompt ou algo assim.

Eu não posso dar conselhos mais específicos sem ver o código ou saber o que você está tentando fazer.

    
por 09.06.2015 / 20:03
0

Usando o Invoke-Expression, a única maneira que encontrei é usar o Get-PSCallStack.

Então, por exemplo, se eu tiver um script chamado foo1.ps1 no qual eu coloquei:

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

crie um segundo script chamado foo2.ps1 que contém apenas:

Invoke-Expression .\foo1.ps1

Se eu executar o foo1.ps1 diretamente em um prompt do PS ele retorna foo1.ps1, se eu executar o foo2.ps1, ele retornará o nome do script.

Outro método que encontrei é usar $ MyInvocation, mas isso não parece funcionar com Invoke-Expression. Se você simplesmente chamar o script com "&. \ Foo1.ps1" ou mesmo apenas ". \ Foo1.ps1", ele funcionará. Com esse método, se você colocar o seguinte em foo1.ps1:

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

Ele irá mostrar que você o chamou diretamente ou retorna o caminho para o script (por exemplo, foo2.ps1) que o chamou.

    
por 31.08.2017 / 17:08

Tags