Передать переменную в качестве параметра переключателя в Powershell - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь создать сценарий powershell, который будет захватывать все учетные записи Active Directory, которые включены и неактивны в течение 90 дней.Сценарий предложит пользователю выбрать между запросом компьютера или учетных записей пользователей.В зависимости от выбора, он передаст его основной команде как переменную.

Команды работают правильно, если я не передам переменную.

Я не уверен, что чтоЯ пытаюсь сделать это возможно.

Извините за плохое форматирование кода.Только начинается.

    Clear-Host
    write-host "`nProgram searches for Enabled AD users account that have not logged in for more than 90 days. `nIt searches the entire domain and saves the results to a CSV file on users desktop." "`n"


    $choice = Read-host -Prompt " What do you want to search for Computer or Users Accounts`nType 1 for users`nType 2 for Computers`n`nChoice"



$account
if ($choice -eq 1){
   $account = UsersOnly 
   }
Elseif($choice -eq 2){
   $account = ComputersOnly
   }
Else{
   write-host "This is not an option `n exiting program"
   exit
   }



                $FileName = Read-Host -Prompt "What do you want to name the CSV file"
                $folderPath = "$env:USERPROFILE\Desktop\$FileName.csv"

                Search-ADAccount -AccountInactive -TimeSpan 90 -$account | Where-Object { $_.Enabled -eq $true } | select Name, UserPrincipalName, DistinguishedName | Export-Csv -Path $folderPath

1 Ответ

0 голосов
/ 02 февраля 2019

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, а не внутри, но это ваш выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...