iT邦幫忙

0

Bat 取得資料夾內最大的檔案日期

在資料夾下有各式各樣的檔案,不限定是txt檔,也有很多層子目錄
需要用Bat取得該資料夾下(含子目錄)最後的修改日期
並輸出到其他位置的Txt

例:
D:\TEST\ABC\123\111.doc 2018\11\3 11:00
D:\TSET\ABC\222.txt 2018\11\2 12:00
D:\TSET\333.xls 2018\11\1 09:00
D:\TEST\ZZZ\444.dll 2018\11\2 10:20

希望以BAT在D:\TEST資料夾下執行,執行後在D:\FINAL下產生LastTime.txt
內容是20181103 1100
如果可以到秒的話更好(20181103 110020)

應該要用FOR來跑 可是不知道怎麼下比較好,請大大指教

wwx iT邦研究生 1 級 ‧ 2018-11-07 15:44:59 檢舉
抱歉囉~
我的回答有邦友提報說連結疑似有木馬 所以小財神通知下架囉!
XD

不過那程式在機房跑快20年了 XDD
好的,有用蟹老闆大大的指令可跑出結果了
謝謝您
0
蟹老闆
iT邦大師 1 級 ‧ 2018-11-07 00:40:07
最佳解答

如果只是單純的要列出最後一個(最新)時間點以下做法可以達成,但是若有二個相同時間點的檔案無法處理,它只會處理最後一個。

使用方法:
將以下語法貼到.BAT檔中,在 .BAT檔的目錄下需要有TEST資料夾,執行完畢會在 .BAT 同目錄下產生一個 LastTime.txt

@For /f %%i in ('Dir \Test /OD /TW /A-D /B /S') Do Set "[%%~pdi]=%%~nxi	%%~ti"
set [>LastTime.txt

測試一下這個指令
產生的檔案LastTime.txt
內容是將每個資料夾(含子目錄)中的最後一個(最新)記錄在該檔案中

如果D:\TEST內有10個資料夾(含子目錄),都有各自的檔案
LastTime.txt中就會有10筆
似乎只在各自的資料夾內比較

但我想要一個最後的比較結果
D:\TEST內所有檔案中
將"一個"最大(最新)的日期輸出至LastTime.txt中

蟹老闆 iT邦大師 1 級 ‧ 2018-11-07 23:13:30 檢舉

理解,不是統計各個子資料夾而是所有子資料夾中最新(最大)的檔案.

SetLocal ENABLEDELAYEDEXPANSION
Set Dates=0000/00/00
For /f %%i in ('Dir \Test /OD /TW /A-D /B /S') Do (
    If "%%~ti" GTR "!Dates!" (
        Set "[LastTime]=%%~dptnxi"
        Set "Dates=%%~ti"
    )
)
Set [LastTime]>LastTime.txt

To蟹老闆:
上方指令可行 檔案內容也與需求一致
非常感謝您

1
comhlp
iT邦新手 4 級 ‧ 2018-11-06 13:02:38
dir path:\*.* /s /o:-d >output.txt
dir D:\test\*.* /s /o:-d >d:\final\lasttime.txt
看更多先前的回應...收起先前的回應...

感謝comhlp大大

剛才測試您提供的語法
看結果是將指定路徑下的所有檔案(含子目錄中的)日期輸出到指定檔案下

跟我的需求有點不一樣
以上方的案例來說
是在D:\FINAL下產生一個LastTime.txt
但此檔案內容只有一筆資料
2018/11/3 11:00 -> 所有檔案中的最大日期時間

請問這要如何調整呢?

comhlp iT邦新手 4 級 ‧ 2018-11-06 14:11:20 檢舉

你只是想要最新那個檔案 SHOW 出來?

comhlp iT邦新手 4 級 ‧ 2018-11-06 14:30:44 檢舉

你不就是要例出 D:\TEST下所有FILES 連日期時間並滙出到 D:\FINAL底下一個叫LASTTIE.TXT嗎

只要最新的檔案時間就可以了

comhlp iT邦新手 4 級 ‧ 2018-11-06 16:12:53 檢舉

forfiles /p D:\test /s /m *.txt /c "cmd /c echo @path @file @ftime @fdate >d:\final\lasttime.txt "

不要FILE 名和PATH就把 @PATH 和 @FILE抹走

comhlp大大,感謝您的回覆

測試上方指令的結果
是將d:\test內的.txt檔 檔案資訊輸出至d:\final\lasttime.txt中
看結果似乎沒有再比較時間

即使有2筆.txt資料,結果只有最後一筆.txt的檔案資訊

還需要如何修正呢?

comhlp iT邦新手 4 級 ‧ 2018-11-06 17:45:10 檢舉

你意思是 要用時間SORT ORDER嗎?

比較不是排序 是需要比大小
只需要輸出最大的日期時間

comhlp iT邦新手 4 級 ‧ 2018-11-06 17:57:56 檢舉

其實我不太明日你究竟想要些什麼? 請後進們支援
我的理解是
你要把D:\TEST裏所有FILES 跟 SUB FOLDER LIST 出來 並跟MODIFIED TIME 排序 然後EXPORT 到 D:\FINAL 中生成一個LASTTIME.TXT
照道理 你D:\TEST內如果不是只有一個檔案 生成的LASTTIME.TXT內不會只有一筆資料?

comhlp iT邦新手 4 級 ‧ 2018-11-06 18:06:08 檢舉

時間只有新舊 沒有大細 你意思是只要抽出D:\TEST\ 最近更身的檔案的資訊(包括日子時間)然後滙出到D:\FINAL\LASTTIME.TXT?

comhlp iT邦新手 4 級 ‧ 2018-11-06 18:06:09 檢舉

時間只有新舊 沒有大細 你意思是只要抽出D:\TEST\ 最近更身的檔案的資訊(包括日子時間)然後滙出到D:\FINAL\LASTTIME.TXT?

剛才再去找了一下資料
因為只有一個">",所以只會一直覆蓋同一筆資料
若要繼續編輯則要用">>"

調整後再嘗試,確實就跑出應該有的筆數

但想要的結果其實並不是所有的清單
而是**"日期時間最大的那一筆"**的資料

是否要在裡面用變數Keep來比較呢?

comhlp iT邦新手 4 級 ‧ 2018-11-07 09:57:08 檢舉

你沒有說過是累加...我覺得你用POWERSHELL 比較簡單 先給你SAMPLE 再給你 REF.自己查..Get-ChildItem D:\TEST\*.* -depth 2 | sort LastWriteTime | select FullName, lastWriteTime -last 1|Export-Csv -append D:\Final\lasttime.csv

Ref:
https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-ChildItem?view=powershell-6
https://superuser.com/questions/591438/how-can-i-display-the-time-stamp-of-a-file-with-seconds-from-the-command-line
https://stackoverflow.com/questions/9675658/powershell-get-childitem-most-recent-file-in-directory

comhlp iT邦新手 4 級 ‧ 2018-11-07 09:59:13 檢舉

如果一定要用DOS BATCH 行 POWERSHELL 這樣就可以了
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem D:\TEST\*.* -depth 2 | sort LastWriteTime | select FullName, lastWriteTime -last 1|Export-Csv -append D:\Final\lasttime.csv"

https://ithelp.ithome.com.tw/upload/images/20181107/20113169kNUdBOXynI.png

好像有地方有錯,是我的電腦問題嗎?

comhlp iT邦新手 4 級 ‧ 2018-11-07 14:18:20 檢舉

你先在POWERSHELL RUN一次再改用DOS 吧 你是用WINDOWS 7嗎? DEPTH 是POWERSHELL 5.0才有的參數

UPDATE POWERSHELL HERE:
https://www.microsoft.com/en-us/download/details.aspx?id=54616

抱歉,尚未進行升級
無法測試指令結果是否與需求相同

非常謝謝您

wwx
iT邦研究生 1 級 ‧ 2018-11-07 14:28:09
【**此則訊息已被站方移除**】
1
michaelwan
iT邦高手 1 級 ‧ 2018-11-07 15:31:07

log parser來處理這個很好用了. 雖然我自己還是會用WSH or PS來做比較多.

logparser "SELECT top 1 Path,LastWriteTime INTO D:\FINAL\LastTime.txt FROM D:\TEST\*.* ORDER BY LastWriteTime DESC" -RECURSE:-1 -i:FS -e:-1

看起來像是SQL指令
但沒有用過log parpser

就不做測試了
非常謝謝michaelwan大大的解說

我要發表回答

立即登入回答