2015-07-17 6 views
1

Я работаю над побочным проектом и упрощаю управление, поскольку почти все имена серверов составляют 15 символов, и я начал искать вариант управления RDP, но ни один из них мне не нравился; поэтому я начал писать один, и мне остается только одна проблема: что мне делать, чтобы управлять, если пользователь вводит недостаточно для поиска, чтобы два сервера соответствовали запросу. Я думаю, мне придется положить его в массив, а затем позволить им выбрать сервер, который они имели в виду. Вот то, что я до сих порВыберите опцию из массива

function Connect-RDP 
{ 

param (
    [Parameter(Mandatory = $true)] 
    $ComputerName, 
    [System.Management.Automation.Credential()] 
    $Credential 
) 

# take each computername and process it individually 
$ComputerName | ForEach-Object{ 
    Try 
    { 
     $Computer = $_ 
     $ConnectionDNS = Get-ADComputer -server "DomainController:1234" -ldapfilter "(name=$computer)" -ErrorAction Stop | Select-Object -ExpandProperty DNSHostName 
     $ConnectionSearchDNS = Get-ADComputer -server "DomainController:1234" -ldapfilter "(name=*$computer*)" | Select -Exp DNSHostName    
     Write-host $ConnectionDNS 
     Write-host $ConnectionSearchDNS 
     if ($ConnectionDNS){ 
     #mstsc.exe /v ($ConnectionDNS) /f 
     }Else{ 
     #mstsc.exe /v ($ConnectionSearchDNS) /f 
     } 
    } 
    catch 
    { 
     Write-Host "Could not locate computer '$Computer' in AD." -ForegroundColor Red 
    } 
} 
} 

В основном я искал способ управления, если пользователь вводит сервер1

, что он спросит он хочет подключиться к Server10 или Server11 так оба они соответствуют фильтру.

+1

Любая помощь? https://gallery.technet.microsoft.com/scriptcenter/Select-Item-V-10-beta-5e579fa6 – mjolinor

+0

Вы можете получить преимущества от неоднозначного разрешения имен здесь: 'Get-ADComputer -LdapFilter '(ANR = $ Computer)" | Выберите -Exp DNSHostName' –

+0

@mjolinor Мне нравится, как это выглядит, и так как вы были тем, кто написал его, как бы вы рекомендовали его использовать? – Luke

ответ

4

Другой вариант для представления выбора пользователю: Out-GridView, с переключателем -OutPutMode.

Заимствование из примера Мэтта:

$selection = Get-ChildItem C:\temp -Directory 

If($selection.Count -gt 1){ 
    $IDX = 0 
    $(foreach ($item in $selection){ 
    $item | select @{l='IDX';e={$IDX}},Name 
    $IDX++}) | 
    Out-GridView -Title 'Select one or more folders to use' -OutputMode Multiple | 
    foreach { $selection[$_.IDX] } 
} 

else {$Selection} 

Этот пример позволяет для выбора нескольких папок, но может вы можете ограничить их в одну папку, просто переключив -OutPutMode к одиночному

+0

Ах да. Всегда забывайте об Out-GridView. Гораздо удобнее. – Matt

+0

Я нахожу его более «кодер дружественным», тоже. – mjolinor

3

Я уверен, что mjolinor has это здорово. Я просто хотел показать другой подход, используя PromptForChoice. В следующем примере мы принимаем результаты от Get-ChildItem, и если есть более одного, мы собираем коллекцию вариантов. Пользователь будет выбирать один, а затем этот объект будет передан на следующий шаг.

$selection = Get-ChildItem C:\temp -Directory 

If($selection.Count -gt 1){ 
    $title = "Folder Selection" 
    $message = "Which folder would you like to use?" 

    # Build the choices menu 
    $choices = @() 
    For($index = 0; $index -lt $selection.Count; $index++){ 
     $choices += New-Object System.Management.Automation.Host.ChoiceDescription ($selection[$index]).Name, ($selection[$index]).FullName 
    } 

    $options = [System.Management.Automation.Host.ChoiceDescription[]]$choices 
    $result = $host.ui.PromptForChoice($title, $message, $options, 0) 

    $selection = $selection[$result] 
} 

$selection 

-Directory требует PowerShell v3, но вы используете 4, так что вы бы хорошо.

В ISE это будет выглядеть следующим образом:

ISE Choice

В стандартной консоли вы увидите что-то вроде этого

Console Choice

В настоящее время вы должны ввести всю папку чтобы выбрать выбор в подсказке. Трудно получить уникальное значение для нескольких вариантов для ярлыка, также называемого клавишей ускорителя. Подумайте об этом как о способе убедиться, что они делают правильный выбор!

+0

Мне нравится, как это выглядит, поэтому я бы просто подключил вывод get-adobject к этому? – Luke

+0

@ Luke Да. Однако вам придется внести другие незначительные изменения в то, что для кнопок/вариантов появляется соответствующее свойство. Это первый параметр после 'ChoiceDescription' – Matt

+0

Обратите внимание, однако, что этот подход станет беспорядочным, если у вас есть несколько вариантов выбора. –

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