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

Batch file 使用批处理文件复制目录路径中带有通配符的文件?,batch-file,wildcard,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\NAV

我想要一个批处理文件,将每个月都会更改的文件夹中的文件复制到另一个文件夹中,但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\u Icelandair\u B75\u 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,这在此时是意外的。

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\Eng\NAVDB\Navigation Databases\Current\FI8\U Icelandair\U B75\U 76”
设置“destdir=U:\Eng”
设置“dt=1711”
对于(*)DO中的/d/r“%sourcedir%”%%a(
ECHO%%a | FINDSTR/i“\FI8%dt%.*\FI8%dt%.*\FI8%dt%.*\OM.*\media1”>NUL
如果不是错误级别1(
ECHO XCOPY“%%a\*”“%destdir%\”
)
)
后藤:EOF
我们还不清楚到底什么东西需要复制到哪里。我假设您希望将
…\media1
中相应日期的文件复制到某个已知目录(我的测试设置使用
U:
代替
K:

通过澄清需要复制的内容和位置,可以对其进行改进

请注意,
dt
被设置为4个字符的日期序列(不要对该变量使用
date
,它是一个保留名称)。如何派生数据-关于如何提取日期数据,有很多文章都在讨论,因为日期数据随用户配置而变化。我使用了一个常量,如果需要的话,可以手动输入,这取决于这是一个当前正在工作的计划作业还是随机运行的作业

基本上,执行递归目录扫描,将每个目录名依次分配给
%%a
echo
将该名称返回到
findstr
,查找字符串“\FI8*dateindt\u anycharacters*\FI8*ateindt\u anycharacters*\FI8*ateindt\u anycharacters*\OM\u anycharacters\media”,在任何情况下(开关
/i
都可以)


如果找到字符串,则
errorlevel
将被设置为
0
,该值不是[1或更大],因此
xcopy
命令将被
回显
(为了验证-删除
echo
以执行
xcopy

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

for/D%%A in(“K:\Eng\NAVDB\Navigation Databases\Current\FI8\u Icelandair\u B75\u 76\FI8*”)do(
对于(“%%%A\FI8*”中的/D%%B,请执行以下操作(
对于(“%%~B\FI8*”)中的/D%%C,请执行以下操作(
对于“%%~C\OM\u LOCAL*”中的/D%%D,请执行以下操作(
xcopy/L/F/I/E“%%~D\media1\*.*”K:\Eng\NAVDB\Navigation Databases\Current\FI8\u Icelandair\u B75\u 76\media”
)
)
)
)

/L
选项防止复制任何文件,
/F
选项同时显示完整的源路径和目标路径;在检查了要复制的正确文件后,只需删除
/L
(如果愿意,也可以删除
/F
)即可实际复制它们。

欢迎使用SO!:-)到目前为止,你对剧本做了哪些尝试?您可以通过编辑将其添加到您的问题中吗?
*
在您指定的位置表示“从[FI8]开始”-您的意思是用日期替换
*
,如果是,格式是什么?您是只想复制找到的文件,还是想要一些目录子结构-请记住,下面的子树
…\u 6
可以复制,但不能复制到指定的目录中(这将导致尝试将文件复制到自己的目录中)。文件/目录名是否包含对
cmd
有意义的非字母数字字符,如
%!()^&+
?您忘记在
行中引用
中的/D%%D(“K:\Eng\NAVDB\Navigation Databases\Current\FI8\u Icelandair\u B75\u 76\FI8*\FI8*\OM\u LOCAL*”)中的
)请复制“%%~D\media1\”K:\Eng\NAVDB\Navigation Databases\Current\FI8\u Icelandair\u B75\u 76\”
仍然不起作用:-(我想将“media1”中的文件夹和文件复制到另一个目录,但我的问题是“media1”中的文件夹每月都在更改。例如,本月“media1”文件夹和文件位于
“K:\Eng\NAVDB\Navigation Databases\Current\FI8\u Icelandair\u B75\u 76\FI81711001\FI81711\FI81711\u AHDF.001\OM\u LOCAL\u FLOPPY\u 1.44MB\u S520\u v1\media1”
但下个月的“media1”将出现在
“K:\Eng\NAVDB\NAVDB\Navigation Databases\Current\FI8\u Icelandair\u B75\u AHDF\u 76\FI81712001\FI81712001\FI81712001\fi8171712\FI81712\u LOCAL\u v1\u44mb”中“
最终,我想要一个不需要每月修改的脚本。