使用批处理文件在目录路径中复制带通配符的文件?

时间:2017-10-11 08:40:19

标签: batch-file wildcard

我对批处理文件和脚本完全陌生,所以请保持温和: - )

我想要一个批处理文件将文件从每月更改的文件夹复制到另一个文件夹,但似乎Windows命令提示符不像通配符。

实施例: 我想复制文件夹" media1"并包含此目录中的文件:

"K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI81711001\FI81711001\FI81711_AHDF.001\OM_LOCAL_FLOPPY_1.44MB_S520_v1_1\media1"

到此目录"K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\"

但1711部分文件夹" FI81711001"每个月都有变化,我无法弄清楚如何让通配符在脚本中工作。

我尝试过以下脚本:

robocopy "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI8*\FI8*\FI8*\OM_LOCAL*\media1" "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\" 

copy "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI8*\FI8*\FI8*\OM_LOCAL*\media1" "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\" 

xcopy "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI8*\FI8*\FI8*\OM_LOCAL*\media1" "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\" 

for /D %%D in (K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI8*\FI8*\FI8*\OM_LOCAL*\) do copy "%%~D\media1\" "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\"

当我运行" For"脚本我得到" %% D此时出乎意料。"

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76"
SET "destdir=U:\Eng"
SET "dt=1711"

FOR /d /r "%sourcedir%" %%a IN (*) DO (
 ECHO %%a|FINDSTR /i "\FI8%dt%.*\FI8%dt%.*\FI8%dt%.*\OM_.*\media1" >NUL
 IF NOT ERRORLEVEL 1 (
  ECHO XCOPY "%%a\*" "%destdir%\"
 )
)

GOTO :EOF

对于需要复制的内容,我们仍然处于黑暗中。我假设您希望....\media1中的文件在适当的一天复制到某个已知目录(我的测试设置使用U:代替K:

通过澄清需要复制的内容以及在哪里,可以进行改进。

请注意,dt设置为4个字符的日期序列(对此变量使用date - 它是保留名称)。你如何得出它 - 好吧,有很多关于如何提取日期数据的文章,因为它随用户配置而变化。我已经使用了一个常量,如果需要可以手动输入 - 取决于这是否是今天在上工作的预定作业或随机运行。

基本上,执行递归目录扫描,将每个目录名依次分配给%%aechofindstr命名为/i,在任何情况下都要查找字符串“\ FI8 * thedateinDT_anycharacters * \ FI8 * thedateinDT_anycharacters * \ FI8 * thedateinDT_anycharacters * \ OM_ anycharacters \ media” (errorlevel开关)。

如果找到该字符串,则0将设置为xcopy,而不是[1或更高],因此echoed命令将为echo(用于验证) - 删除xcopy执行 {{1}})

答案 1 :(得分:0)

除了在保护路径中的 SPACE for /D方法中缺少引号之外,还有一个概念上的问题: 您不能将通配符放在路径的中间,只能在最后一项中使用通配符。 由于您具有已知的固定目录层次结构深度,因此可以使用嵌套的for /D loops

for /D %%A in ("K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI8*") do (
    for /D %%B in ("%%~A\FI8*") do (
        for /D %%C in ("%%~B\FI8*") do (
            for /D %%D IN ("%%~C\OM_LOCAL*") do (
                xcopy /L /F /I /E "%%~D\media1\*.*" "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\media"
            )
        )
    )
)

xcopy command/L选项可防止其复制任何文件,/F选项可显示完整的源路径和目标路径;在检查了要复制的正确文件之后,只需删除/L(如果需要,还可以删除/F)即可进行实际复制。