我正在编写一个使用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
}
}
}
}
答案 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。