如何传递运行时参数以从批处理文件启动exe

时间:2019-05-21 04:35:07

标签: batch-file exe flags

我已经创建了一个接受用户输入的批处理文件,然后以用户输入作为其运行时参数来启动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 :(得分:0)

使用提供的代码无法在没有输入版本字符串的情况下开始demo.exe。仅当发布的代码位于以(开头并以匹配的)结尾的命令块中时,才会发生这种情况。在这种情况下,如在命令提示符窗口set /?中运行命令 SET 所帮助,将需要delayed expansion。 Windows命令处理器cmd.exe在使用该命令块执行命令(通常为 IF FOR )之前,先分析整个命令块。在解析命令块期间,整个命令块中的每个%variable%引用都由引用的环境变量的当前值替换,如How does the Windows Command Interpreter (CMD.EXE) parse scripts?所述,并且可以在debugging a batch file上看到。对于在解析命令块期间未定义的环境变量,最终执行的命令行不包含任何内容,而不是%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 /?

另请参见