Como se señaló en respuestas anteriores, el uso de "$ MyInvocation" está sujeto a problemas de alcance y no necesariamente proporciona datos consistentes (valor de retorno frente a valor de acceso directo). Descubrí que el método "más limpio" (más consistente) para obtener información del script, como la ruta del script, el nombre, los parámetros, la línea de comando, etc., independientemente del alcance (en las llamadas de función principal o subsiguientes / anidadas) es usar "Get- Variable "en" 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
Por lo tanto, puede obtener la misma información que $ PSCommandPath, pero mucho más en el trato. No estoy seguro, pero parece que "Get-Variable" no estuvo disponible hasta PS3, por lo que no fue de mucha ayuda para sistemas realmente antiguos (no actualizados).
También hay algunos aspectos interesantes al usar "-Scope", ya que puede retroceder para obtener los nombres, etc. de las funciones que llaman. 0 = actual, 1 = padre, etc.
Espero que esto sea algo útil.
Ref, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable