我有一个脚本(robo(从不同的文件夹复制文件,但这个批处理脚本为每个文件夹复制所有文件。请参阅下面的批处理脚本。
我在源文件夹中有格式为.xxx.xxxxxxxxxx
和.xxx
的文件。
例如,在folder A
中,我有3个文件:
12345678901234.001.0423201154
23456789012345.005.0423201155
43210987654321.001
我只想将前两个文件复制到上面的folder B
,而不包括最后一个文件。
请帮忙。谢谢
@echo off
set Source=\TestSource
set Target=\TestTarget
set FolderList=C:temptstsource.txt
set LogFolder=C:tempLogfolder
if not exist "%Source%" echo Source folder "%Source%" not found & goto Exit
if not exist "%FolderList%" echo File list "%FolderList%" not found & goto Exit
if not exist "%Target%" md "%Target%"
for /F "delims=" %%a in ('type "%FolderList%"') do (
@echo Copying %%a folders and files, please wait ...
@echo "%Source%%%a" "%Target%%%a" /MOV /DCOPY:DAT /MIR /E /MT:16 /R:2 /W:30 /LOG:"%LogFolder%%%a.log"
robocopy "%Source%%%a" "%Target%%%a" /MOV /DCOPY:DAT /E /MT:16 /R:2 /W:30 /LOG:"%LogFolder%%%a.log"
@echo.
@echo *..........................................................
)
:Exit
echo.
echo press the Space Bar to close this window.
pause > nul
尝试在for
命令中使用到findStr
的管道,以在type
使用FolderList
文件时从该文件中排除任何不需要的文件模式。
示例:
for /F "delims=" %%a in ('type "%FolderList%" ^| findStr /I /V /R /C:"^[01234567890]*.[0123456789][0123456789][0123456789]$"') do (
...
)
您可以在cmd.exe命令窗口中执行findStr /?
,以阅读有关语法和正则表达式的文档。
本质上,/I
表示"忽略大小写",/V
表示"排除/跳过匹配项",而/R
表示"使用正则表达式解析">
管道符号必须在使用插入符号的for语句(^|
(内转义。
此RegEx应匹配不需要的文件模式:"^[01234567890]*.[0123456789][0123456789][0123456789]$"
因此,我假设您的文件名仅由数字组成,数字可以表示为括号[0123456789]*
中的符号类,星号表示"允许重复零次或多次">
点必须转义为.
,因为在正则表达式中,点代表"任何单个字符"(因此.*
是"任何数量的字符序列,零或更多"(
点后的三个类的组表示"数字0-9的三次出现",以匹配文件扩展名。RegEx开头的插入符号^
表示"从行首开始",美元$
表示"行尾"(例如,最后一位后面不允许有空格(。
通过分别对小写字母和[A-Z]
使用[0-9]
或[a-z]
,而不是显式列出类中允许的字符/数字,可以将RegEx缩短一点。这可能有很难追踪的副作用,所以通常我总是明确列出所有允许的字符。
编辑:我错过了部分,你只想复制前两个文件模式。在这种情况下,您可以省略/V
,并查找具有2个点的文件,例如:"[01234567890]*.[0123456789]*.[0123456789]*"
,它接受由两个点分隔的任意数字。
您在文件名+扩展名长度匹配方面的方法应该同样有效。如果您希望允许最少或固定数量的符号,请使用点作为一个符号(数字或字符(的占位符。(如以下评论所示(