尝试仅复制名称为三个字符的文件,但这是复制任何较小的文件

尝试仅复制名称为三个字符的文件,但这是复制任何较小的文件

我在 Windows XP Pro 的控制台窗口中使用“复制”(所以我基​​本上使用 DOS 命令)

我有一些文件包含三个字符加一个扩展名,还有一些文件包含两个字符加一个扩展名。我在 ms-dos 批处理文件中有以下内容...

copy ???.gif n:\inetpub\wwwroot\images

就我对 windows/dos 通配符的理解而言,它应该只复制名称中包含三个字符的文件。但它也会复制名称中包含两个字符的文件。

因此,我的理解一定是错误的,那么在 ms-dos 批处理文件中是否存在另一种方法可以将副本限制为仅包含名称中特定数量字符的文件?

答案1

为了仅选择所需的文件,您需要使用正则表达式。一种方法是使用 findstr 命令。(http://ss64.com/nt/findstr.html

为了将输出命令串在一起,它看起来有点丑陋,但基本格式如下:

for /f "delims=" %a in ('dir /b ^| findstr "\<[a-z][a-z][a-z].gif"') do copy %a n:\inetpub\wwwroot\images

稍微解释一下:

for /f "delims=" %a in

这是设置,以便“()”中命令的每个输出都将放入 %a 中

('dir /b ^| findstr "\<[a-z][a-z][a-z].gif"')

此命令使用 dir /b 获取当前目录中的文件列表并将其传递给 findstr。findstr 查找与以下模式匹配的输入行:它们包含以三个字母([az][az][az])开头(\<)并后跟 .gif(.txt)的单词。

do copy %a n:\inetpub\wwwroot\images

这将复制名称为 %a 的文件。

答案2

表示文件名末尾的?一个字符或一个。NULL

因此 BA??.TXT 将匹配 BARR.TXT 和 BAR.TXT。由于您使用的是 3 ?,因此它还将匹配 2 个字符和 1 个字符...

在 Windows Vista 中,有一个名为 的复制命令robocopy,它具有排除某些文件的选项。您可以尝试:

robocopy ???.txt c:\temp\ /xf??.TXT

但我不确定它是否能在 Windows XP 上运行

答案3

你可以通过以下方式进行操作:

@echo off
setlocal EnableDelayedExpansion
for %%f in (???.gif) do (
    set filename=%%f
    set fourthchar=!filename:~3,1!
    if !fourthchar! == . copy %%f n:\inetpub\wwwroot\images
)

也就是说,只复制点前有三个字符的文件。

相关内容