Сбой пакетного скрипта в операторе if - PullRequest
0 голосов
/ 27 марта 2019

Я часами устранял неисправности, но безуспешно. Я погуглил и прочитал многочисленные форумы, а также безрезультатно. У меня есть пакетный скрипт, который я писал для моего босса, чтобы использовать его для нашей компании. Цель казалась достаточно простой и не требовала каких-либо чрезмерно сложных приемов. Я просто хотел сделать скрипт, который мы могли бы запустить, чтобы добавить 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 вообще. Я попробовал почти все варианты, которые я могу придумать. Цитаты, заглавные буквы, пробелы, пустые новые строки, буквально все, что я искал или думал. Ничего не сработало. Пожалуйста, не бей меня слишком сильно, так как партия довольно нова для меня, я обычно использую другие языки.

-------------------- РЕДАКТИРОВАТЬ --------------------

Я прошу прощения за длину / сложность этого кода. Я включил только строки кода before, потому что скрипт рушится в строке, в которой нет синтаксических ошибок, что заставляет меня поверить, что в строках может быть некоторая запутанность, но это не обязательно неправильно, но я не в курсе из. Также имейте в виду, что я буду применять изменения, только когда я нахожусь на машине с кодом на ней.

1 Ответ

0 голосов
/ 27 марта 2019
@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 добавлено, чтобы избежать включения кода создания между( и ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...