Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 根据文件名中的日期合并二进制文件_Windows_Batch File_Merge_Filenames - Fatal编程技术网

Windows 根据文件名中的日期合并二进制文件

Windows 根据文件名中的日期合并二进制文件,windows,batch-file,merge,filenames,Windows,Batch File,Merge,Filenames,我在一个目录中有多个文件,格式为:data\u yyyy\u mm\u dd\u ss.info.dat 我正在尝试编写一个批处理脚本,该脚本将要求用户输入开始/结束日期,并假设用户的输入与文件的格式yyyy\U mm\U dd匹配,然后我希望该脚本合并所有相关文件 Ex文件: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\u yyyy\u mm\u dd\u ss.info.dat

我正在尝试编写一个批处理脚本,该脚本将要求用户输入开始/结束日期,并假设用户的输入与文件的格式yyyy\U mm\U dd匹配,然后我希望该脚本合并所有相关文件

Ex文件: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;数据_2013_12_06_12.info.dat

前脚本:

@echo off
set /p start= Start Date:
set /p end= End Date:
copy /b ????
前用户输入:2013年12月02日和2013年12月05日

Ex输出:合并文件2013_12_02到2013_12_05


提前感谢您的帮助。

我假设您知道自己在做什么,并且连接二进制文件是有效的

只要与FOR筛选器匹配的所有文件都是合并的候选文件,并且只要用户始终以正确的格式yyyy\u mm\u 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"
      )
    )
  )
)

我不确定哪一个更快,复制还是查找。它几乎没有任何检查。小心点

询问开始和结束日期。根据数据输入生成最小和最大文件,并在有序的文件列表上迭代。若找到一个文件,则使用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

一个非常奇怪的要求。我不知道有多少二进制文件可以简单地连接起来仍然有用。谢谢你的帮助,这让我走上了正确的道路。由于%%A获得了数据值,我最终不得不使用代币=1-4和%%B_%%C_D%%的if。另外,为了更改它,使文件可以位于不同的目录中,我必须使用以下命令生成一个文件列表:for/f delims=%%d in'dir/on/b C:\LOCATION'do echo%%~nxd>>List.txt,我必须使用copy num%out%来首先创建输出文件。我不确定为什么这不起作用,因为我尝试先使用它,但我一直得到一个“dir”命令,它不被识别为内部或外部命令。如果我删除了>merged.info.dat部分,只是用一个echo运行for循环,它输出的文件名很好,但是当我将output.info.dat添加回它时,总是失败。@user3199810:我的错误。for命令的in子句末尾缺少一个引号。