Вопрос или проблема
if (-not (Test-Path -Path "$env:ProgramData\Chocolatey\choco.exe" -PathType Leaf))
{
# с https://chocolatey.org/install
Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
}
# Шаг 2) определите массив пакетов, которые вы предлагаете
$Packages="googlechrome",
'firefox',
'codeblocks',
'windbg',
'nasm',
'explorersuite',
'pestudio',
'vscode',
'sysinternals',
'python',
'ccleaner',
'anaconda3',
'wireshark',
'sublimetext3',
'notepadplusplus',
'Exit'
# Шаг 3) определите функцию Show-Menu
function Show-Menu
{
Clear-Host
Write-Host "**********************************************"
Write-Host "СПИСОК ПРОГРАММ"
# выводите варианты, используя массив пакетов
for ($i = 0; $i -lt $Packages.Count; $i++)
{
# {0,10} означает выравнивание вправо с пробелами до макс. 2 символов
Write-Host ('{0,10}. {1}' -f ($i + 1), $Packages[$i])
}
Write-Host " q. Выйти из скрипта"
Write-Host "*************************************************"
Write-Host
}
# Шаг 4) запустите бесконечный цикл, выходите только если пользователь введет 'q'
while ($true)
{
Show-Menu
# $UserInput = Read-Host "Введите номер программного обеспечения для установки"
$UserInput = Read-Host "Выберите номер(-а) программного обеспечения для установки"
$ok = $UserInput -match '[123456789101112131415]+$'
if( -not $ok)
{
write-host "Некорректный выбор"
sleep 2
write-host ""
}
until ($ok)
switch -Regex ($UserInput)
{
"1" {googlechrome}
"2" {firefox}
"3" {codeblocks}
"4" {windbg}
"5" {nasm}
"6" {explorersuite}
"7" {pestudio}
"8" {vscode}
"9" {sysinternals}
"10" {python}
"11" {ccleaner}
"12" {anaconda3}
"13" {wireshark}
"14" {sublimetext3}
"15" {notepadplusplus}
} until ($ok)
# проверьте, хочет ли пользователь выйти, и если да, прервите цикл
if ($UserInput -eq 'q') { break }
# проверьте, ввел ли пользователь номер между 1 и общим количеством пакетов (включительно)
if ([int]::TryParse($UserInput,[ref]$null) -and 1..$Packages.Count -contains [int]$UserInput)
{
# здесь вы устанавливаете выбранный пакет с использованием номера индекса массива (= номер пользовательского ввода минус 1)
$packageIndex = [int]$UserInput - 1
Write-Host "Установка $($Packages[$packageIndex])"
# Choco install $Packages[$packageIndex] -y
Choco install $Packages[$packageIndex] -y --ignore-checksums
}
else
{
$availableOptions = 1..$Packages.Count -join ','
Write-Host "Ошибка в выборе, выберите $availableOptions или q" -Foreground Color Red
}
$null = Read-Host "Нажмите Enter, чтобы продолжить"
}
Мне нужно выбрать несколько номеров из списка меню, в зависимости от введенных мною номеров, соответствующее программное обеспечение должно быть загружено и установлено. Ранее мой скрипт работал правильно, но когда я добавил дополнительный код для достижения вышеуказанной функциональности, он не работает должным образом. Пожалуйста, помогите мне.
Ответ или решение
Для успешного выбора нескольких чисел из меню и последующей установки соответствующего программного обеспечения, требуется внести изменения в существующий скрипт, чтобы обеспечить корректную обработку множества пользовательских вводов. Ваш текущий скрипт правильно работает для одиночного выбора, но не учитывает возможность ввода нескольких чисел. Давайте разберем необходимые изменения, чтобы ваша задача была выполнена корректно.
Шаг 1: Оптимизация функции входа
Измените часть кода, где запрашивается ввод пользователя, чтобы обеспечить поддержку ввода нескольких чисел. Вместо одной строки, вы можете позволить пользователю вводить числа, разделенные запятыми.
$UserInput = Read-Host "Выберите номера программного обеспечения для установки, разделенные запятыми (например, 1,2,3)"
Шаг 2: Обработка множества ввода
После того как пользователи ввели свои выборы, необходимо обработать входные данные, разбив строку по запятым и проверив отдельные числа. Вместе с проверками на ошибочный ввод, это даст возможность последовательно установить все выбранные пакеты.
$SelectedPackages = $UserInput -split ',' | ForEach-Object { $_.Trim() }
$validSelection = $true
foreach ($package in $SelectedPackages) {
if (-not ([int]::TryParse($package, [ref]$null)) -or -not (1..$Packages.Count -contains [int]$package)) {
Write-Host "Недопустимый выбор: $package" -ForegroundColor Red
$validSelection = $false
}
}
if ($validSelection) {
foreach ($package in $SelectedPackages) {
$packageIndex = [int]$package - 1
Write-Host "Установка $($Packages[$packageIndex])"
Choco install $Packages[$packageIndex] -y --ignore-checksums
}
} else {
$availableOptions = 1..$Packages.Count -join ','
Write-Host "Ошибка в выборе, выберите из доступных: $availableOptions или q" -ForegroundColor Red
}
Шаг 3: Проверка и установка пакетов
Теперь, когда скрипт обрабатывает множественный ввод, он будет проверять каждый номер и устанавливать соответствующий пакет, если ввод действительный. Если хотя бы один введенный номер недействителен, пользователю сообщат об этом.
Заключение
С внесенными изменениями выше, вы сможете выбирать и устанавливать несколько пакетов программного обеспечения за один раз, используя числа, разделенные запятыми. Это делает процесс более удобным и эффективным. Убедитесь, что у вас установлена последняя версия Chocolatey и все необходимые разрешения для установки программного обеспечения через PowerShell.
При должной реализации, ваш обновленный скрипт сможет правильно обрабатывать выбор нескольких программ и предоставлять пользователям более удобный интерфейс взаимодействия.