Як зазначалось у попередніх відповідях, використання "$ MyInvocation" підлягає проблемам з масштабом і не обов'язково надає узгоджені дані (повернене значення проти значення прямого доступу). Я виявив, що "найчистішим" (найбільш послідовним) методом отримання інформації про сценарій, як шлях до сценарію, ім'я, парми, командний рядок тощо, незалежно від сфери застосування (у основних або наступних / вкладених викликах функцій), є використання "Get- Змінна "на" 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 = батьківський тощо.
Сподіваюся, це дещо корисно.
Посилання, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable