复制与一种模式匹配但不与另一种模式匹配的文件

复制与一种模式匹配但不与另一种模式匹配的文件

我有许多遵循以下模式的文件:

<BaseName> . <Version> [ - <Tag> - <#> ] . <Extension>

例如:

basename.1.0.0.ext
basename.1.0.0-aaa-1.ext
basename.1.0.0-aaa-2.ext
basename.1.0.0-aaa-3.ext
basename.1.0.0-bbb-1.ext
basename.1.0.0-bbb-2.ext
basename.1.0.0-bbb-3.ext

现在我需要编写一个严格的规则,只复制带有特定“标签”部分(或没有“标签”)的文件到目标文件夹。例如:

xcopy *-aaa-*.ext \\server\path /f /y

仅复制带有“aaa”标签的文件。到目前为止一切顺利。

问题是该脚本还需要适用于没有“标签”的文件,基本上我需要所有匹配的文件*.ext 除了什么匹配*-*.ext

不幸的是,我这里有许多限制:

  • 我无法更改这些文件的名称模式或位置。
  • “版本”部分未知,因此*.1.0.0.ext不起作用。
  • “版本”的长度不是固定的,因此*.?.?.?.ext不起作用。
  • xcopy的排除参数不接受模式,只接受文件列表,因此这不起作用。
  • 我只能使用批处理脚本来实现这一点。调用 PowerShell 并非完全不可能,但需要相当多的开销才能使其工作,因此如果可能的话,我希望避免这种情况。
  • 实际的脚本看起来应该是这样的:

    xcopy "%SOURCE%" "%DEST%" /f /y
    

    并且该脚本所使用的变量将会保存在外部配置文件中。

我该如何编写此脚本,使其适用于任何文件集,包括特定的“标签”和没有任何“标签”的文件集?

答案1

foo.bat:

dir /b %3 > exclude_list.txt
xcopy %1 %2 /f /y /EXCLUDE:exclude_list.txt

对于像您的示例中的排除:

call foo.bat "C:\source\*.ext" "C:\destination\" "*-*.ext"

对于不排除(“不雅的黑客”):

call foo.bat "C:\source\*.ext" "C:\destination\" "A_STRING_THAT_CANNOT_MATCH"

也可以看看Robocopy转变/xf {filename}

答案2

这就是我现在正在使用的:

for /f "delims=" %%f in ('dir /b "*.ext" ^| findstr "%TAG%"') do (
    xcopy "%ff" %DEST% /f /y
)

因此,要复制给定的标签,您只需指定TAG=-aaa-,甚至可以指定用空格分隔的多个标签,例如TAG=-aaa -bbb-

缺点是,要部署没有标签的文件,您必须做一些非常丑陋的事情,例如TAG=^[^-]*$。虽然我可以在将来重构它,以便它也需要一个变量来指定标志/v(这会反转的行为findstr),但目前这似乎没有必要。

相关内容