我们有一个删除文件(del
)和目录(rd
)的批处理脚本。如果这些删除语句中的任何一个失败,有没有人知道如何暂停(失败)脚本的执行?如果文件/目录被Windows锁定,它们可能会失败。感谢。
更新
我正在使用的陈述:
Del:del *.* /S /Q
RD:FOR /D %%G in (*) DO RD /s /q %%G
答案 0 :(得分:12)
要删除文件,您可以先尝试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
)
答案 1 :(得分:6)
如果文件被锁定,DEL不会返回错误级别。我刚用excel文件做了测试,我看到了零(在Windows XP上)。
在执行删除操作后,最好使用IF EXIST删除文件。
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
)
答案 2 :(得分:3)
编辑:是的,因此del
未正确设置ERRORLEVEL
。请参阅ERRORLEVEL on DEL和Windows delete command can fail silently
上一个(不正确)解决方案
您应该查看errorlevel
。
例如:
del file.txt
if errorlevel 1 goto FAIL
:PASS
echo Worked!
goto :END
:FAIL
echo Failed!
exit /B 1
:END
答案 3 :(得分:1)
这是我删除文件时检查错误的首选方法。我们将“错误输出”(标准文件“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
)
答案 4 :(得分:1)
以下是结果监控变体的较短版本。这是使用2>&1
技巧将stderr重定向到stdout和for /f
以检查是否有任何输出。
@echo off
setlocal
set error=0
for /f %%i in ('del notepad2.exe 2^>^&1') do set error=1
echo %error%
答案 5 :(得分:1)
仅供参考。如果发生严重错误,DEL命令会返回错误代码,但是它的行为超出了我们的直觉,人们只会认为错误代码根本不起作用。
这是我在Windows 7中的DEL命令中测试过的:
并且,如果您指定DEL命令的文件列表,其中至少有一个文件符合上面提到的最后两种错误,那么列表中的所有文件都不会被删除< / em>的
答案 6 :(得分:0)
有一个脚本可以像魅力一样工作。 它通过测试所谓的已删除文件/目录的存在来测试删除失败。
输出将是一个内容完全为空的现有c:\ mydirectory。 任何错误都会破坏流程并报告。
唯一的缺点是递归删除目录,因为没有简单的方法可以从最“子”目录开始删除目录。
@echo OFF
set path_to_clean=c:\mydirectory
@echo -Deleting Files
dir /A-D /S /B %path_to_clean%\* > fileslist.txt
for /F %%F in (fileslist.txt) do (
@echo Deleting %%F
del %%F 2> nul
if exist %%F (
@echo Cannot delete %%F, it is locked.
goto errorhandling
)
)
del fileslist.txt
@echo -Deleting Files done
@echo -Deleting Directories
dir /AD /B %path_to_clean%\* > directorieslist.txt
for /F %%D in (directorieslist.txt) do (
@echo Deleting %path_to_clean%\%%D
rmdir /S /Q %path_to_clean%\%%D 2> nul
if exist %path_to_clean%\%%D (
@echo Cannot delete %path_to_clean%\%%D. This folder or one of its sub-directories is locked.
goto errorhandling
)
)
del directorieslist.txt
@echo -Deleting Directories done
:errorhandling
rem some code here
答案 7 :(得分:0)
这些似乎对我有用:
RD:
FOR /D %d IN (*) DO ( RD /S /Q "%d" & IF EXIST "%d" EXIT /B 1 )
DEL:
FOR %f IN (*.*) DO ( DEL /Q "%f" & IF EXIST "%f" EXIT /B 1 )
不知道表现如何。
您可以将“标记/ F”添加到DEL以进行“强制删除”模式。
答案 8 :(得分:-1)
答案 9 :(得分:-2)
嗨这应该也适用
@echo off
for /f %%i in ('del notepad2.exe 2^>^&1') do set ERRORLEVEL=1
IF %ERRORLEVEL%=1 then exit