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.