我在目录中有多个文件格式为:data_yyyy_mm_dd_ss.info.dat
我正在尝试编写一个批处理脚本,要求输入用户的开始/结束日期(并假设用户的输入将匹配文件的格式yyyy_mm_dd)然后我希望脚本能够合并所有相关文件。
Ex Files:data_2013_12_01_32.info.dat; data_2013_12_02_44.info.dat; data_2013_12_03_22.info.dat; data_2013_12_04_33.info.dat; data_2013_12_05_52.info.dat; data_2013_12_06_12.info.dat
前脚本:
@echo off
set /p start= Start Date:
set /p end= End Date:
copy /b ????
Ex用户输入:2013_12_02和2013_12_05
Ex输出:合并文件2013_12_02至2013_12_05。
感谢您提前提供任何帮助。
答案 0 :(得分:0)
我假设您知道自己在做什么,并且连接二进制文件是有效的。
以下内容应该有效,只要与FOR过滤器匹配的所有文件都是合并的候选者,并且只要用户始终以正确的格式输入日期(yyyy_mm_dd):
@echo off
setlocal
set /p start= Start Date:
set /p end= End Date:
set "out=output.info.dat"
for %%F in (data_????_??_??_??.info.dat) do (
for /f "tokens=1-3 delims=_" %%A in ("%%F") do (
if "%%A_%%B_%%C" geq "%start%" if "%%A_%%B_%%C" leq "%end%" (
copy /b "%out%"+"%%F" "%out%" /b
)
)
)
作为使用COPY的替代方法,您应该能够重定向FINDSTR的输出并获得相同的结果。
@echo off
setlocal
set /p start= Start Date:
set /p end= End Date:
>output.info.dat (
for %%F in (data_????_??_??_??.info.dat) do (
for /f "tokens=1-3 delims=_" %%A in ("%%F") do (
if "%%A_%%B_%%C" geq "%start%" if "%%A_%%B_%%C" leq "%end%" (
findstr "^" "%%F"
)
)
)
)
我不确定哪个更快,COPY或FINDSTR
答案 1 :(得分:0)
它几乎没有任何检查。小心。
询问开始和结束日期。根据数据输入生成最小和最大文件,并迭代有序的文件列表。如果找到一个文件,则会使用findstr
(第一个选项为type
命令,但速度慢4到5倍)并将所有输出重定向到最终合并文件。
@echo off
setlocal enableextensions disabledelayedexpansion
set /p "start=Start date :"
set /p "end=End date :"
set "start=data_%start%_00.info.dat"
set "end=data_%end%_99.info.dat"
>merged.info.dat (
for /f "tokens=*" %%f in ('dir /on /b "data_????_??_??_??.info.dat"') do (
if /i "%%f" geq "%start%" if /i "%%f" leq "%end%" findstr "^" "%%f"
)
)
对于很长的文件列表,可以省略搜索。在这一刻我不知道如何跳过文件列表的初始非匹配部分,但最后的部分可以很容易地跳过
@echo off
setlocal enableextensions disabledelayedexpansion
set /p "start=Start date:"
set /p "end=End date:"
set "start=data_%start%_00.info.dat"
set "end=data_%end%_99.info.dat"
>output.info.dat (
for /f "tokens=*" %%f in ('dir /on /b "data_????_??_??_??.info.dat"') do (
if /i "%%f" geq "%start%" if /i "%%f" leq "%end%" ( findstr "^" "%%f" ) else ( goto :endMerge )
)
)
:endMerge