我有这样的文件/目录结构:
C:Resultsname1runstring1output.csv
C:Resultsname2runstring2output.csv
C:Resultsname3runstring3output.csv
...
我想将每个output.csv
复制到C:Results
,其曾祖父母目录名称添加为文件的前缀,所以我有:
C:Resultsname1output.csv
C:Resultsname2output.csv
C:Resultsname3output.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
我认为这将有效(确定时删除'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
)
)
似乎只想找到*.csv
文件和copy
(但是您的脚本使用move
,如果是的话,只需将上述copy
替换为move
。
1命令行和只需搜索磁盘:
msr -l -rp C:Results -f ".csv$" -PAC | msr -it "(.*?Results\[^\]+).*?([^\]+)$" -o "copy $0 $1$2" -X
上面的命令行:递归查找*.csv
文件,然后生成复制命令行并执行(-X
)
- 删除
-X
如果您只想预览命令行。 - 添加
-PAC
(例如-X -PAC
或-XPAC
或-P -A -C -X
等)以隐藏其他信息。
msr.exe
是我的开放project中的文件/管道/文本处理(搜索/替换)https://github.com/qualiu/qualiu/msr tools
目录,带有cross-platform的单个exe(约1.6mb,无依赖关系)版本。诸如内置用法之类的文档:https://qualiu.github.io/msr/usage-by-running/msr-windows.html