2014-07-07 6 views
0

Я пытаюсь удалить одно приложение и после удаления хочу очистить некоторые папки. Это команда, которую я использовал для удаления.Проблема с командой/wait в пакетном скрипте

if %errorlevel% == 0 (
start /wait /d "%folder%"\test setup.exe 
FOR /f "delims=" %%a IN (ftp.txt) DO (
    if %errorlevel% == 0 (call :skip) 
) 

:skip 
rd /s /q "%location%" 
rd /s /q "%folder%"\agent 
) 

Вот мой вопрос, я даже отменить удаление еще его удаление папки.

Может кто-нибудь предложить мне, где я делаю неправильно.

Спасибо заранее.

ответ

0

попробовать это изменение:

if %errorlevel% == 0 (
start /wait /d "%folder%"\test setup.exe 
FOR /f "delims=" %%a IN (ftp.txt) DO (
if %errorlevel% == 0 (call :skip)) 
goto done 
:skip 
rd /s /q "%location%" 
rd /s /q "%folder%"\agent) 
:done 
+0

Привет Нефий, Только что проверил не работает. – Honey

+0

ОК, так что ... какова цель цикла for? вы уже знаете, что errorlevel равен 0, если вы используете цикл, и все, что он делает, это проверить, что .... так что он делает? – nephi12

0

Смотрите, если это работает для вас - Если setup.exe возвращает non-zero ErrorLevel, то он будет показывать абсорбцию папки.

start "Title" /wait /d "%folder%\test" setup.exe 
    if not errorlevel 1 (
    rd /s /q "%location%" 
    rd /s /q "%folder%\agent" 
) 
1

Первая проблема: метка в пределах блока (a parenthesised series of statements) завершает блок (это может быть версия-зависимой) Таким образом, команды, следующие метка будет выполняться независимо от того, что результат оставшейся части блока.

Вторая проблема: подпрограмма :skip завершена несбалансированным ). Это может быть безвредным само по себе, но оно не прекратить рутину. call :skip будет продолжать exit или конец файла перед возвратом.

Третья проблема: Внутри оператора блока (a parenthesised series of statements), блок весь разбирается и затем выполняется. Любой %var% в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - ​​то же самое относится к FOR ... DO (block).

Следовательно, IF (something) else (somethingelse) будет выполнен с использованием значений %variables% в момент возникновения ошибки IF.

Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion и использовать !var! вместо %var%, чтобы получить доступ к измененному значению var или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.

Так что - в вашем случае второго if %errorlevel% == 0 будет applt значения errorlevel в момент первого if в фрагменте коды вы показываете нам встречались, не измененное значение в зависимости от обработки.

Следующая проблема заключается в том, что вы excuting в for/f на ftp.txt и появляются ничего не делать с данными, полученными от ftp.txt - %%a не используется вообще в рутине, все это делает попытку call :skip один раз для каждой строки в ftp.txt ,

Так что-

if %errorlevel% == 0 (
start /wait /d "%folder%"\test setup.exe 
if not errorlevel 1 (call :skip) 
) 
goto :eof  


:skip 
rd /s /q "%location%" 
rd /s /q "%folder%"\agent 
goto :eof 

может выполнять работу, при условии, что errorlevel установлено ненулевым, если удаление будет отменено. Обратите внимание, что формат if [not] errorlevel n относится к времени выполнения значения уровня ошибки, тогда как if %errorlevel% == 0 применяется к значению разбора .

Без знания о том, что ftp.txt и %%a должны быть использованы для, я понятия не имею, что делать с ними ...

Смежные вопросы