批处理脚本在if语句时崩溃

时间:2019-03-26 21:42:40

标签: batch-file

我已经对这个问题进行了数小时的故障排除,但没有成功。我已经谷歌搜索并阅读了许多论坛,但都无济于事。我有一个批处理脚本,我正在写给老板使用以供公司使用。目标似乎很简单,并且实际上并不需要任何过于复杂的技术。我只是想制作一个脚本,我们可以运行该脚本以将exe或脚本添加到任务计划程序中。我实际上已经失望了。在出现问题之前,它在文本和选项中。据我所知,我没有语法错误,但是脚本仍然在if语句上崩溃。

@echo off

net session 1>nul 2>nul
if %errorlevel% == 0 goto begin
if %errorlevel% GTR 0 goto eof

:begin
set CREATE_OR_DELETE=CREATE
set TASKNAME=TASK
set SCHEDULE=ONSTART
set TASKRUN=cmd.exe

if "%*"=="" (
goto getinfo
) else (
goto parsetags
)

:getinfo
choice /c CD /n /m "Are you (c)reating or (d)eleting?"
if errorlevel 1 set CREATE_OR_DELETE=CREATE
if errorlevel 2 set CREATE_OR_DELETE=DELETE
cls

set /p TASKNAME="What is the name of the task you're creating/deleting :: "
cls

if not %CREATE_OR_DELETE%==DELETE (
::the code crashes on the above if statement
::that is why I'm dumbfounded
)

:eof

由于与问题无关,我将省略其余的代码。在代码的最后一个if语句中,脚本仅退出而没有任何消息或错误。我根本无法让脚本通过if语句。我已经尝试了几乎所有可以想到的变体。引号,大写字母,空格,空的新行,几乎是我查找或想到的所有内容。没事。请不要用力抨击我,因为批处理对我来说还很陌生,我通常会使用其他语言。

--------------------编辑--------------------

对于这段代码的长度/复杂度,我深表歉意。我只包括了之前的代码行,因为脚本崩溃在没有语法错误的行上,这使我相信之前的行中可能存在一些复杂性,但这不一定是错误的,但我不知道的。另外请记住,只有当我实际上在上面有代码的机器上时,我才会应用更改。

1 个答案:

答案 0 :(得分:0)

@echo on
@setlocal
@set "prompt=--$G "

set "CREATE_OR_DELETE=CREATE"
for %%A in (:test1 :test2) do call %%A
goto :eof


:test1
rem *** Test 1 ***

if %CREATE_OR_DELETE%==DELETE goto :label
set "var=1"
if %var%==%CREATE_OR_DELETE% echo OK
set "var="
:label
goto :eof


:test2
rem *** Test 2 ***

if %CREATE_OR_DELETE%==DELETE (
    set "var=1"
    if %var%==%CREATE_OR_DELETE% echo OK
    set "var="
)
goto :eof

此示例可能显示您发现的问题。

标签:test1使用goto :label的想法来避免代码 在()之间进行一次解析。这有好处 分别解析的每个命令,因此您可以检测到错误 更容易。它还可以避免延迟时出现的变量扩展问题 扩展可能需要启用。

标签:test2使用的是()之间的代码。这引起 由于延迟扩展,未定义为%var%的解析错误 未启用。错误描述可能无意义 使用什么代码。

总而言之,在()之间有很多命令可能是有效的, 尽管调试起来可能不同。


这是您的代码,可能会有一些更改。

@echo off

net session 1>nul 2>nul || goto :eof

:begin
set "CREATE_OR_DELETE=CREATE"
set "TASKNAME=TASK"
set "SCHEDULE=ONSTART"
set "TASKRUN=cmd.exe"
set ALLARGS=%*

if not defined ALLARGS (
    goto getinfo
) else (
    goto parsetags
)

:getinfo
choice /c CD /n /m "Are you (c)reating or (d)eleting?"
:: "obsolete as already set" if errorlevel 1 set CREATE_OR_DELETE=CREATE
if errorlevel 2 set "CREATE_OR_DELETE=DELETE"
cls

set /p "TASKNAME=What is the name of the task you're creating/deleting :: "
cls

if "%CREATE_OR_DELETE%" == "DELETE" goto :skip_create
::the code crashes on the above if statement
::that is why I'm dumbfounded

:skip_create
  • 双引号引用了许多set命令。
  • ALLARGS已测试(如果已定义),而不是直接处理可能有风险的%*
  • 已删除标签:eof,因为它不需要插入。 goto知道它代表文件结束。
  • 在已对errorlevel 1进行注释后,
  • choice进行检查,因为您已经分配了它。
  • goto :skip_create已添加,以避免将创建代码放在()之间。