PowerShell has a number of built-in variables that can be used for all sorts of things. One of these variable is $MyInvocation
. It is useful when you need detailed information about the context in which a script or function is being executed.
What is $MyInvocation
?
$MyInvocation
is an automatic variable in PowerShell that contains information about the current command, script, or function being executed. It is an instance of the System.Management.Automation.InvocationInfo
class, which provides a lot of information about the invocation context.
Key Properties of $MyInvocation
Here are some of the key properties of the $MyInvocation
variable:
MyCommand
: Provides information about the command that is being executed.InvocationName
: The name of the command as it was invoked.ScriptLineNumber
: The line number in the script where the command is located.ScriptName
: The name of the script file.Line
: The entire line of the script that is being executed.PositionMessage
: A message that includes the line number and the position within the line.PSScriptRoot
: The directory from which the script is being executed.PSCommandPath
: The full path to the script file.
How to Use $MyInvocation
Logging Script Execution Details
You can use $MyInvocation
to log details about the script execution, which can be helpful for debugging purposes.
function Log-ScriptExecution {
$logMessage = @"
Script Name: $($MyInvocation.ScriptName)
Line Number: $($MyInvocation.ScriptLineNumber)
Command: $($MyInvocation.MyCommand)
"@
Write-Output $logMessage
}
Log-ScriptExecution
Dynamic Script Path Resolution
When writing scripts that need to reference other files or resources relative to the script’s location, $MyInvocation.PSCommandPath
can be very useful.
# Get the directory of the current script
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
# Reference a file in the same directory
$dataFilePath = Join-Path $scriptDir "data.txt"
Write-Output "Data file path: $dataFilePath"
Note that you can also use $PSScriptRoot
as that returns the full path of the current script’s parent directory.
Conditional Behavior Based on Invocation
You can also use $MyInvocation
to change the behavior of a script or function based on how it was invoked.
function Test-Invocation {
if ($MyInvocation.InvocationName -eq 'Test-Invocation') {
Write-Output "Function was called directly."
} else {
Write-Output "Function was called indirectly."
}
}
# Direct invocation
Test-Invocation
# Indirect invocation
Invoke-Command -ScriptBlock { Test-Invocation }
Conclusion
The $MyInvocation
variable is a powerful thing that provides detailed information about the execution context. By leveraging its properties, you can write more robust, dynamic, and debuggable scripts. When you are logging execution details, resolving paths dynamically, or altering behavior based on invocation context, $MyInvocation
can be an invaluable when writing functions or scripts.
Leave a Reply