Если я прав и вы используете драйвер jTDS, вы должны знать, что этот драйвер не обновлялся с 2013 года. Я бы рекомендовал использовать официальный драйвер Microsoft JDBC, хотя он немного медленнее (по крайней мере, это то, что Я измерял в прошлом году).
Для удаления файлов можно сначала попытаться 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
)
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
)
Править: Право, таким образом, 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
Вот мой предпочтительный способ проверки на наличие ошибок при удалении файлов. Мы перенаправляем «вывод ошибок» (стандартный файл «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
)