我已经创建了一个接受用户输入的批处理文件,然后以用户输入作为其运行时参数来启动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。谁能告诉我这是什么错误。
谢谢
答案 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 /?
另请参见