Splatting - способ достичь этого.Он назван так, потому что вы ссылаетесь на переменную с @
вместо $
и @
, выглядит как "сплат".
это работает путем создания хеш-таблицы, которая является типом словаря (пары ключ / значение).В PowerShell мы создаем литералы хеш-таблицы с @{}
.
Чтобы использовать сплаттинг, вы просто создаете хеш-таблицу, где каждая пара ключ / значение является именем и значением параметра соответственно.
Так, например, если вы хотите вызвать Get-ChildItem -LiteralPath $env:windir -Filter *.exe
, вы также можете сделать это следующим образом:
$params = @{
LiteralPath = $env:windir
Filter = '*.exe'
}
Get-ChildItem @params
Вы также можете смешивать и сопоставлять прямые параметры с разбивкой:
$params = @{
LiteralPath = $env:windir
Filter = '*.exe'
}
Get-ChildItem @params -Verbose
Это наиболее полезно, когда вам нужно условно пропустить параметр, поэтому вы можете включить это:
if ($executablesOnly) {
Get-ChildItem -LiteralPath $env:windir -Filter *.exe
} else {
Get-ChildItem -LiteralPath $env:windir
}
В это:
$params = @{
LiteralPath = $env:windir
}
if ($executablesOnly) {
$params.Filter = '*.exe'
}
Get-ChildItem @params
или это:
$params = @{}
if ($executablesOnly) {
$params.Filter = '*.exe'
}
Get-ChildItem -LiteralPath $env:windir @params
Имея только 2 возможных варианта, if
/ else
не выглядит , что плохо, но по мере того, как ваш выбор умножается и усложняется, он становится кошмаром.
Ваша ситуация: есть одна вещь, которую я хочу отметить в первую очередь.Параметры, с которыми вы пытаетесь чередовать, являются параметрами переключения.Это означает, что когда вы предоставляете их, вы обычно указываете только имя параметра.По правде говоря, они принимают логические значения, по умолчанию равные true, когда указывается имя.На самом деле вы можете переопределить их, чтобы вы могли сделать Search-ADAccount -UsersOnly:$false
, но это нетипично.
В любом случае, смысл упоминания в том, что он может сбивать с толку то, как вы устанавливаете его значение в хеш-таблице для разбрызгивания, но простой ответ - просто дать им логическое значение (и обычно это $true
).
Так что просто изменив код, просто:
$account = if ($choice -eq 1) {
@{ UsersOnly = $true }
} elseif ($choice -eq 2) {
@{ ComputersOnly = $true }
}
# skipping some stuff
Search-ADAccount -AccountInactive -TimeSpan 90 @account
Я также поместил назначение $account
слева от if
, а не внутри, но это ваш выбор.