使用Powershell在函数中传递不同的参数

时间:2016-01-18 13:31:45

标签: powershell

我正在编写一个使用powershell的GUI工具,它将从Exchange服务器提取邮件跟踪信息。根据用户选择的内容确定搜索类型。如果在运行Get-MessageTrackingLog时没有传递所有args,那么命令是否只是删除该参数或传递空值? 示例:如果没有任何内容传递给“-sender $ sender”,那么该值是“null”还是参数也会被移除,就像这样?

Get-MessageTrackingLog -server $ hts -sender $ sender#正在传递一个值 要么 Get-MessageTrackingLog -server $ hts#没有传递发送者的值

换句话说,如果我没有使用参数传递arg,那么我不希望该参数包含在命令中。

我正在努力避免根据用户的选择为每个不同的场景编写get-messagetrackinglog。

希望这对每个人都有意义,谢谢!

If ($sender -and $chk_Mailbox.checked -and $chk_End.checked -and $chk_start.checked){Msg -sender **$sender** -Start **$Start** -End **$End** -max_res_size **$max_res_size**}
If ($sender -and $chk_Mailbox.checked -and (!$chk_End.checked) -and (!$chk_start.checked)){Msg -sender $sender -max_res_size **$max_res_size**}

Function Msg{
[CmdletBinding()]
Param(
[Parameter(Position=0,Mandatory=$false)]
$Sender,
[Parameter(Position=1,Mandatory=$false)]
$Start,
[Parameter(Position=2,Mandatory=$false)]
$End,
[Parameter(Position=3,Mandatory=$true)]
$max_res_size,
[Parameter(Position=4,Mandatory=$false)]
$EventID,
[Parameter(Position=5,Mandatory=$false)]
$MsgID
)
    BEGIN
    {
        If ($max_res_size -match "unlimited"){$maxloop = 100000000} else {$maxloop = $max_res_size}

        $ht = Get-ExchangeServer | ?{$_.admindisplayversion -match '14.3' -and $_.ServerRole -match 'HubTransport'}  |% {$_.name} 
        $startstop = $true
    Foreach ($hts in $ht)
        {
            Get-MessageTrackingLog -server $hts -sender **$sender** -Start **$Start** -End **$End** -resultsize **$max_res_size** -EventID **$EventID** -MessageId **$MsgID** -warningaction 0 |
            %{
                if ($rescount -ge $maxloop){$startstop = $false; break}
                $dataGridView1.rows.add($_.TimeStamp,$_.Sender,[string]$_.Recipients,$_.RecipientCount,`
                $_.TotalBytes,$_.ReturnPath,$_.MessageLatency,$_.MessageLatencyType,$_.EventId,$_.Source,$_.ServerHostname,$_.ConnectorId,$_.MessageId)
                $rescount++
                $Res_Count.text = $rescount
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

是的,这正是它的工作原理。未绑定到值的参数将具有该类型的默认值(或者为该参数指定的默认值(如果存在))。对于没有特定类型的参考类型或参数,这是$null

所以对于一个函数

function x($a, $b){}
x 1

您的$b等于$null,但在以下情况中

function x($a, [int]$b){}
x 1

它取而代之的是0。为此:

function x($a, $b=-1){}
x 1

您获得-1因为指定了特定的默认值。

答案 1 :(得分:1)

您要求splatting。这是为cmdlet调用有条件地构建一组参数的便捷方法。

只是为了向您展示一个

$parameters = @{
    Server = $hts
    Start = $Start
    End = $End
    ResultSize = $max_res_size
    EventID = $EventID
    MessageId = $MsgID
    WarningAction = 0
}

# If sender was specified then add it as a parameter
if($sender){$parameters.Sender = $sender}

# Call the cmdlets passing all the arguments we used. 
Get-MessageTrackingLog @parameters

我知道你也想做其他可选项。很容易从我在这里展示给你的东西复制。在检查其他参数时,基本上采用您定义和构建的哈希表。然后,您splat that转到cmdlet Get-MessageTrackingLog

另请注意,您可以在param内使用其中某些内容的默认值,这样您就不必检查它们是否存在。

当你有很多参数时,这也是保持线条短路的便捷方法。保存反引号使用splatting。