Batch file 使用批处理文件复制目录路径中带有通配符的文件?
我想要一个批处理文件,将每个月都会更改的文件夹中的文件复制到另一个文件夹中,但Windows命令提示符似乎不喜欢通配符 示例: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
我要复制文件夹
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”中“
最终,我想要一个不需要每月修改的脚本。