Как читать и анализировать значения из текстового файла согласно средам в Power Shell? - PullRequest
0 голосов
/ 04 марта 2020

Я новичок в PowerShell и работаю над сценарием, где у меня есть текстовый файл в формате ниже

имя файла ab c .txt

ABC=WINDOW01
ABC_NCD_PP

CDE=WINDOW02
CDE_NN_01

EFG=WINDO03
DD_PP_01

Ниже я пытаюсь с мой сценарий

function Show-Menu
{
    param (
        [string]$Title = 'My Menu'
    )
    Clear-Host
    Write-Host "================ $Title ================"
    Write-Host "1: Press '1' to list all the Window Boxes"
    Write-Host "Q: Press 'Q' to quit."
}

function Vm-List 
{
    Write-Output "Below are the window boxes"
    $serverlist = @(get-content  -Path "k:\abc.txt")
    $counter = 0
    foreach ($server in $serverlist)
    {
      $counter++
    write-host ""$counter": Press '"$counter"' to select : $server"
    }

}

do
{
     Show-Menu
     $input = Read-Host "Please make a selection"
     switch ($input)
     {
           '1' {
                Vm-List

           } 'q' {
                return
           }
     }
     pause
}
until ($input -eq 'q')

Я хочу, когда пользователь нажимает 1, он должен отображать все окна в следующем формате

1: Press '1' to select ABC window box WINDOW01
2: Press '2' to select CDE window box WINDOW02
3: Press '3' to select EFG window box WINDOW03
Q: Press 'q' to quit
Please make a selection:

Как только я выберу любую опцию сверху, он должен отобразить значение в соответствии с это поле. Например, если я выберу 1, то должно отобразиться (это значение может быть больше)

List of all envs:
1: Press '1' to select ABC_NCD_PP
R: Press 'r' to return
Q: Press 'q' to quit
Please make a selection:

1 Ответ

0 голосов
/ 05 марта 2020

Вы действительно слишком усложнили это. усилия. Кроме того, у вас есть несколько вопросов / проблем, и, будучи новичком, вы пытаетесь создать консольное приложение MDI. Я бы сказал, что это немного для новичка.

Причина, по которой вы не получаете то, что вы ищете:

  1. Вы вообще не анализируете этот текстовый файл, чтобы получить текст, который вы хотите отобразить при показе
  2. У вас действительно вообще не настроен подход MDI для этого второго меню.

Быть новичком в чем-то просто, хорошо, но нет, по крайней мере, собираюсь получить некоторую тренировку нарастания перед попыткой использовать это, не. Особенно с тоннами бесплатных видео, учебных пособий, блогов, примеров кода, справочников и т. Д. c. По всей сети. Используйте встроенные в систему файлы справки.

# All Help topics and locations
Get-Help about_*
Get-Help about_Functions

Get-Help about* | Select Name, Synopsis

Get-Help about* | 
Select-Object -Property Name, Synopsis |
Out-GridView -Title 'Select Topic' -OutputMode Multiple |
ForEach-Object { Get-Help -Name $_.Name -ShowWindow }

explorer "$pshome\$($Host.CurrentCulture.Name)"

# Get parameters, examples, full and Online help for a cmdlet or function

# Get a list of all functions
Get-Command -CommandType Function | 
Out-GridView -PassThru -Title 'Available functions'

# Get a list of all commandlets
Get-Command -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available cmdlets'

# Get a list of all functions for the specified name
Get-Command -Name '*VM*' -CommandType Function | 
Out-GridView -PassThru -Title 'Available named functions'

# Get a list of all commandlets for the specified name
Get-Command -Name '*VM**'  -CommandType Cmdlet | 
Out-GridView -PassThru -Title 'Available named cmdlet'

# get function / cmdlet details
Get-Command -Name Get-VM -Syntax
(Get-Command -Name Get-VM).Parameters.Keys
Get-help -Name Get-VM -Full
Get-help -Name Get-VM -Online
Get-help -Name Get-VM -Examples

Get-Command -Name Out-GridView -Syntax
(Get-Command -Name Out-GridView ).Parameters.Keys
Get-help -Name Out-GridView -Full
Get-help -Name Out-GridView -Online
Get-help -Name Out-GridView -Examples

Итак, перейдите на Youtube и найдите там тренинг

'begin Powershell'

Ваш настоящий вопрос здесь ...

'как написать консольное меню в PowerShell'

... и поиск этой строки вернет вам очень длинный список образцов для использования.

Например:

Повторное создание консольного меню PowerShell , Часть 1

В MS powershellgallery.com уже есть модули, которые делают это меню для вас.

powershellgallery 'console menu'

Youtube снова для создания меню ...

PowerShell menus

Модули, которые вы можете загрузить и использовать для такого меню, находятся в вашем сеансе PowerShell.

Find-Module -Name '*menu*' | 
Format-Table -AutoSize

<#
# Results

Version  Name                     Repository Description                                                                                                                           
-------  ----                     ---------- -----------                                                                                                                           
1.0.6    ps-menu                  PSGallery  Powershell module to generate interactive console menu                                                                                
0.2      MenuShell                PSGallery  Make console menus in seconds with MenuShell                                                                                          
1.0.52.0 CliMenu                  PSGallery  Easily build and edit CLI menus in Powershell                                                                                         
0.1.1    ServerOpsMenu            PSGallery  PowerShell module to provide maintenance menu for Windows servers                                                                     
1.0.1    PSScriptMenuGui          PSGallery  Use a CSV file to make a graphical menu of PowerShell scripts. Easy to customise and fast to launch....                               
1.0.0.0  SimpleMenu               PSGallery  Create and invoke a simple menu interface.                                                                                            
2.21     DosInstallUtilities.Menu PSGallery  Functions to create menus                                                                                                             
1.0.2001 SS.CliMenu               PSGallery  CLI menu infrastructure for PowerShell. ...                                                                                           
1.0.0.2  MenuSelect               PSGallery  Module description                                                                                                                    
1.0.4    SLMenu                   PSGallery  Text User Interface Module for Powershell Console                                                                                     
0.1.1    PSMenu                   PSGallery  Powershell module to generate interactive console menu....                                                                            
0.5      ContextSensitiveMenus    PSGallery  Allows you to add type-sensitive context menus to WPF controls                                                                        

#>

Так же, как потоки в topi c Stackoverflow .

Реальный вопрос в том, почему в меню консоли можно использовать инструменты PowerShell GUI для этого? Просто вытяните список виртуальных машин с помощью командлетов PowerShell / Hyper-V / VMWare, шунтируйте их или Out-GridView для выбора пользователей. Это буквально однострочный сценарий.

# Show the default Out-GridView as a user menu
Get-VM -Name '*' | 
Sort-Object -Property Name | 
Out-GridView -Title 'Select one or more Windows host to use. CRTL+LeftMouseClick to select more than one' -Passthru | 
Start-VM -ComputerName $PSItem

Не нужно много другого кода, если все, что вы делаете, это представляет список виртуальных машин, которые пользователь может выбрать для запуска. Нет необходимости во внешних файлах.

Для этого подхода MDI, вы, кажется, после. Вы все еще можете использовать Out-GridView для этого. См. Примеры здесь :

Создание интерфейса Simplisti c GUI с Out-GridView

Если вы хотите стать еще более элегантным, вы даже можете использовать встроенную справочную систему PowerShell или написать собственную форму Windows. Пример простого инструмента GUI для выбора виртуальной машины с заполнением динамического списка с использованием параметров Dynami c для включения / выключения питания.

function Get-UserVM 
{
    [cmdletbinding()]
    [Alias('guvm')]  

    param
    (
        [ValidateSet('On', 'Off')]
        [Parameter(Mandatory)]
        [string]$State        
    )

    DynamicParam 
    {
        # Set the dynamic parameters' name
        $ParameterName = 'VMName'

        # Create the dictionary 
        $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

        # Create the collection of attributes
        $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]

        # Create and set the parameters' attributes
        $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
        $ParameterAttribute.Mandatory = $true
        $ParameterAttribute.Position = 1

        # Add the attributes to the attributes collection
        $AttributeCollection.Add($ParameterAttribute)

        # Generate and set the ValidateSet 
        $arrSet = ((Get-VM).Name)
        $ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)

        # Add the ValidateSet to the attributes collection
        $AttributeCollection.Add($ValidateSetAttribute)

        # Create and return the dynamic parameter
        $RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
        $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
        return $RuntimeParameterDictionary
    }



    begin 
    {
        # Bind the parameter to a friendly variable
        $Script:VNName = $PsBoundParameters[$ParameterName]
    }

    process 
    {
        switch ($State) 
        { 
            On
            {
                "Attempting to start $Script:VNName"
                Start-VM -Name $Script:VNName
            } 
            Off
            {
                "Attempting to stop $Script:VNName"
                Stop-VM -Name $Script:VNName
            } 
            default {Write-Warning -Message "$Script:VNName state could not be determined"}
        }    
    }
}

Show-Command -Name Get-UserVM

# Or
Show-Command -Name guvm

# Or 
shcm guvm

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

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