Windows批处理,递归复制文件

时间:2017-10-30 14:05:16

标签: windows batch-file recursion xcopy

我在不同位置有大量图像,这些图像都位于名为“global_en-us”的文件夹中(指的是在EN网站上使用的图像)。这些都需要复制到各种其他语言(例如global_de-de),因为只提供了EN - 因为图像上的任何内容都不是特定于语言的。显然,最好的解决方案是重写站点上的路径以删除对语言的引用,但每个集合有3-4种语言,大约在100到120个集合之间,这个任务太大了,所以要复制一个bat脚本根据需要,所有这些都会更方便。

图像都设置与此类似。来自“/ assets / images”的路径是重要的一点,我想从那里运行脚本并让它顺利运行

c:/somefolder/assets/images/special-offers/some-promo-name/global_en-us/<images>
c:/somefolder/assets/images/layout/some-component-name/global_en-us/<images>
c:/somefolder/assets/images/tournaments/some-tourney-name/global_en-us/<images>

我目前有一个脚本,我拼凑起来,只知道bat脚本真正有效,你可以指定一个包含global_en-us文件夹的位置,它会将它复制到所有必需的语言。我在下面复制了它:

@echo off
IF EXIST log.txt (
del log.txt
)

set /p folder="Enter location : "
set folderTest=%folder:~-1%

echo %folderTest% > log.txt
if %folderTest% == \ echo "slash found" > log.txt
if NOT %folderTest% == \ set folder=%folder%\

xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_bg-bg\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_pt-br\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_cs-cz\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_da-dk\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_de-de\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_el-gr\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_en-us\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_es-es\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_es-la\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_et-ee\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_fi-fi\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_fr-fr\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_hr-hr\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_hu-hu\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_is-is\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_it-it\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_ja-jp\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_lt-lt\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_lv-lv\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_nl-nl\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_no-no\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_pl-pl\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_pt-pt\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_ro-ro\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_ru-ru\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_sv-se\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_si-si\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_ua-ua\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_zh-cn\"
xcopy /Y /S "%folder%global_en-us\*.*" "%folder%global_zh-tw\"

我想要的是,如果现在变得越来越清晰,而不是我必须在每个文件夹上运行100-120次,例如“c:/ somefolder / assets / images / special-offers / some-promo- name /“,我可以告诉它”c:/ somefolder / assets / images /“并让它以resursivly的方式工作,当它找到”global_en-us“时,它会根据需要执行xcopy,然后返回并继续前进。

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q47017256.txt"

FOR /d /r "%sourcedir%\somefolder\assets\images\" %%a IN (*) DO IF /i "%%~nxa"=="global_en-us" (
 FOR /f %%d IN (%filename1%) DO (
  ECHO XCOPY /y /d /s "%%a\*" "%%~dpaglobal_%%d\"
 )
)

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q47017256.txt的文件,其中包含我的测试虚拟数据。

  

BG-BG
  PT-BR
  CS-CZ

所需的XCOPY命令仅用于ECHO用于测试目的。 在您确认命令正确后,将ECHO XCOPY更改为XCOPY以实际复制文件。附加>nul以取消报告消息(例如1 file copied

for /d /r%%a分配给从指定目录开始的每个目录的名称。 if仅允许进一步处理其叶子上名为global_en-us的目录。

在循环中,读取我所描述的格式的文件,并生成xcopy以更新(/d)目标目录,该目录目录是根据驱动器和路径构建的。 %%a减去叶子目录global_us-en +文字global_ +从文本文件中读取的行。

因此,您应该可以随时运行此操作,将整个树更新为最新global_en-us目录中的副本。