Вы действительно слишком усложнили это. усилия. Кроме того, у вас есть несколько вопросов / проблем, и, будучи новичком, вы пытаетесь создать консольное приложение MDI. Я бы сказал, что это немного для новичка.
Причина, по которой вы не получаете то, что вы ищете:
- Вы вообще не анализируете этот текстовый файл, чтобы получить текст, который вы хотите отобразить при показе
- У вас действительно вообще не настроен подход 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
Тем не менее, это ваш выбор. Тем не менее, как я показываю, у вас есть много вариантов, и единственный способ узнать, правильно ли вы выбрали, - это сначала узнать о них.