Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 之后立即再次运行批处理脚本时出错_Batch File - Fatal编程技术网

Batch file 之后立即再次运行批处理脚本时出错

Batch file 之后立即再次运行批处理脚本时出错,batch-file,Batch File,我正在为班上的第六个作业编写一个批处理脚本,当我差不多完成时遇到了一个障碍。(我们通常关注bash脚本,所以我对批处理还不熟悉) 第一次运行脚本时,脚本会按需要运行;但在第二次运行时,其行为会有所不同 本质上,脚本检查参数的值(如果存在),并根据该值运行特定代码。例如,如果参数为“1”,那么它会检查路径变量以查找目录,如果它不存在,则会创建它;如果它确实存在,则不会发生任何事情,只会继续脚本 在修改路径后再次运行脚本时会出现此问题。我收到输出“\Common此时不应出现” 在第一次运行脚本时,我

我正在为班上的第六个作业编写一个批处理脚本,当我差不多完成时遇到了一个障碍。(我们通常关注bash脚本,所以我对批处理还不熟悉)

第一次运行脚本时,脚本会按需要运行;但在第二次运行时,其行为会有所不同

本质上,脚本检查参数的值(如果存在),并根据该值运行特定代码。例如,如果参数为“1”,那么它会检查路径变量以查找目录,如果它不存在,则会创建它;如果它确实存在,则不会发生任何事情,只会继续脚本

在修改路径后再次运行脚本时会出现此问题。我收到输出“\Common此时不应出现”

在第一次运行脚本时,我遇到了类似的问题,但通过在IF语句的求值两侧添加引号,我成功地解决了这个问题,但现在我不确定在哪里继续

我的代码如下:

@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" (
有关如何计算批处理文件参数的更多详细信息,请参见上的回答

将文件夹路径附加到本地路径 环境变量
PATH
包含一组文件夹路径,其中列表分隔符是分号而不是逗号

<> p> > <代码>;<代码>结尾的代码>路径> />代码,这意味着有一个文件夹路径是空文件夹路径。可以在“代码>路径
的中间或结尾指定一个空的文件夹路径,但是这样做是不好的做法,因为<代码>路径<代码>不应该包含空的文件夹路径。 因此,代码中的以下命令行不好:

if errorlevel 1 SET "PATH=%PATH%%cd%\App0;"
如果
路径
尚未以分号结尾,则也会缺少
,这可能是第二次执行批处理文件时出现错误消息的原因

更好的代码可以在下面完全修改的批处理文件代码中看到

引用当前目录 可以使用
%CD%
引用当前目录,这可能不同于使用
%~dp0
引用的批处理文件目录
%~dp0
引用参数0的驱动器和路径(即批处理文件本身)。使用
%~dp0
引用的批处理文件路径字符串始终以反斜杠结尾。因此,no在将其与文件/文件夹名称连接时,应在
%~dp0
之后使用额外的反斜杠

动态环境变量
CD
的结尾通常没有反斜杠。因此,在大多数情况下,
%CD%
必须与另一个带有文件/文件夹名的
\
连接起来。但在批处理文件中使用
%CD%
时必须考虑一个例外情况:
%CD%
扩展为带当前目录末尾的
\
是驱动器的根目录,例如
C:\
D:\
。因此,在附加文件/文件夹名之前,始终需要使用
%CD%
检查字符串是否以反斜杠结尾,而不附加反斜杠或附加反斜杠

其他建议 使用以
开头的命令块(
结尾)使用在命令块中定义/修改并在命令块中引用的环境变量时应避免使用
,因为这需要在命令提示符窗口中运行
set/?
(如果IF)和FOR示例(其中使用了命令块)时使用通常情况下,Windows命令处理器主要用于执行一个又一个命令行。在某些情况下,使用命令块可以加快批处理文件的执行速度,但在许多情况下,最好避免使用命令块

有关如何调试批处理文件的简短说明,请参阅。单步执行实际上不可能。但是
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
时使用