2014-01-15 128 views
0

我在與formatL目錄多個文件: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 ???? 

防爆用戶輸入:2013_12_02和2013_12_05

防爆輸出:合併文件2013_12_02通過2013_12_05。

感謝您提前提供任何幫助。

+1

一個非常奇怪的請求。我沒有意識到許多二進制文件可以簡單地連接在一起並仍然有用。 – dbenham

回答

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" 
    ) 
    ) 
) 
) 

我不知道這是更快,複製或FINDSTR

+0

感謝您的幫助,讓我走上了正軌。因爲%% A正在獲取數據值,所以我最終不得不使用tokens = 1-4和%% B _ %% C _ %% D。另外,爲了改變它,這樣文件可以在不同的目錄中,我必須使用以下命令來生成文件列表:for/f「delims =」%% d in('dir/on/b「C:\ LOCATION」' )do(echo %%〜nxd >> List.txt)另外,我必須使用copy NUL%out%來首先創建輸出文件。 – user3199810

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 
+0

我不知道爲什麼這不起作用,因爲我試圖先使用它,但我一直得到一個「'dir'不被識別爲內部或外部命令」。如果我刪除了> merged.info.dat部分,只用echo運行for循環,它會輸出文件名,但是當我將output.info.dat添加回來時總是失敗。 – user3199810

+0

@ user3199810:我的錯。 'for'命令的'in'子句末尾缺少單引號。 –

相關問題