为什么用户的输入值在批处理文件中的代码中不起作用? [重复]

问题描述 投票:0回答:2

操作系统是Windows 10.我的批处理文件代码是:

@echo off
:start
REM check if there are more then one arguments
if not "%2" == "" (
    echo Too many parameters entered 
) ELSE (
    REM check if argument one is empty
    if "%1"=="" (
        ECHO Enter File Name Your want to edit
        SET /P name=
        ECHO Your Name  is %name%
    ) 
) 

我没有在Set /p name=部分使用代码。

首次运行代码工作正常。

C:\Users\Ahmad khan\Desktop\work>test.bat
Enter File Name Your want to edit
asd
Your Name  is asd

但是当再次运行代码时,输​​入部分不起作用。

Enter File Name Your want to edit
arslan
Your Name  is asd

您可以在第二次运行中看到我输入名称Arslan,但显示的是第一次运行时输入的asd

第三次运行时也会出现相同情况,显示第二次执行时输入的名称

Enter File Name Your want to edit
qqqqq
Your Name  is arslan
batch-file cmd
2个回答
1
投票

您的问题来自事实批处理文件同时评估IF块中的命令。 this Q/A概述了这一点。以下是我为您的代码添加的一些内容:

@echo off
:start
REM check if there are more then one argumnets
if not "%2" == "" (
echo Too many parameters entered 
) ELSE (
REM check if argument one is empty
if "%1"=="" (
ECHO Enter File Name Your want to edit
SET /P name=
goto echoname
) 
) 

:echoname
ECHO Your Name  is %name%

现在它在显示变量name之前等待输入。


0
投票

我建议这段代码:

@echo off
rem Is there specified more than one argument?
if not "%~2" == "" goto ErrorArgCount
rem Is there specified as second argument just " or just ""?
set SecondArgument=%2
if not defined SecondArgumentgoto CheckFirstArg
set "SecondArgument="

:ErrorArgCount
echo ERROR: Too many parameters used on calling "%~nx0".
echo/
pause
goto :EOF

:CheckFirstArg
setlocal EnableExtensions DisableDelayedExpansion
if not "%~1" == "" set "FileName=%~1" & goto ProcessFile

:Begin
set "FileName="
set /P "FileName=File name: "
rem Has the user entered anything at all?
if not defined FileName goto Begin
rem Remove all double quotes from file name.
set "FileName=%FileName:"=%"
rem Has the user entered anything else than double quotes?
if not defined FileName goto Begin

:ProcessFile
echo Continue "%~nx0" with file "%FileName%" ...
echo/
pause

endlocal

批处理文件首先检查是否使用多个参数调用它。第一个IF条件适用于典型的参数,如Argument2"Argument 2"

但是用户也可以使用参数列表"File Name" "" "third argument"FileName "运行批处理文件,其中第一个IF条件从第二个参数中删除周围的双引号无法检测到空的第二个参数字符串。因此,第二个参数字符串被分配给一个环境变量,如果实际上没有第二个参数字符串,则该变量不再被定义。否则,环境变量SecondArgument使用字符串值"""定义,这会导致第二个IF条件为false,因此会为太多参数运行错误代码。

批处理文件编写的初学者应仔细阅读How does the Windows Command Interpreter (CMD.EXE) parse scripts?

最重要的是要了解cmd.exe如何使用语法%variable%处理环境变量引用,尤其是在以(开头并以)结尾的命令块中立即使用扩展环境变量时。 Windows命令处理器完全解析这样的命令块,在完全使用命令块之前,用引用的环境变量的当前值替换所有%variable%变量引用。命令块通常与命令IF,ELSE和FOR一起使用。必须在命令块内使用delayed expansion引用在命令块内定义或修改的每个环境变量,否则代码将无法按批处理文件的编写者的预期工作。在命令提示符窗口中运行的帮助/文档输出set /?解释了何时以及如何在IF和FOR示例上使用延迟环境变量扩展。

通过使用命令GOTO完成执行分支,以简单的自上而下的方式编写代码,可以避免使用批处理文件写入的好方法来避免命令块。

在命令提示符窗口helphelp startstart /?中运行时可以看到命令START。因此,使用字符串start作为标签是不好的。这是可能的,但这是不可取的,因为与用作标签的start相比,它难以搜索被解释为命令的start。出于这个原因,上面的代码使用Begin作为标签,这不是微软在Windows Commands页面上记录的Windows命令,以及SS64.com - A-Z index of the Windows CMD command line上的SS64甚至更好。

有必要注意提示用户输入set /P,因为用户可以自由输入任何内容,这意味着环境变量仍未定义,并且之前未定义或保持其值已经定义。用户也可以错误地或有意地输入一个字符串,这可能导致执行完全没有写入批处理文件的内容,或者Windows命令处理器退出批处理文件处理,因为用户输入引起的语法错误而不是良好的写入批处理文件码。请阅读我非常详细的How to stop Windows command interpreter from quitting batch file execution on an incorrect user input?的答案

另请参阅single line with multiple commands using Windows batch file以获取上面批处理代码中使用的运算符&的说明,以执行在一个命令行上指定的两个命令。

热门问题
推荐问题
最新问题