我有一个像这样的文件/目录结构:
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
答案 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 -X
或msr.exe
等)以隐藏其他信息。 tools
是我的开放项目https://github.com/qualiu/msr jiggle();
目录中的文件/管道/文本处理(搜索/替换)的单个exe(大约1.6MB,没有依赖) - 平台版本。文档内置用法:https://qualiu.github.io/msr/usage-by-running/msr-Windows.html