在資料夾下有各式各樣的檔案,不限定是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來跑 可是不知道怎麼下比較好,請大大指教
如果只是單純的要列出最後一個(最新)時間點以下做法可以達成,但是若有二個相同時間點的檔案無法處理,它只會處理最後一個。
使用方法:
將以下語法貼到.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中
理解,不是統計各個子資料夾而是所有子資料夾中最新(最大)的檔案.
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蟹老闆:
上方指令可行 檔案內容也與需求一致
非常感謝您
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 -> 所有檔案中的最大日期時間
請問這要如何調整呢?
你只是想要最新那個檔案 SHOW 出來?
你不就是要例出 D:\TEST下所有FILES 連日期時間並滙出到 D:\FINAL底下一個叫LASTTIE.TXT嗎
只要最新的檔案時間就可以了
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的檔案資訊
還需要如何修正呢?
你意思是 要用時間SORT ORDER嗎?
比較不是排序 是需要比大小
只需要輸出最大的日期時間
其實我不太明日你究竟想要些什麼? 請後進們支援
我的理解是
你要把D:\TEST裏所有FILES 跟 SUB FOLDER LIST 出來 並跟MODIFIED TIME 排序 然後EXPORT 到 D:\FINAL 中生成一個LASTTIME.TXT
照道理 你D:\TEST內如果不是只有一個檔案 生成的LASTTIME.TXT內不會只有一筆資料?
時間只有新舊 沒有大細 你意思是只要抽出D:\TEST\ 最近更身的檔案的資訊(包括日子時間)然後滙出到D:\FINAL\LASTTIME.TXT?
時間只有新舊 沒有大細 你意思是只要抽出D:\TEST\ 最近更身的檔案的資訊(包括日子時間)然後滙出到D:\FINAL\LASTTIME.TXT?
剛才再去找了一下資料
因為只有一個">",所以只會一直覆蓋同一筆資料
若要繼續編輯則要用">>"
調整後再嘗試,確實就跑出應該有的筆數
但想要的結果其實並不是所有的清單
而是**"日期時間最大的那一筆"**的資料
是否要在裡面用變數Keep來比較呢?
你沒有說過是累加...我覺得你用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
如果一定要用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"
好像有地方有錯,是我的電腦問題嗎?
你先在POWERSHELL RUN一次再改用DOS 吧 你是用WINDOWS 7嗎? DEPTH 是POWERSHELL 5.0才有的參數
UPDATE POWERSHELL HERE:
https://www.microsoft.com/en-us/download/details.aspx?id=54616
抱歉,尚未進行升級
無法測試指令結果是否與需求相同
非常謝謝您
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