Batch file 之后立即再次运行批处理脚本时出错
我正在为班上的第六个作业编写一个批处理脚本,当我差不多完成时遇到了一个障碍。(我们通常关注bash脚本,所以我对批处理还不熟悉) 第一次运行脚本时,脚本会按需要运行;但在第二次运行时,其行为会有所不同 本质上,脚本检查参数的值(如果存在),并根据该值运行特定代码。例如,如果参数为“1”,那么它会检查路径变量以查找目录,如果它不存在,则会创建它;如果它确实存在,则不会发生任何事情,只会继续脚本 在修改路径后再次运行脚本时会出现此问题。我收到输出“\Common此时不应出现” 在第一次运行脚本时,我遇到了类似的问题,但通过在IF语句的求值两侧添加引号,我成功地解决了这个问题,但现在我不确定在哪里继续 我的代码如下:Batch file 之后立即再次运行批处理脚本时出错,batch-file,Batch File,我正在为班上的第六个作业编写一个批处理脚本,当我差不多完成时遇到了一个障碍。(我们通常关注bash脚本,所以我对批处理还不熟悉) 第一次运行脚本时,脚本会按需要运行;但在第二次运行时,其行为会有所不同 本质上,脚本检查参数的值(如果存在),并根据该值运行特定代码。例如,如果参数为“1”,那么它会检查路径变量以查找目录,如果它不存在,则会创建它;如果它确实存在,则不会发生任何事情,只会继续脚本 在修改路径后再次运行脚本时会出现此问题。我收到输出“\Common此时不应出现” 在第一次运行脚本时,我
@echo on
IF "%1%" == "0" (
SET "VAR1=%path%"
echo.%VAR1%|findstr /C:"App0" >nul 2>&1
if errorlevel 1 SET "PATH=%PATH%%cd%\App0;"
if not errorlevel 1 echo Found
goto errorBypass
) ELSE IF "%1%" == "1" (
SET "VAR2=%path%"
ECHO %VAR2%
echo.%VAR2%|findstr /C:"App1" >nul 2>&1
if errorlevel 1 SET "PATH=%PATH%%cd%\App1;"
if not errorlevel 1 echo Found
goto errorBypass
) ELSE IF "%1%" == "" (
IF "%HUMBER_HOME%" == "" (
goto Error2
) ELSE (
CALL "HUMBER_HOME\bin\setEnv.bat"
goto errorBypass
)
)
echo HERE
:Error2
echo Error2
:errorBypass
call "run.bat"
另外,我知道,为了将来的参考,有没有一种逐行调试的有效方法?或者一个可以输出错误发生的特定行的命令?当一个错误可能由不同位置的多个问题引起时,我发现有点困难。引用批处理文件参数
打开命令提示窗口并运行call/?
。输出帮助说明如何引用批处理文件参数<代码>%1引用传递给批处理文件的第一个参数。例如,可以是1
(不带引号的参数字符串),也可以是“1”
(带引号的参数字符串)<代码>%~1引用第一个参数字符串,并删除其周围的双引号
在参数引用之后再添加一个%
是错误的。语法%variable%
用于引用环境变量的字符串值。批处理文件参数仅用百分号和数字引用,不带或中间带修饰符。数字后不再有百分号。这也是为什么1
,2
,3
。。。不能作为环境变量的名称
因此,如果“%1%”==“0”(),则不好,因为这可能导致在执行命令行时以
的中间或结尾指定一个空的文件夹路径,但是这样做是不好的做法,因为<代码>路径<代码>不应该包含空的文件夹路径。 因此,代码中的以下命令行不好:作为第一个参数调用批处理文件:“1”
IF ""1"" == "0" (
更好的语法是IF "1" == "0" (
这会导致命令行的执行:如果“%~1”==“0”(
IF ""1"" == "0" (
有关如何计算批处理文件参数的更多详细信息,请参见上的回答 将文件夹路径附加到本地路径 环境变量IF "1" == "0" (
包含一组文件夹路径,其中列表分隔符是分号而不是逗号 <> p> > <代码>;<代码>结尾的代码>路径> />代码,这意味着有一个文件夹路径是空文件夹路径。可以在“代码>路径PATH
如果if errorlevel 1 SET "PATH=%PATH%%cd%\App0;"
尚未以分号结尾,则也会缺少路径
,这可能是第二次执行批处理文件时出现错误消息的原因 更好的代码可以在下面完全修改的批处理文件代码中看到 引用当前目录 可以使用;
引用当前目录,这可能不同于使用%CD%
引用的批处理文件目录%~dp0
引用参数0的驱动器和路径(即批处理文件本身)。使用%~dp0
引用的批处理文件路径字符串始终以反斜杠结尾。因此,no在将其与文件/文件夹名称连接时,应在%~dp0
之后使用额外的反斜杠 动态环境变量%~dp0
的结尾通常没有反斜杠。因此,在大多数情况下,CD
必须与另一个带有文件/文件夹名的%CD%
连接起来。但在批处理文件中使用\
时必须考虑一个例外情况:%CD%
扩展为带当前目录末尾的%CD%
是驱动器的根目录,例如\
或C:\
。因此,在附加文件/文件夹名之前,始终需要使用D:\
检查字符串是否以反斜杠结尾,而不附加反斜杠或附加反斜杠 其他建议 使用以%CD%
以开头的命令块(
,因为这需要在命令提示符窗口中运行结尾)使用在命令块中定义/修改并在命令块中引用的环境变量时应避免使用
(如果IF)和FOR示例(其中使用了命令块)时使用通常情况下,Windows命令处理器主要用于执行一个又一个命令行。在某些情况下,使用命令块可以加快批处理文件的执行速度,但在许多情况下,最好避免使用命令块 有关如何调试批处理文件的简短说明,请参阅。单步执行实际上不可能。但是set/?
显示了导致退出批处理文件执行的错误发生在哪一行或命令块上,以及错误是什么 修订批处理文件代码 以下是修改后的批处理文件代码:cmd.exe
在批处理文件的顶部定义了子例程@echo off goto Main :AddPath echo %PATH%;|%SystemRoot%\System32\findstr.exe /I /C:"\%~1;" >nul 2>&1 if not errorlevel 1 echo Found %~1 in PATH& goto :EOF set "Separator=;" if "%PATH:~-1%" == ";" set "Separator=" if "%CD:~-1%" == "\" (set "AppPath=%CD%%~1") else set "AppPath=%CD%\%~1" set "PATH=%PATH%%Separator%%AppPath%" set "AppPath=" set "Separator=" goto :EOF :Main if "%~1" == "0" call :AddPath App0 & goto errorBypass if "%~1" == "1" call :AddPath App1 & goto errorBypass if not "%~1" == "" goto RunApp if "%HUMBER_HOME%" == "" goto Error2 if exist "%HUMBER_HOME%\bin\setEnv.bat" ( call "%HUMBER_HOME%\bin\setEnv.bat" goto errorBypass ) echo File "setEnv.bat" in subdirectory "bin" in directory echo defined by environment variable HUMBER_HOME not found. echo HUMBER_HOME directory: "%HUMBER_HOME%" echo/ pause goto :EOF :RunApp echo HERE goto :EOF :Error2 echo Error2 goto :EOF :errorBypass if exist "run.bat" call "run.bat"
,这有点不寻常。因此AddPath
的第二行导致在开始执行批处理文件时跳过子例程的代码 调用子例程goto Main
时使用AddPath