Batch Script以复制具有长文件扩展名的文件



我有一个脚本(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]*",它接受由两个点分隔的任意数字。

您在文件名+扩展名长度匹配方面的方法应该同样有效。如果您希望允许最少或固定数量的符号,请使用点作为一个符号(数字或字符(的占位符。(如以下评论所示(

最新更新