比较目录名与字符串

时间:2013-05-29 17:05:59

标签: recursion batch-file

为了测试我希望使用的概念,我创建了这个非常简单的批处理文件。我需要递归删除所有类型的文件,除了具有特定名称的文件夹。这是我的代码:

:recur
FOR /f %%a IN ('DIR /b') DO (
IF EXIST %%a\NUL (
    IF ["%%a" NEQ "subtest2"] (
        ECHO %%a
        CD %%a
        CALL :recur
        CD ..
    )
)
COPY "*.cfm" "*_copy.cfm"
REM DEL "*_copy*.cfm"
)

现在我只是使用copy而不是delete进行测试。基本上,这应该创建所有.cfm文件的副本,但文件夹“subtest2”除外。现在,它递归地复制到各处,包括subtest2。我该如何阻止它?

我的基本目录的结构是:

TestFolder
--- subtest1
------
检验.pdf ------ test.txt的
------ test.cfm
--- subtest2
------
检验.pdf ------ test.txt的
------ test.cfm
---
检验.pdf --- test.txt的
--- test.cfm
--- recur.bat

3 个答案:

答案 0 :(得分:2)

方括号在IF比较的两侧不平衡,因此它永远不会匹配。括号不是IF语法的一部分。如果存在,它们只是成为比较字符串的一部分。任何封闭的报价都是如此。删除方括号,它将起作用(假设没有其他问题)

这是实现目标的简单方法。为了测试目的,我已将DEL命令与ECHO作为前缀:

for /r /d %%F in (*) do echo %%F\|findstr /liv "\\subtest2\\" >nul && echo del "%%F\*.cfm"

FOR / R / D只是简单地递归所有文件夹。每个文件夹的完整路径通过管道传输到FINDSTR命令,该命令查找不包含\ subtest2文件夹的路径。只有在路径中找不到\ subtest2 \文件夹时才会执行ECHO DEL命令。

确认命令后,删除最后一个ECHO,得到正确的结果。

如果要在命令行而不是批处理文件中运行命令,请将%%F更改为%F

答案 1 :(得分:1)

for f in `find . -path YOURDIR -prune -o print`
  do
    rm whateveryouwanttodelete
  done

反引号中的find命令查找所有文件但忽略了要忽略的目录-prune。然后在循环体中你核了文件。

可以做得更好
find . -path YOURDIR -prune -o -print0 | xargs -0 rm -f

不需要循环。免责声明:我没有测试过,所以也许你想开始用cp代替rm。

答案 2 :(得分:1)

你可以试试这个:

@echo off&setlocal
for /r /d %%i in (*) do (
    pushd "%%i"
    echo(%%i|findstr /ri "\\subtest2$" || COPY "*.cfm" "*_copy.cfm"
    popd
)