Understanding Cmdlet positional parameter

powershell, powershell-cmdlet

Solution

It's the first unnamed paramter. The position value tells the cmdlet which argument belongs to which parameter.

The command `Select-String -allmatches .` links the `-allmatches` switch to its parameter, and sets the `.` as the first item in the `$args`-array (arguments-array) since it doesn't have `-parametername` in front of it.

Then because `Select-String` includes a positional value for its parameters, the cmdlet knows that the first item in the arguments-array (`$args[0]`) should be bound to the `-Pattern` parameter.

If you'd like to understand this better, read the part about `Parameter Position?` in the help-section by running:

Get-Help about_Parameters

Then notice that the `-Pattern` parameter has position 1, as seen here:

Get-Help select-string -Parameter pattern

-Pattern <String[]>
    Specifies the text to find. Type a string or regular expression. If you type a string, use the SimpleMatch parameter.

    To learn about regular expressions, see about_Regular_Expressions.

    Required?                    true
    Position?                    1
    Default value                
    Accept pipeline input?       false
    Accept wildcard characters?  false

Then run the following line to see how PowerShell binds the inputobject `"hello world"` and the parameters and arguments.

Trace-Command -Expression { "Hello World" | Select-String -allmatches . } -Name ParameterBinding -PSHost

Problem

All, Forgive me I am a newbie for the `Power Shell`, Currently I was reading book `Windows PowerShell CookBook` try to get start with it. So far, Everything make sense to me except one thing, I was totally confused with the `Positional Parameter` to `Cmdlet`. For example: `Select-String` The syntax is following : ``` Select-String [-Pattern] <String[]> [-Path] <String[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <String>] [-Exclude <String[]>] [-Include <String[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] [<CommonParameters>] Select-String [-Pattern] <String[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <String>] [-Exclude <String[]>] [-Include <String[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] -InputObject <PSObject> [<CommonParameters>] Select-String [-Pattern] <String[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <String>] [-Exclude <String[]>] [-Include <String[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] -LiteralPath <String[]> [<CommonParameters>] ``` I can pass the parameter value to the `Cmdlet` directly by ignoring the parameter name . like below: ``` "Hello World"|Select-String . ``` Based on the concept of `Positional parameter`,Because the parameter `-Pattern` is the first parameter. the value `.` can match the parameter `-Pattern`. It is ok for me to understand. But When I try this command line `"hello world" | Select-String -AllMatches .` the value `.` is not in the first. Why the `Select-String` can know it and work out the result ? Could someone please tell me more to understand it well? thanks.

Original source