Batch file 批处理脚本在if语句处崩溃
我已经对此进行了几个小时的故障排除,但没有成功。我在谷歌上搜索并浏览了许多论坛,但都没有结果。我有一个批量脚本,我正在为我的老板编写,以供我们公司使用。这个目标看起来很简单,并不需要任何过于复杂的技术。我只是想做一个脚本,我们可以运行添加一个exe或脚本到任务调度程序。这部分我已经记下来了。在之前的文本和选项中,我遇到了问题。据我所知,我没有语法错误,但是脚本仍然在if语句上崩溃Batch file 批处理脚本在if语句处崩溃,batch-file,Batch File,我已经对此进行了几个小时的故障排除,但没有成功。我在谷歌上搜索并浏览了许多论坛,但都没有结果。我有一个批量脚本,我正在为我的老板编写,以供我们公司使用。这个目标看起来很简单,并不需要任何过于复杂的技术。我只是想做一个脚本,我们可以运行添加一个exe或脚本到任务调度程序。这部分我已经记下来了。在之前的文本和选项中,我遇到了问题。据我所知,我没有语法错误,但是脚本仍然在if语句上崩溃 @echo off net session 1>nul 2>nul if %errorlevel% =
@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
和(
)之间封闭创建代码
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
之后和标签之前的代码不包含在之间(
和结束)
。这可能允许您查看生成错误的行,并避免使用未启用的延迟扩展,这可能是它崩溃的原因。