Как передать аргумент времени выполнения для запуска exe из командного файла - PullRequest
0 голосов
/ 21 мая 2019

Я создал пакетный файл, который принимает пользовательский ввод, а затем запускает файл exe с пользовательским вводом в качестве аргумента времени выполнения.

@echo off

set /p version= "Please enter the version   "
ECHO version is %version%

cd %USERPROFILE%\Documents
START demo.exe -v %version%

С приведенным выше кодом он просто делаетне запускать exe.Если я заменим команду START на следующую:

START demo.exe -v 2019.1.133

и перезапущу командный файл, он запустит exe.Может кто-нибудь, пожалуйста, скажите мне, в чем здесь ошибка.

Спасибо

1 Ответ

0 голосов
/ 21 мая 2019

Запуск demo.exe без входной строки версии невозможен с предоставленным кодом. Это произойдет, только если опубликованный код находится внутри командного блока, начинающегося с ( и заканчивающегося соответствием ). В этом случае потребуется отложенное расширение , как описано с помощью команды SET , выводимой при запуске в окне командной строки set /?. Командный процессор Windows cmd.exe анализирует весь блок команд перед выполнением команды (обычно IF или FOR ) с использованием этого блока команд. Каждая ссылка %variable% во всем командном блоке заменяется текущим значением указанной переменной среды во время синтаксического анализа командного блока, как описано в Как синтаксический анализ сценариев командных интерпретаторов Windows (CMD.EXE)? и как он можно увидеть на отладке командного файла . Для переменных среды, не определенных во время синтаксического анализа командного блока, окончательно выполненные командные строки ничего не содержат вместо %variable%.

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

Вот улучшенная версия предоставленного кода:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Delete environment variable Version before each user prompt. The
rem user is prompted until a valid version string is input by the user.
:EnterVersion
set "Version="
set /P Version="Please enter the version: "

rem Has the user input a string at all?
if not defined Version goto EnterVersion
rem Remove all double quotes from user input string.
set "Version=%Version:"=%"
rem Is there no version string anymore after removing double quotes?
if not defined Version goto EnterVersion
rem Contains the version string any other character than digits and dots?
for /F delims^=0123456789.^ eol^= %%I in ("%Version%") do goto EnterVersion

rem Start demo.exe with the first argument -v and second argument being the
rem input version string as new process with window title Demo in case of
rem demo.exe is a console application in user's documents directory.
start "Demo" /D"%USERPROFILE%\Documents" demo.exe -v %Version%

endlocal

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

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
  • start /?

Смотри также

...