我有多个文件夹中的文件,我每月收到所有这些文件,我需要使用这个命名约定将所有文件复制到一个文件夹YYYYMMDD.csv
Current Folder <CRLF>
YYYY\MM\D\ir\external_report.csv
2015\03\1\ir\external_report.csv
2015\03\2\ir\external_report.csv
.
.
.
2015\03\31\ir\external_report.csv
需要在此文件夹中
2015\03\20150301.csv
.
.
2015\03\20150331.csv
答案 0 :(得分:0)
如果我正确理解了这个问题,可能会有用:
@echo off
setlocal enabledelayedexpansion
for /r C:\2015 %%i in (*.csv) do (
for /f "tokens=1-3 delims=\ " %%j in ('echo %%~pi') do (
if %%l lss 10 (
move "%%i" "c:\%%j\%%k\%%j%%k0%%l%%~xi"
) else (
move "%%i" "c:\%%j\%%k\%%j%%k%%l%%~xi"
)
)
)
pause
它应该将所有.csv
文件放在父年文件夹中的相关月份文件夹中,并根据您的命名约定重命名它们。您可能需要更改目录/路径以适合您的目录。
答案 1 :(得分:0)
以下内容将移动并重命名位于external_report.csv
文件夹层次结构中的当前文件夹下的所有YYYY\MM\D\ir\
个文件。它不会移动不在模板层次结构中的external_report.csv
个文件。 YYYY
文件夹可以位于当前文件夹层次结构中的任何深度。如果移动后它们为空,这也将删除D\ir
个文件夹。
for /f "delims=" %%F in (
'dir /b /s /a-d external_report.csv^|findstr /i "[\\][0-9][0-9][0-9][0-9][\\][01][0-9][\\][0-9][0-9]*[\\]ir[\\]external_report.csv$"'
) do for %%D in (
"%%F\..\.."
) do for %%M in (
"%%F\..\..\.."
) do for %%Y in (
"%%F\..\..\..\.."
) do (
if %%~nD lss 10 (
move "%%F" "%%~dpD%%~nY%%~nM0%%~nD.csv
) else (
move "%%F" "%%~dpD%%~nY%%~nM%%~nD.csv
)
%= The following will delete the day\ir =%
%= folders if and only if they are empty =%
2>nul (rd "%%F\.." && rd "%%F\..\..")
)
工作原理。
DIR /B /S
命令列出了所有external_report.csv
个文件的完整路径。
使用正则表达式将结果传送到FINDSTR
,该表达式验证文件位于YYYY\MM\D\ir
文件夹中。这不是一个完美的验证,但它应该是足够的。
FOR /F
在循环中迭代结果。
使用额外的FOR
循环和\..
技巧提取每个日期组件,使层次结构向上移动一级,并使用~n
修饰符获取结果基本名称(年,月或日)
%= xxxxxxx =%
是一种在循环中嵌入注释的安全方法。实际上,它是一个不存在的变量的扩展,这无关紧要。变量不能存在,因为变量名称不能包含=
。
其余的是直截了当的