我有一个文件夹和一些子文件夹,其中包含一个文件名相同但文件名不同的文件。我必须将这些文件复制到一个公共文件夹但我想保留所有文件意味着我必须重命名该文件在Windows中使用批处理文件脚本
输入文件夹
D:\Data\Logs\Day1\DataLog.txt D:\Data\Logs\Day2\DataLog.txt D:\Data\Logs\Day3\DataLog.txt D:\Data\Logs\Day4\DataLog.txt D:\Data\Logs\Day5\DataLog.txt D:\Data\Logs\Day6\DataLog.txt
输出文件夹 赞
D:\Data\Common\Logs\DataLog1.txt D:\Data\Common\Logs\DataLog2.txt D:\Data\Common\Logs\DataLog3.txt D:\Data\Common\Logs\DataLog4.txt D:\Data\Common\Logs\DataLog5.txt D:\Data\Common\Logs\DataLog6.txt
我试过这个,但它覆盖了现有的文件
pushd D:\Data\Logs
for /r %%a in (*.*) do (
COPY "%%a" "D:\Data\Common\Logs\%%~nxa"
)
popd
答案 0 :(得分:0)
这是一种通用方法,但您可以尝试这样的方法:
setlocal enabledelayedexpansion
set "files=d:\data\logs\*.txt"
set "destDir=d:\data\common\logs"
for /f "delims=" %%f in ('dir "%files%" /b /s') do (
for %%d in ("%destDir%\%%~nf*") do (
set /a count+=1
)
xcopy "%%f" "%destDir%\%%~nf!count!%%~xf*"
set count=
)
由于扩展延迟,脚本的最后一个变体无法处理其完全限定路径名中包含插入符号(^
)的文件。
当命令行包含在执行时扩展的环境变量(如此脚本中的count
变量)时,整个命令行似乎被解析两次。 for循环变量(%%f
及其变体)将在第一次解析期间展开,count
变量在第二次解析期间展开。因为for循环变量在第二次解析时已经扩展,所以for循环变量值中出现的任何单个插入符都被解析器吞噬,并从最终结果中省略。
以下是应该解决所述问题的脚本修订版:
setlocal enabledelayedexpansion
set "type=.txt"
set "source=d:\data\logs"
set "dest=d:\data\common\logs"
for /r "%source%" %%f in ("*%type%") do (
for %%d in ("%dest%\%%~nf*") do (
set /a count+=1
)
set "source=%%f"
set "dest=%dest%\%%~nf"
xcopy "!source!" "!dest!!count!%type%*"
set count=
)