我有批处理(cmd)中的以下代码:
for /f "delims=" %%f in ('dir /b /s Example') do (
command
if %errorlevel%==1 (
command
SKIP
)
command
)
修改
为了使事情更清楚:
for /f...
搜索名为“Example”的目录并循环以搜索多于一个目录的目录。
第一个command
是删除命令,它删除目录中的所有文件。
发生错误时发生的command
是echo
命令,它将有关错误的一些信息写入文本文件。
现在是洞skip
的东西;有时,由于access denied
或this file is in use by...
,无法删除文件。通常情况下,如果没有跳过的东西会发生什么,它只会停止命令并挂起。所以,我想做的是防止这种情况发生。或者,我想使用类似skip
的东西,因此它可以跳过该文件并继续。所以我认为这个命令需要在delete
命令中传输。
我希望现在很清楚。
提前致谢。
答案 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
运行批处理文件后,仅剩下file1
和file5
。为遇到的每个写保护文件打印“访问被拒绝”消息;如果这很烦人,你可以重新定位批处理文件的输出,如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,以便您删除所需的文件。当出现错误时,它将简单地回显文件详细信息并继续处理下一个文件。