发生错误时跳过

时间:2009-12-27 18:37:24

标签: windows batch-file cmd skip

我有批处理(cmd)中的以下代码:

for /f "delims=" %%f in ('dir /b /s Example') do (
command
if %errorlevel%==1 (
command
SKIP
)
command
)

修改 为了使事情更清楚: for /f...搜索名为“Example”的目录并循环以搜索多于一个目录的目录。 第一个command是删除命令,它删除目录中的所有文件。 发生错误时发生的commandecho命令,它将有关错误的一些信息写入文本文件。 现在是洞skip的东西;有时,由于access deniedthis file is in use by...,无法删除文件。通常情况下,如果没有跳过的东西会发生什么,它只会停止命令并挂起。所以,我想做的是防止这种情况发生。或者,我想使用类似skip的东西,因此它可以跳过该文件并继续。所以我认为这个命令需要在delete命令中传输。

我希望现在很清楚。

提前致谢。

8 个答案:

答案 0 :(得分:3)

喜欢这个吗?

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command-for-success
  ) else (
    command-for-error
  )
)

答案 1 :(得分:2)

创建两个命令文件并运行delex.cmd。未删除的文件和目录将记录到delex.txt。那些挂起的,会有一个最小化的cmd窗口打开,在使用ping后延迟被杀死(感谢Doc Brown的建议)。

delex2.cmd
----------
@echo off
del /q %1 
if exist %1 echo %1 not deleted!>>delex.txt 
exit 

delex.cmd
---------
@echo off
if exist delex.txt del delex.txt 
for /f "delims=" %%f in ('dir /s /b example') do start "delextaskkill" /min delex2.cmd "%%f"
ping 127.0.0.1 -n 3 -w 1000> nul
taskkill /fi "Windowtitle eq delextaskkill"> nul

经过测试:

\example
|   file1
|   file2
|   file3
|   file4
|   file5
|
\---example
        file1
        file2
        file3
        file4
        file5

答案 2 :(得分:1)

当一个人使用del,并且“访问被拒绝”或“此文件正在被......使用”时,%errorlevel%为0,因此测试%errolevel%是无用的。也许以下简单的解决方案适用于您的情况:

for /f "delims=" %%f in ('dir /b /s Example') do (
    del %%f
    if exist %%f (
         echo "file not deleted"
    ) else (
         echo "file deleted"
    )
 ) 

答案 3 :(得分:0)

我相信这就是你想要的

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command
  ) else (
    command
    goto :eof
  )
)

答案 4 :(得分:0)

也许这比仅使用内置cmd处理可以实现的更先进。为什么不考虑使用Windows Scripting Host(vbscript / jscript)甚至是PowerShell?两者都可能为您提供您所要求的控制级别。

答案 5 :(得分:0)

试试这个批处理文件:

@echo off
REM For each directory named 'Example' ...
for /f "delims=" %%f in ('dir /b /s Example') do (
    REM .. enter the directory and delete all the files found there.
    pushd .
    cd %%f
    del /q *
    for /f "delims=" %%z in ('dir /b') do (
        REM Any files that still exist must have been inaccessable.  Log an error.
        echo Unable to delete file %%z > C:\logfile.txt
    )
    popd
)

使用以下目录结构进行测试:

folder\
|------Example\
|      |-------file1 (write-protected)
|      |-------file2
|      |-------file3
|------deeper\
       |-------Example\
               |-------file4
               |-------file5 (write-protected)
               |-------file6

运行批处理文件后,仅剩下file1file5。为遇到的每个写保护文件打印“访问被拒绝”消息;如果这很烦人,你可以重新定位批处理文件的输出,如script.bat > NUL来隐藏它。

答案 6 :(得分:0)

因此,在所有现有答案都不能满足您并且您绝对需要在批处理文件中跳过之后,我将再次尝试:

@echo off
setlocal

for /f "delims=" %%f in ('dir /b /s batch') do call :DoSomething %%f
goto end

:DoSomething
echo Here i am: %1
if %errorlevel%==1 goto :eof

echo No error occured
goto :eof

:end
endlocal

诀窍是,for循环调用同一文件中的子函数并为其提供所需的参数。此新调用在新上下文中运行,并且只能访问在给定顺序中do call :DoSomething之后定义的变量。

所以你必须使用%1%2等来访问这里的变量。如果你想离开这个上下文,你必须让goto :eof跳到结尾。 file(此标记在批处理模式下预定义,不应出现在您的文件中),什么离开上下文并返回到for循环。

在完成整个循环之后,我们只需跳转到:end标记,进行一些清理并完成。

答案 7 :(得分:0)

以下内容在“dirname”目录树下查找您想要递归的文件扩展名,并针对该文件名执行commandstuff.bat:

  

for / r%i in(c:\ dirname \ * .ext)do   命令“%i”

Commandstuff.bat 如下所示:

  

@ECHO OFF
del%1
IF(%ERRORLEVEL%==   0)转到END   
  :ERROR
回显错误删除%1
  
  :结束回声结束

这将运行commandstuff.bat,以便您删除所需的文件。当出现错误时,它将简单地回显文件详细信息并继续处理下一个文件。