This topic explains how Windows PowerShell determines which command to run, especially when a session contains more than one command with thE same name. It also explains how to run commands that do not run by default, and it explains how to avoid command-name conflicts in your session.
When a session includes commands that have the same name, Windows PowerShell uses the following rules to decide which command to run. These rules become very important when you add commands to your session from modules, snap-ins, and other sessions.
If you specify the path to a command, Windows PowerShell runs the command at the location specified by the path. For example, the following command runs the FindDocs.ps1 script in the C:\TechDocs directory:
As a security feature, Windows PowerShell does not run executable (native) commands, including Windows PowerShell scripts, unless the command is located in a path that is listed in the Path environment variable ($env:path) or unless you specify the path to the script file.
To run a script that is in the current directory, specify the full path, or type a dot (.) to represent the current directory. For example, to run the FindDocs.ps1 file in the current directory, type:
If you do not specify a path, Windows PowerShell uses the following precedence order when it runs commands:
4. Native Windows commands
Therefore, if you type "help", Windows PowerShell first looks for an alias named "help", then a function named "Help", and finally a cmdlet named "Help". It runs the first "help" item that it finds.
For example, assume you have a function named Get-Map. Then, you add or import a cmdlet named Get-Map. By default, Windows PowerShell runs the function when you type "Get-Map". When the session contains items of the same type that have the same name, such as two cmdlets with the same name, Windows PowerShell runs the item that was added to the session most recently.
For example, assume you have a cmdlet named Get-Date. Then, you import another cmdlet named Get-Date. By default, Windows PowerShell runs the most-recently imported cmdlet when you type "Get-Date".
HIDDEN and REPLACED ITEMS
As a result of these rules, items can be replaced or hidden by items with the same name. Items are "hidden" or "shadowed" if you can still access the original item, such as by qualifying the item name with a module or snap-in name.
For example, if you import a function that has the same name as cmdlet in the session, the cmdlet is hidden (but not replaced)because it was imported from a snap-in or module. Items are "replaced" or "overwritten" if you can no longer access the original item.
For example, if you import a variable that has the same name as a variable in the session, the original variable is replaced and is no longer accessible. You cannot qualify a variable with a module name. Also, if you type a function at the command line and then import a function with the same name, the original function is replaced and is no longer accessible.
RUNNING HIDDEN COMMANDS
You can run particular commands by specifying item properties the distinguish the command from other commands that might have the same name. You can use this method to run any command, but it is especially useful for running hidden commands. Use this method as a best practice when writing scripts that you intend to distribute because you cannot predict which commands might be present in the session in which the script runs.
You can run commands that have been imported from a Windows PowerShell snap-in or module or from another session by qualifying the command name with the name of the module or snap-in in which it originated. You can qualify commands, but you cannot qualify variables or aliases.
For example, if the Get-Date cmdlet from the Microsoft.PowerShell. Utility snap-in is hidden by an alias, function, or cmdlet with the same name, you can run it by using the snap-in-qualified name of the cmdlet:
To run a New-Map command that was added by the MapFunctions module, use its module-qualified name:
To find the snap-in or module from which a command was imported, use the following Get-Command command format:
For example, to find the source of the Get-Date cmdlet, type:
get-command get-date | format-list -property Name, PSSnapin, Module
Name : Get-Date
PSSnapIn : Microsoft.PowerShell.Utility
Part 2 to follow......