Тип переменной Проблема для параметра? - Powershell - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь запустить приведенный ниже код для поиска неактивных учетных записей пользователей в подразделении. Похоже, тип переменной, которую я использую, может не использоваться с параметрами. Кажется ли это правильным, и если да, то какой тип переменной я должен использовать?

$scope = "-UsersOnly" 

$accounts = Search-ADAccount -SearchBase "OU=Users,OU=testLab02,DC=test,DC=local" -AccountInactive -TimeSpan ([timespan]7D) $scope
    foreach($account in $accounts){
        If ($noDisable -notcontains $account.Name) {
            Write-Host $account
            #Disable-ADAccount -Identity $account.DistinguishedName -Verbose $whatIf | Export-Csv $logFile
        }
    }

Я получаю следующую ошибку:

enter image description here

Search-ADAccount: не найден позиционный параметр, который принимает аргумент '-UsersOnly'. В C: \ Users \ Administrator \ Documents \ Disable-ADAccounts.ps1: 63 char: 21 + ... $ accounts = Search-ADAccount -SearchBase $ OU.DistinguishedName -Accou ... + ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo: InvalidArgument: (:) [Search-ADAccount], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.ActiveDirectory.Management.Commands.SearchADAccount

Однако, если я запускаю команду, ожидаемую без переменных, она работает, как ожидается, без переменных работает :

Search-ADAccount -SearchBase "OU=Users,OU=testLab02,DC=test,DC=local" -AccountInactive -TimeSpan ([timespan]7D) -UsersOnly

enter image description here

1 Ответ

3 голосов
/ 19 февраля 2020

$scope = "-UsersOnly"

Нельзя передать (переключатель) параметр , сохраненный в переменной таким образом, - он всегда будет рассматриваться как ( позиционный) аргумент , который объясняет ошибку, которую вы видели; с напрямую переданными аргументами, только без кавычек, буквенные токены, такие как -UsersOnly, распознаются как имена параметров.

Вы можете использовать splatting для передачи параметров через переменные, что в вашем случае означает:

# Define a hash table of parameter values.
# This hash table encodes switch parameter -UsersOnly
$scope = @{ UsersOnly = $true } # [switch] parameters are represented as Booleans

# Note the use of sigil @ instead of $ to achieve splatting
Search-ADAccount @scope -SearchBase "OU=Users,OU=testLab02,DC=test,DC=local" -AccountInactive -TimeSpan ([timespan]7D) 
  • $scope определяется как hash table (@{ ... }), чей записи представляют пары имя-значение параметра .

    • Здесь определена только одна пара имя-значение параметра:
      • имя параметра -UsersOnly (ключ ввода должен быть определен без символ -) ...
      • ... со значением $true, что для параметра [switch] (флаг) эквивалентно передаче параметра; $false обычно [1] эквивалентно пропуску it.
  • Для передачи параметра значения, представленные хеш-таблицей $scope для команды через splatting, вместо $ следует использовать сигил @, т. е. @scope в этом случае.


[1] Команда может технически различать guish между переключателем, являющимся , опущенным , и передаваемым со значением $false, а иногда приводит к другому поведению, особенно с общим параметром -Confirm, где -Confirm:$false переопределяет переменную предпочтения $ConfirmPreference.

...