用于复制文件的Windows批处理文件,其祖父祖父目录被添加为filename的前缀

时间:2017-09-26 21:59:08

标签: batch-file cmd

我有一个像这样的文件/目录结构:

C:\Results\name1\run\string1\output.csv
C:\Results\name2\run\string2\output.csv
C:\Results\name3\run\string3\output.csv
...

我想将每个output.csv复制到C:\Results,并将其祖父祖父目录名称添加为文件的前缀,所以我有:

C:\Results\name1output.csv
C:\Results\name2output.csv
C:\Results\name3output.csv

我正在尝试使用下面发布的批处理代码,但它并不完全存在。
(我试图通过其他在线搜索将其拼凑在一起。)

@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%a in ('dir /A:D /S /B "C:\Results*"') do (
    for %%y in ("%%a\*.csv") do (
        call :GETPARENTPARENT "%%y" ret

        echo ret=!ret!
        move /Y "%%y" "!ret!"
        pause
    )
)

goto :EOF

:GETPARENTPARENT
set fileP=%1
echo received=%fileP%
for %%a in (%fileP%) do (
    set parent=%%~dpa
    cd !parent!\..\..
    for /r %%a in (*.csv) do for %%b in ("%%~dpa\.")

    do ren "%%~a" "%%~nxb%%~xa"
    set gparent=%%~dpa
    cd !gparent!\..
    set PPPath=!cd!
    for %%x in ("!PPPath!") do (
        set "%~2=%%~dpnx"
    )
)
goto :EOF

2 个答案:

答案 0 :(得分:0)

我认为这样可行(当你确定时删除'echo'):

@echo off
setlocal enabledelayedexpansion

set baseFolder=C:\Results

cd /D %baseFolder%

for /D %%D in (*) do (
    for /f "tokens=* delims=" %%A in ('dir /S /B "*.csv"') do (
        set "filename=%%~nxA"
        for /f "tokens=3 delims=\" %%G in ("%%A") do set "newname=%baseFolder%\%%G!filename!"

        echo move /Y "%%A" "!newname!"
        pause
    )
)

但如果有多个子文件夹,最好在文件名中添加更多文件名,这样它们就是唯一的:

@echo off
setlocal enabledelayedexpansion

set baseFolder=C:\Results

cd /D %baseFolder%

for /D %%D in (*) do (
    for /f "tokens=* delims=" %%A in ('dir /S /B "*.csv"') do (
        set "filename=%%~nxA"
        for /f "tokens=3,4,5 delims=\" %%G in ("%%A") do set "newname=%baseFolder%\%%G%%H%%I!filename!"

        echo move /Y "%%A" "!newname!"
        pause
    )
)

答案 1 :(得分:0)

似乎您只想查找copy文件和move(但您的脚本使用copy,如果是,请将上述move替换为msr -l -rp C:\Results -f "\.csv$" -PAC | msr -it "(.*?Results\\[^\\]+).*?([^\\]+)$" -o "copy $0 $1$2" -X

1个命令行,只搜索磁盘一次

*.csv

上面的命令行:递归查找-X个文件,然后生成复制命令行并执行(-X

  • 如果您只想预览命令行,请移除-PAC
  • 添加-X -PAC(例如-XPAC-P -A -C -Xmsr.exe等)以隐藏其他信息。

tools是我的开放项目https://github.com/qualiu/msr jiggle(); 目录中的文件/管道/文本处理(搜索/替换)的单个exe(大约1.6MB,没有依赖) - 平台版本。文档内置用法:https://qualiu.github.io/msr/usage-by-running/msr-Windows.html