【问题标题】:Using a batch file to copy files with a wildcard in the directory path?使用批处理文件复制目录路径中带有通配符的文件?
【发布时间】:2018-03-22 20:35:41
【问题描述】:

我想要一个批处理文件将文件从每个月更改的文件夹复制到另一个文件夹,但 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\。

但是文件夹FI81711001 的1711 部分每个月都会更改,我不知道如何让通配符在脚本中起作用。

我尝试了以下脚本:

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 was unexpected at this time.

【问题讨论】:

  • 欢迎来到 SO! :-) 到目前为止,您对脚本有什么尝试?您可以通过编辑将其添加到您的问题中吗?
  • * 在您指定的位置表示“以 [FI8] 开头”-您的意思是 * 被日期替换-如果是这样,以什么格式?您只想复制找到的文件还是想要一些目录子结构 - 请记住 ..._6 下面的子树可以复制,但不能复制到指定的目录中(这会导致尝试将文件复制到 他们自己)。文件/目录名是否包含任何对cmd 有意义的非字母数字字符,例如%!()^&+?
  • 您忘记在for 行中引用<path\filename>。
  • for /D %%D in ("K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI8*\FI8*\FI8*\OM_LOCAL*") do xcopy "%%~D\media1\" "K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\" 还是不行:-(

标签: batch-file wildcard


【解决方案1】:
@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 - 这是一个保留名称)。你如何得出它 - 有很多关于如何提取日期数据的文章,因为它因用户配置而异。我使用了一个常量,如果需要,可以手动输入 - 取决于这是在今天工作的预定作业还是随机运行。

本质上,执行递归目录扫描,将每个目录名依次分配给%%a。 echo 将该名称转换为 findstr,在任何情况下(@987654330 @ 转变)。

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

【讨论】:

  • 我想将“media1”中的文件夹和文件复制到另一个目录,但我的问题是“media1”每个月都在更改的文件夹。例如,本月“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" 但下个月“media1”将位于"K:\Eng\NAVDB\Navigation Databases\Current\FI8_Icelandair_B75_76\FI81712001\FI81712001\FI81712_AHDF.001\OM_LOCAL_FLOPPY_1.44MB_S520_v1_1\media1"
  • 最终我想要一个脚本,我不必每个月都修改。
【解决方案2】:

除了在您的 for /D 方法中缺少引号以保护路径中的 SPACE 之外,还有一个概念问题: 您不能将通配符放在路径中间的某个位置,它们只能用于最后一项。 由于您已获得已知的固定目录层次结构深度,您可以使用嵌套的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)以实际复制它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2014-04-22
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多