Batch file 批处理脚本在if语句处崩溃

Batch file 批处理脚本在if语句处崩溃,batch-file,Batch File,我已经对此进行了几个小时的故障排除,但没有成功。我在谷歌上搜索并浏览了许多论坛,但都没有结果。我有一个批量脚本,我正在为我的老板编写,以供我们公司使用。这个目标看起来很简单,并不需要任何过于复杂的技术。我只是想做一个脚本,我们可以运行添加一个exe或脚本到任务调度程序。这部分我已经记下来了。在之前的文本和选项中,我遇到了问题。据我所知,我没有语法错误,但是脚本仍然在if语句上崩溃 @echo off net session 1>nul 2>nul if %errorlevel% =

我已经对此进行了几个小时的故障排除,但没有成功。我在谷歌上搜索并浏览了许多论坛,但都没有结果。我有一个批量脚本,我正在为我的老板编写,以供我们公司使用。这个目标看起来很简单,并不需要任何过于复杂的技术。我只是想做一个脚本,我们可以运行添加一个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语句。我尝试了我能想到的每一种变化。引号、大写字母、空格、空的新行,我查到或想到的任何东西。什么都没起作用。请不要对我太苛刻,因为批处理对我来说是相当新的,我通常使用其他语言

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

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

@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
    添加,以避免在
    )之间封闭创建代码

我们是否可以简化问题,找出导致问题的原因Devon?此代码无效:
set/p TASKNAME/n/m
如果ErrorLevel 1
表示ErrorLevel大于或等于1,则这两种选择都是正确的;因此,在这个特定实例中,如果ErrorLevel 2首先…@aschipfl,则代码不需要从高到低。如果此人回答D,则errorlevel设置为2,并为变量分配
DELETE
。是,它触发两个IF命令为true,但它仍然正确设置变量。立即解析关闭的
IF
。因此,您的错误可能不是由
引起的,如果不是%CREATE\u或\u DELETE%==DELETE(
),而是由
和结束
之间的任何无效语法引起的
。如果%CREATE\u或\u DELETE%==DELETE goto:CREATE,建议您使用
,这允许
goto
之后和标签之前的代码不包含在
之间(
和结束
。这可能允许您查看生成错误的行,并避免使用未启用的延迟扩展,这可能是它崩溃的原因。