Как остановить сценарий пакетной обработки при del отказе

Если я прав и вы используете драйвер jTDS, вы должны знать, что этот драйвер не обновлялся с 2013 года. Я бы рекомендовал использовать официальный драйвер Microsoft JDBC, хотя он немного медленнее (по крайней мере, это то, что Я измерял в прошлом году).

10
задан Simon Kissane 12 November 2018 в 16:49
поделиться

4 ответа

Для удаления файлов можно сначала попытаться ren (переименуйте) файл. ren установит ERRORLEVEL на 1, если файл будет заблокирован. Добавьте кавычки вокруг имени файла.

@echo OFF

:: Delete all files, but exit if a file is locked.
for %%F in (*.*) do (
    @echo Deleting %%F
    ren "%%F" tmp 2> nul
    if ERRORLEVEL 1 (
        @echo Cannot delete %%F, it is locked.
        exit /b 1
    )
    del tmp
)

Я подозреваю, что Вы можете делать то же самое для каталогов, но я, может казаться, не выясняю, как заблокировать каталог, таким образом, я могу протестировать. Следующее может работать:

:: Remove all directories, but exit if one is locked.
FOR /D %%G in (*) DO (
    @echo Removing %%G
    ren "%%G" tmpdir 2> nul
    if ERRORLEVEL 1 (
        @echo Cannot remove %%G, it is locked
        exit /b 1
    )
    RD /s /q tmpdir
)
13
ответ дан 3 December 2019 в 17:22
поделиться

DEL не возвращает errorlevel, если файл заблокирован. Я просто сделал тест с файлом Excel, и я видел нуль (на Windows XP).

Могло бы быть лучше использовать, ЕСЛИ СУЩЕСТВУЮТ, чтобы файл был удален после того, как Вы делаете удаление.

del file.txt
if exist file.txt ECHO "FAIL"

ПОСЛЕ Правовой оговорки РЕДАКТИРОВАНИЯ: Я понятия не имею, как это работает...

Вы могли сделать это для файлов

DIR /B /S /A-d > c:\filestodelete.txt

del *.* /S /Q    

FOR /F %%i in (c:\filestodelete.txt) DO (
    IF EXIST %%i ECHO %%i STILL EXISTS
)

затем для каталогов

DIR /B /S /Ad > c:\directoriestodelete.txt

FOR /D %%G in (*) DO RD /s /q %%G    

FOR /F %%i in (c:\directoriestodelete.txt) DO (
    IF EXIST %%i ECHO %%i STILL EXISTS
)
7
ответ дан 3 December 2019 в 17:22
поделиться

Править: Право, таким образом, del не устанавливает ERRORLEVEL правильно. См., что ERRORLEVEL на DEL и Windows удаляют команду, может перестать работать тихо

ПРЕДЫДУЩЕЕ (неправильное) РЕШЕНИЕ

Необходимо проверить errorlevel.

Например:

del file.txt
if errorlevel 1 goto FAIL
:PASS
echo Worked!
goto :END

:FAIL
echo Failed!
exit /B 1

:END
3
ответ дан 3 December 2019 в 17:22
поделиться

Вот мой предпочтительный способ проверки на наличие ошибок при удалении файлов. Мы перенаправляем «вывод ошибок» (стандартный файл «2») в файл (например, delCmd.err). Затем мы используем команду FOR как способ получить доступ к оператору "размер файла" ~ z. Если размер выходного файла не равен 0, тогда мы знаем, что "del" получил ошибку ... мы отображаем ошибку с помощью команды "type" и выходим из командного файла с ненулевым кодом ошибки:

del unwanted.txt 2> delCmd.err
FOR /F "usebackq" %%A IN ('delCmd.err') DO set size=%%~zA
if not "%size%"=="0" (
    echo Error deleting unwanted.txt
    type delCmd.err
    exit /B 1
)
1
ответ дан 3 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: