Как отмечалось в предыдущих ответах, использование «$ MyInvocation» может вызвать проблемы с областями видимости и не обязательно предоставлять согласованные данные (возвращаемое значение в сравнении со значением прямого доступа). Я обнаружил, что «самым чистым» (наиболее последовательным) методом для получения информации о сценарии, такой как путь к сценарию, имя, параметры, командная строка и т. Д. Независимо от области действия (в вызовах основной или последующих / вложенных функций), является использование «Get- Переменная "on" MyInvocation "...
# Get the MyInvocation variable at script level
# Can be done anywhere within a script
$ScriptInvocation = (Get-Variable MyInvocation -Scope Script).Value
# Get the full path to the script
$ScriptPath = $ScriptInvocation.MyCommand.Path
# Get the directory of the script
$ScriptDirectory = Split-Path $ScriptPath
# Get the script name
# Yes, could get via Split-Path, but this is "simpler" since this is the default return value
$ScriptName = $ScriptInvocation.MyCommand.Name
# Get the invocation path (relative to $PWD)
# @GregMac, this addresses your second point
$InvocationPath = ScriptInvocation.InvocationName
Таким образом, вы можете получить ту же информацию, что и $ PSCommandPath, но гораздо больше в этой сделке. Не уверен, но похоже, что «Get-Variable» не был доступен до PS3, так что не очень много помощи для действительно старых (не обновленных) систем.
Есть также некоторые интересные аспекты при использовании «-Scope», так как вы можете вернуться назад, чтобы получить имена и т. Д. Вызывающих функций. 0 = текущий, 1 = родительский и т. Д.
Надеюсь, это несколько полезно.
Ref, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable