2009-12-27 74 views
4

我有一批下面的代码(CMD):跳过当错误发生时

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

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

我希望现在很清楚。

在此先感谢。

+0

调用dir是非常愚蠢的,因为可以为你走一个目录树 – Anders 2009-12-27 21:31:18

+1

请更好地解释你需要什么。我尝试用我的答案猜测你的意图,但显然没有成功。那么,“跳过”是什么意思?也许你可以在该目录结构上提供一个示例目录结构和批处理脚本的预期行为。 – atzz 2009-12-28 11:00:56

+1

您对“跳过”一词的使用非常模糊。 – Alan 2010-01-04 19:32:14

回答

3

是否这样?

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

或者:'command &&(success)|| (error)' – Joey 2009-12-27 19:24:27

+0

@Johannes - 哇,我不知道“||”!看起来像一个简洁的方式来写短的选择。 – atzz 2009-12-27 20:19:50

+0

这并不是我想要的。我想让它跳过它,然后继续。该命令执行什么操作,它会查找“示例”,然后删除该目录中的所有内容。问题是你不能很容易'跳过'它。 – 2009-12-28 10:09:35

0

我相信这是你想要

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

这和@atzz一样,再次阅读评论,我不喜欢那种东西。 – 2010-01-03 18:58:49

+2

这是我尝试了解“skip”意思的最佳尝试。努力改进你的解释,因为如果你不这样做,你就会怀疑你真正重视的数量是否是一个好答案。你对获得理解的兴趣缺乏兴趣只能与你的无礼相抗衡。 – 2010-01-04 16:12:28

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 
+0

我认为这个可以改进,以便在给定的超时后关闭所有'悬挂'窗口。为'开始'命令添加一个特殊的窗口标题。使用http://malektips.com/dos0017.html来模拟一个“等待”命令(例如,等待10秒后),并使用taskkill/fi“Windowtitle eq ”来终止所有挂起的窗口。 – 2010-01-07 07:28:09

+0

伟大的建议Doc - 它的作品! – fupsduck 2010-01-07 11:36:23

+0

+1让我的额外建议工作! – 2010-01-07 11:56:01

0

也许这是更先进的比使用刚刚建成,在cmd中处理来完成。为什么不考虑使用Windows脚本宿主(vbscript/jscript)甚至PowerShell?两者都可能为您提供您所要求的控制级别。

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" 
    ) 
) 
+0

但它不会跳过,是吗? – 2010-01-04 15:09:46

+0

我尝试了3个文件在一个目录'Example'中,一个写保护,两个正在使用,我得到3次“文件未被删除”。如果这不是'skip'的意思,请给出一个更好的例子或解释。 – 2010-01-04 15:42:04

+0

+1您的建议。 – fupsduck 2010-01-07 11:37:08

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以隐藏它。

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跳转到文件的末尾(此标记在批处理模式预定义的,应不会发生在你的文件中),什么离开了上下文并返回到for循环。

经过整个循环后,我们跳转到:end标记,稍作清理并完成。

0

下面的外观为您递归希望“目录名称”目录树下,针对该文件名执行commandstuff.bat的文件扩展:

用于/ R%我在(C:\目录名\ *。 .EXT)做 commandstuff “%I”

Commandstuff.bat看起来是这样的:

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

:END
回声端

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