Как несколько раз запрашивать пользователя с помощью пакетного файла с несколькими пользовательскими входами?

Я хочу изменить серийный номер и номер продукта около 250 серверов (на данный момент они неверны). Я знаю команду, которую мне нужно использовать, но мне нужно иметь возможность вводить определенные параметры в эту команду, а затем запускать ее.

Мне нужны следующие варианты:

  1. Запрос на выбор обновления серийного номера или номера продукта
  2. Несколько запросов для фактического серийного номера, IP-адреса, имени пользователя и пароля при выборе перед обновлением серийного номера
  3. Множественные подсказки для фактического номера продукта, IP-адреса, имени пользователя и пароля при выборе перед обновлением номера продукта

Команда, которую я хочу запустить через пакетный файл:

asu64 set SYSTEM_PROD_DATA.SysInfoSerialNum XXXXXXX --host XXX.XXX.XXX.XXX --user XXXX --password XXXX

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

Вот что я сделал до сих пор. (Пожалуйста, извините за простоту. Я очень новичок в этом деле.)

@ECHO OFF
ECHO Test Code
ECHO.
ECHO 1.Serial Number
ECHO 2.Product Name
ECHO.
CHOICE /C 12 /M "Enter your choice:"
ECHO.
IF CHOICE 1 GOTO SerialNumber
IF CHOICE 2 GOTO ProductName

:SerialNumber
ECHO Serial Number 
GOTO End

:ProductNumber
ECHO Product Number
GOTO End

PAUSE

Большое спасибо за любую помощь, которую вы можете предложить.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этой задачи можно использовать:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "IpAddress = "
set "NameUser = "
set "Password = "

:MainMenu
cls
echo/
echo   1 ... Serial number
echo   2 ... Product number
echo   E ... Exit
echo/
%SystemRoot%\System32\choice.exe /C 12E /N /M "Enter your choice:"
if errorlevel 3 exit /B
if not errorlevel 1 goto MainMenu
echo/
if errorlevel 2 goto ProductNumber

set "NumberText=serial"
set "NumberOption=SYSTEM_PROD_DATA.SysInfoSerialNum"
goto NumberPrompt

:ProductNumber
set "NumberText=product"
set "NumberOption=SYSTEM_PROD_DATA.SysInfoProductNum"

:NumberPrompt
set "NumberValue = "
set /P "NumberValue=Please enter %NumberText% number: " || goto NumberPrompt
set "NumberValue=%NumberValue:"=%"
if not defined NumberValue goto NumberPrompt

echo/
if defined IpAddress (set "Default= [%IpAddress%]") else set "Default = "
:IpPrompt
set /P "IpAddress=Please enter IP address%Default%: "
if not defined IpAddress goto IpPrompt
set "IpAddress=%IpAddress:"=%"
if not defined IpAddress goto IpPrompt

echo/
if defined NameUser (set "Default= [%NameUser%]") else set "Default = "
:NamePrompt
set /P "NameUser=Please enter user name%Default%: "
if not defined NameUser goto NamePrompt
set "NameUser=%NameUser:"=%"
if not defined NameUser goto NamePrompt

echo/
if defined Password (set "Default= [%Password%]") else set "Default = "
:PasswordPrompt
set /P "Password=Please enter password%Default%: "
if not defined Password goto PasswordPrompt
set "Password=%Password:"=%"
if not defined Password goto PasswordPrompt

echo/
"%~dp0ASU64.exe" set %NumberOption% "%NumberValue%" --host "%IpAddress%" --user "%NameUser%" --password "%Password%"
echo/
if not errorlevel 1 (
       echo The update of the %NumberText% number "%NumberValue%" was successful.
) else echo ERROR: The update of the %NumberText% number "%NumberValue%" failed!
echo/
%SystemRoot%\System32\choice.exe /C CE /N /T 10 /D C /M "Press C to continue or E to exit ..."
if not errorlevel 2 goto MainMenu
endlocal

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

Пожалуйста, прочитайте следующие ответы для объяснения кода:

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

  • call /? ... объясняет %~dp0 ... диск и путь аргумента 0, который является путем пакетного файла.
  • choice /?
  • echo /?
  • endlocal /?
  • exit /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

Спасибо, Mofi, я не смогу попробовать это до конца этой недели, но я намерен упаковать это с помощью программы ASU64.exe, и пока они оба находятся в одной папке, это должно работать. Я попробовал это на своем ноутбуке, и это работает. Хотя он, естественно, потерпит неудачу, поскольку не сможет найти введенный IP-адрес.

AshSalhan 15.05.2022 15:56

@AshSalhan Я обновил код и его описание в соответствии с дополнительной информацией, предоставленной вами в комментарии выше.

Mofi 15.05.2022 20:40

Спасибо, Мофи, я не думаю, что exe нужно указывать в команде, так как он работает без этого.

AshSalhan 17.05.2022 14:17

@AshSalhan Вы протестировали пакетный файл, скорее всего, только сохранив его на локальном диске и дважды щелкнув его в проводнике Windows. В этом случае Проводник Windows запускается cmd.exe с СоздатьПроцесс с lpCurrentDirectory, установленным explorer.exe для каталога, содержащего пакетный файл. Таким образом, случайноТекущий каталог — это каталог, содержащий командный файл и ASU64.exe.

Mofi 17.05.2022 17:57

@AshSalhan Запустите пакетный файл как администратор, а текущий каталог, возможно, C:\Windows\System32, см. Почему «Запуск от имени администратора» изменяет (иногда) текущий каталог пакетного файла?. Скопируйте пакетный файл в сетевое хранилище и получите доступ к папке в сетевом хранилище, используя путь UNC, а текущий каталог — C:\Windows. Откройте окно командной строки и введите полное имя пакетного файла, используя дополнение имени файла cmd.exe, и нажмите ВОЙТИ, и текущий каталог, скорее всего, %USERPROFILE%.

Mofi 17.05.2022 18:00

@AshSalhan Я пишу пакетные файлы, работающие с по дизайну, а не с случайно. Пакетные файлы, написанные мной, не зависят от свойств среды выполнения, определенных вне пакетного файла, поскольку это делает его непредсказуемым: пакетный файл всегда работает во всех возможных средах выполнения, а не только случайно в наиболее распространенной среде выполнения. В Stack Overflow ежедневно задают вопросы люди, которые спрашивают, почему пакетный файл не работает в случае использования X (запускается от имени администратора, в качестве запланированной задачи, службой, с путем UNC, ...), хотя он отлично работает при двойном щелчке. .

Mofi 17.05.2022 18:05

Другие вопросы по теме