我已经对这个问题进行了数小时的故障排除,但没有成功。我已经谷歌搜索并阅读了许多论坛,但都无济于事。我有一个批处理脚本,我正在写给老板使用以供公司使用。目标似乎很简单,并且实际上并不需要任何过于复杂的技术。我只是想制作一个脚本,我们可以运行该脚本以将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语句。我已经尝试了几乎所有可以想到的变体。引号,大写字母,空格,空的新行,几乎是我查找或想到的所有内容。没事。请不要用力抨击我,因为批处理对我来说还很陌生,我通常会使用其他语言。
--------------------编辑--------------------
对于这段代码的长度/复杂度,我深表歉意。我只包括了之前的代码行,因为脚本崩溃在没有语法错误的行上,这使我相信之前的行中可能存在一些复杂性,但这不一定是错误的,但我不知道的。另外请记住,只有当我实际上在上面有代码的机器上时,我才会应用更改。
答案 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
ALLARGS
已测试(如果已定义),而不是直接处理可能有风险的%*
。:eof
,因为它不需要插入。
goto
知道它代表文件结束。errorlevel 1
进行注释后,choice
进行检查,因为您已经分配了它。goto :skip_create
已添加,以避免将创建代码放在(
和)
之间。