批处理文件:复制除了文件名包含某个子字符串的所有文件

3

首先我是初学者。我想创建一个批处理文件,以便在特定文件夹中(包括所有子文件夹)搜索并复制其中的所有文件,但不复制文件名中包含某些特定字符串的文件,以下是我目前的进展。

set now=fish        
set logDirectory="C:\Users\paiseha\Desktop\bb\"      
for /r %logDirectory% %%i IN (*%now%*.*) do (          
rem copy process goes here            
)       

假设我有三个文件
  C:\Users\fareast\Desktop\bb\one.txt  
  C:\Users\fareast\Desktop\bb\twofishtwo.txt  
  C:\Users\fareast\Desktop\bb\three.txt  

我想复制文件one.txt和three.txt,但是实际上只复制了第二个文件。我知道这是因为*%now%*.*的原因,那么我该如何反转它以使其按照我想要的方式工作呢?请帮帮我,谢谢!

2个回答

5

尝试:

@ECHO OFF &setlocal
set "now=fish"        
set "logDirectory=C:\Users\paiseha\Desktop\bb"      
for /f "delims=" %%a in ('dir /a-d/b/s "%logDirectory%"^|findstr /riv "^.*[\\][^\\]*%now%[^\\]*$"') do (          
  rem copy process goes here            
)
编辑:因为 Vista FINDSTR 正则表达式转义 \ 的怪癖,所以 \ 字符的表示形式为 [\\],而不是 \\。Vista 需要 \\\\,但 XP 和 Win 7 使用 \\。 在所有平台上都有效的唯一表示形式是 [\\]。更多信息请参见Windows FINDSTR 命令的未记录特性和限制是什么?

考虑包含“%now%”的路径...可以使用指定的目录/排除字符串组合,但不适用于一般情况:(抱歉... - Magoo
谢谢您的回复,您提供的代码循环遍历的是“C:\Users\fareast\Desktop\”,而不是“C:\Users\paiseha\Desktop\bb\”,这是为什么呢? - paiseha

2
for /f "delims=" %%a in ('dir /a-d/s/b "%logDirectory%" ') do echo %%~nxa|findstr /i /L "%now%" >nul&if errorlevel 1 ECHO COPY "%%a"
应该适用于你。

为什么它也要循环遍历父目录?我的意思是,我设置它循环遍历目录“C:\Users\paiseha\Desktop",而不是循环遍历“C:\Users\paiseha\Desktop\bb"。 - paiseha
@paiseha:需要和 @Endoro 一样的编辑 - 将 set log... 中的引用移动以包含 var=string,而不是 var="quoted string"。第一个将赋值没有尾随空格(如果存在),而第二个将分配带引号的值和行上的任何起始尾随空格给 var - Magoo
+1,但是 FINDSTR 搜索应该在 /I 选项之外还使用 /L 字面选项。如果没有 /L,则如果 now 是类似于 .abc 的内容,则解决方案将失败,因为 . 将匹配任何字符。 - dbenham
另一个选项是使用 FIND /I 而不是 FINDSTR /IL。此外,使用 || copy "%%a" 要比 & if errorlevel 1 copy "%%a" 更短... - dbenham
@dbenham没错,/L开关可以理解——我已编辑过了。至于“||”和“&&”之间的选择——我从来不用它们,只是因为我总是记不清哪个是哪个…… - Magoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接