如何在批处理脚本中模式匹配文件名

时间:2014-05-27 17:12:31

标签: batch-file pattern-matching

我的具体情况

我想根据文件名的第四个字符将文件复制到两个不同的位置。单色图像应转到黑白文件夹,彩色图像应转到彩色文件夹。文件名的第四个字符是C或B(对于彩色或黑/白)。

例如,F0#CG.eps将是彩色图像文件,而F0#BG.eps将是单色图像文件。

我还在复制时在文件名末尾添加用户名。这是我到目前为止所做的:

@echo off
copy *.eps* \\Server\Directory1\BW\??????????%username%.*
copy *.eps* \\Server\Directory1\COL\??????????%username%.*

3 个答案:

答案 0 :(得分:2)

修改

  • 我回滚了Partian Shot的修改。批处理中的子字符串提取从零开始,因此!name:~3,1!确实获得第四个字符。
  • 我在%%~Xa扩展名替换中添加了缺失的百分比。

@echo off
setlocal EnableDelayedExpansion

for %%a in (*.eps*) do (
   set name=%%a
   if "!name:~3,1!" equ "B" (
      copy "%%a" "\\Server\Directory1\BW\%%~Na%username%.%%~Xa"
   ) else (
      copy "%%a" "\\Server\Directory1\COL\%%~Na%username%.%%~Xa"
   )
)

答案 1 :(得分:1)

我相信您只需对代码稍作修改即可:

@echo off
copy ???B*.eps* "\\Server\Directory1\BW\??????????%username%.*"
copy ???C*.eps* "\\Server\Directory1\COL\??????????%username%.*"

您可能希望增加目标名称中的问号数量。如目前所写,它只能正确支持最多10个字符的名称,不包括扩展名。

此外,名为aaaB.part2.eps的文件将被复制为aaaB%username%.part2.eps。如果你想要aaaB.part2%username%.eps,那么你需要一个更像Aacini的解决方案。

答案 2 :(得分:0)

以下是@Aacini答案的修改版本,其中没有包含"%〜Xa替换错误"

@echo off
echo Setting Environment...
setlocal EnableDelayedExpansion
echo Scanning files...
for %%a in (*.eps) do (
   set name=%%a
   echo "Copying %name%..."
   if "!name:~3,1!" equ "B" (
      copy "%%a" "\\Server\Directory1\BW\%username%"
   ) else (
      copy "%%a" "\\Server\Directory1\COL\%username%"
   )
)
pause