2016-01-18 3 views
1

Я пишу инструмент GUI с помощью powershell, который вытаскивает информацию отслеживания сообщений с сервера обмена. На основе того, что пользователь выбирает, будет определяться тип поиска. Если не все аргументы передаются при запуске Get-MessageTrackingLog, будет ли команда просто удалить этот параметр или передать значение null? Пример: если ничто не передается в «-sender $ sender», значение просто будет «null» или параметр также будет удален, как это?Передача различных аргументов в функции с Powershell

Get-MessageTrackingLog -server $ HTS -sender $ отправителем # значение в настоящее время прошло или Get-MessageTrackingLog -server $ HTS # никакого значения для отправителя не передается

Другими словами, если я не» t передать 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

@ Matt Таким образом, это будет выглядеть следующим образом: \t 'Get-MessageTrackingLog @MsgTrkParm \t $ MsgTrkParm = @ { 'отправителя' = $ Sender; \t \t 'server' = $ HTS; \t \t «Старт» = $ Пуск; 'end' = $ End; \t \t 'EventID' = $ EventID} ' – PdeRover

+0

См. Мой ответ, где я пытаюсь его покрыть. – Matt

ответ

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 командлету Get-MessageTrackingLog

Также имейте в виду, что вы можете просто использовать значения по умолчанию для некоторых из них внутри param, так что, как вы не должны проверить, если они существуют.

Это также удобный способ сохранить короткие строки, когда у вас много параметров. Сохраните обратные линии, используя splatting.

+0

Теперь я здесь, Ашер, говоря «Разбей это» в моей голове. – Matt

+0

Большое вам спасибо !!! Я попробую и дам вам знать как можно скорее. – PdeRover

+0

Еще раз спасибо за вашу помощь, это решило мою проблему. – PdeRover

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, потому что есть определенное значение по умолчанию указано.

Смежные вопросы