无法找到接受参数的位置参数

时间:2017-08-16 11:42:11

标签: powershell

if ($mbcb1.Checked -eq $true) {$dgr = "-AutoStart"}

if ($mbcb2.Checked -eq $true) {$dgrc = "-AutoComplete"}

if ($mbcb3.Checked -eq $true) {$dgren = "-NotificationEmails"}

New-MigrationBatch -Name $mbnd -SourceEndpoint $mbcx -TargetDeliveryDomain $mbtdd -CSVData ([System.IO.File]::ReadAllBytes("$cmbcsvfile")) $dgr $dgrc $dgren admin@admin.com


Error : 
A positional parameter cannot be found that accepts argument '-Autostart'.
    + CategoryInfo          : InvalidArgument: (:) [New-MigrationBatch], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,New-MigrationBatch
    + PSComputerName        : ps.outlook.com

如果我直接输入它的工作但是作为变量抛出错误传递。

1 个答案:

答案 0 :(得分:4)

如果要选择性地指定参数,请使用splatting:

$OptionalParameters = @{
  AutoStart = $mbcb1.Checked
  AutoComplete = $mbcb2.Checked
}
if ($mbcb3.Checked) {
  $OptionalParameters["NotificationEmails"] = 'admin@admin.com'
}

New-MigrationBatch -Name $mbnd -SourceEndpoint $mbcx -TargetDeliveryDomain $mbtdd -CSVData ([System.IO.File]::ReadAllBytes("$cmbcsvfile")) @OptionalParameters

我们只是使用参数名称及其参数构建一个哈希表,然后将其作为参数提供给cmdlet(但是像@name而不是$name),然后解析器将转为每个将哈希表中的条目输入-key:value形式的命名参数 最后,$mbcb3.Checked -eq $true比较是多余的,因为Checked(假设$mbcb3是一个复选框)已经是$true$false

有关参数splatting的详细信息,请参阅about_Splatting帮助文件