Như đã lưu ý trong các câu trả lời trước, việc sử dụng "$ MyInvocation" có thể gặp phải các vấn đề về phạm vi và không nhất thiết phải cung cấp dữ liệu nhất quán (giá trị trả về so với giá trị truy cập trực tiếp). Tôi nhận thấy rằng phương pháp "sạch nhất" (nhất quán nhất) để lấy thông tin tập lệnh như đường dẫn tập lệnh, tên, mệnh lệnh, dòng lệnh, v.v. bất kể phạm vi (trong lệnh gọi hàm chính hoặc tiếp theo / lồng nhau) là sử dụng "Get- Biến "trên" 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
Vì vậy, bạn có thể nhận được thông tin tương tự như $ PSCommandPath, nhưng nhiều hơn nữa trong giao dịch. Không chắc chắn, nhưng có vẻ như "Get-Variable" không có sẵn cho đến PS3 nên không có nhiều trợ giúp cho các hệ thống thực sự cũ (chưa được cập nhật).
Ngoài ra còn có một số khía cạnh thú vị khi sử dụng "-Scope" vì bạn có thể quay ngược lại để lấy tên, v.v. của (các) hàm gọi. 0 = hiện tại, 1 = cha mẹ, v.v.
Hy vọng điều này là hữu ích phần nào.
Tham khảo, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable