如何在del失败时停止批处理脚本

时间:2009-02-18 13:02:52

标签: batch-file

我们有一个删除文件(del)和目录(rd)的批处理脚本。如果这些删除语句中的任何一个失败,有没有人知道如何暂停(失败)脚本的执行?如果文件/目录被Windows锁定,它们可能会失败。感谢。

更新

我正在使用的陈述:

Del:del *.* /S /Q

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

10 个答案:

答案 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 DELWindows 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命令中测试过的:

  • 成功删除所有文件:0(当然)
  • 删除了一些文件,缺少一些文件:0(直觉预期为1)
  • 由于没有许可或只读介质而导致删除失败:0(直觉预期≥1)
  • 不存在的驱动器或驱动器未就绪(例如CD-ROM驱动器上没有CD): 1(是的,你得到它,但我会期望更高的错误代码)
  • 路径无效: 1(我预计会有更高的错误代码)

并且,如果您指定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)

对于rdrmdir,您可以

rd "some directory" || rem

这将正确设置错误级别 - see

答案 9 :(得分:-2)

嗨这应该也适用

@echo off  

for /f %%i in ('del notepad2.exe 2^>^&1') do set ERRORLEVEL=1
IF %ERRORLEVEL%=1 then exit