iT邦幫忙

1

我想要特定路徑內的資料夾依照"修改日期"搬移在同路徑下做分類,請問這批次檔有辦法寫嗎?

  • 分享至 

  • xImage

我想要特定路徑內的資料夾依照"修改日期"搬移在同路徑下做分類,請問這批次檔有辦法寫嗎?!
https://s.yimg.com/tr/i/296082a57fae47138ddd61c71a1e2378_C.png

ex:在"C:\aaa\A7LCD77194"資料夾 修改日期為 2017/7/19 我想在執行批次檔資料,資料夾(包含裡面的檔案)自動幫我搬移到,"C:\aaa\2017\7\19\A7LCD77194"並將資料夾裡所有的資料搬移進去
但是這個程式是會重覆執行的....所以希望下次執行時,已經搬移到"C:\aaa\2017"下的資料不用在更動
求解,感謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
蟹老闆
iT邦大師 1 級 ‧ 2018-03-06 00:09:58
最佳解答

請參考
假設批次檔在C:\aaa
由於這個操作是不可回復的,在執行測試前請先備份檔案,確認沒問題再使用於正式的場所
執行後會在 C:\BBB 依年月日新增多層次資料夾,並移到指定資料夾

@Echo Off
If '%1' NEQ '' (Call :put %1 %2 %3) Else (forfiles /c "Cmd /E:ON /c Call %~0 @fdate @file @isdir")
Echo 執行完畢
Pause
Exit
:put
Set Fdate=%1
If %3 EQU TRUE (
    MD C:\BBB\%Fdate:/=\% 2>Nul
    Move %2 C:\BBB\%Fdate:/=\%\%2
)
Exit

附註.資料夾沒有修改日期只有建立日期,猜測你要的是不是依檔案修改日期分類,如果是將IF 判斷式刪去即可

forfiles 感想:很多時候 forfiles 不會比 for 好用,但在部份情境下比 FOR 好用很多.
若以 FOR 的方式,因為不處理檔案,只抓取資料夾速度會快很多

SetLocal ENABLEDELAYEDEXPANSION
@Echo Off
For /D  %%i In (*) Do (
    Set Fdate=%%~ti
    Set Fdate=!Fdate:~0,10!
    MD C:\BBB\!Fdate:/=\! 2>Nul
    Move %%~ni C:\BBB\!Fdate:/=\!\%%~ni
)
Echo 執行完畢
pause

以上二種方式請自行參考

看更多先前的回應...收起先前的回應...
gnnuppke iT邦新手 5 級 ‧ 2018-03-13 15:43:13 檢舉

非常感謝你!想破頭也不知道這怎麼做到的...
請問~~目前測試部分(方法一)這個bat 一定要放在要分類的資料夾內才能進行資料夾分類的動作,因為看不懂不知道怎麼改,方便解譯一下嗎?
我想要把改成可給執行路徑的方式。

蟹老闆 iT邦大師 1 級 ‧ 2018-03-13 21:48:05 檢舉

批次檔己優化過,可以避免空白字元路徑問題

@Echo Off
Set Source=D:\AAA
Set Target=D:\BBB
If '%1' NEQ '' (Call :put %1 %2 %3 %4) Else (forfiles /p "%Source%" /c "Cmd /E:ON /c Call "%~0" @fdate @file @isdir @path")
Echo 執行完畢
Pause
Exit
:put
Set Fdate=%1
If %3 EQU TRUE (
    MD "%Target%\%Fdate:/=\%" 2>Nul
    Move "%4" "%Target%\%Fdate:/=\%\%2"
)
Exit

只要將底下二行修改成你要的就可以運作

Set Source=D:\AAA
Set Target=D:\BBB

說明

@Echo Off 停用回應功能
Set Source=D:\AAA 設定來源路徑
Set Target=D:\BBB 設定目標路徑
If '%1' NEQ '' (Call :put %1 %2 %3 %4) Else (forfiles /p "%Source%" /c "Cmd /E:ON /c Call "%~0" @fdate @file @isdir @path")
精華在這裡!設計邏輯是用forfiles迴圈能力多次執行這個批次檔
利用IF來判斷執行批次檔時是否帶有參數,如果沒有則執行forfiles,當第一次執行forfiles時實際上一開始執行的批次檔並未完成,它還在forfiles /p "%Source%" /c "Cmd /E:ON /c Call "%~0" @fdate @file @isdir @path"的位置上跑迴圈.
因為指定了呼叫自身這個批次檔 Cmd /E:ON /c Call "%~0" 並加上參數 @fdate @file @isdir @path , 當第二次執行這個批次檔時,因為 If '%1' NEQ '' 參數1不等於空,所以執行 Call :put %1 %2 %3 %4 標籤(:put)後的指令.
當執行到最後一行EXIT時forfiles會送出第二次的迴圈及第二個檔案的參數,然後重複到所有檔案結束.

Echo 執行完畢 顯示"執行完畢"字串
Pause 暫停
Exit 離開批次處理
:put 標籤
Set Fdate=%1 將檔案的建立或修改日期指定給變數Fdate
If %3 EQU TRUE ( 判斷是否為目錄.如是進行處理
MD "%Target%%Fdate:/=%" 2>Nul 建立一個資料夾 MD 路徑是 %Target%%Fdate:/=% 加上以年月日的路徑, %Fdate:/=% 將日期格式 0000/00/00 轉成 0000\00\00 正確的路徑格式,若MD 建目錄失敗時不顯示錯誤訊息 2>Nul
Move "%4" "%Target%%Fdate:/=%%2" 搬移資料夾到指定位置
)
Exit 離開批次處理

gnnuppke iT邦新手 5 級 ‧ 2018-04-02 17:12:13 檢舉

非常感謝~蟹老闆細心的解釋
讓我更了解,我不是那塊料,哈哈~~
目前使用上有兩個問題
1.因為我的"來源"跟"目的"是在同一個路徑下
而資料夾的年份有好幾個,所以發生的問題是,當第一次執行時
或創出"2017"跟"2018"的資料夾,而"2017"的創建日期是2018/4/2日
所以之二次執行時,2017這個資料夾就會被拉到2018\4\2裡面...
能否不搬動2017、2018跟之後年份的資料夾
ps.我所需要搬動的資料夾名稱長度固定是"10碼英文數字交雜"

2.因為執行批次檔時,可能資料夾正在被存入資料中,發現當資料夾被搬移後又創出同檔名的資料夾,日後又執行這個程式會造致資料夾整個被搬到一樣的路徑上
例如:
d:\5555555555\ooxx...<======裡面有上半段資料
第一次執行後
d:\2018\4\2\5555555555\ooxx...<======裡面有上半段資料
第二次執行後
d:\2018\4\2\5555555555\ooxx...<======裡面有上半段資料
d:\2018\4\2\5555555555\5555555555\ooxx...<======裡面有下半
段資料
能否直接覆製目錄下的檔案到目的資料夾
,請問這有解嗎?

蟹老闆 iT邦大師 1 級 ‧ 2018-04-02 22:01:43 檢舉
Set Source=D:\AAA
Set Target=D:\BBB

這個就能解決你的需求,資料屬性(已整理、未整理)不同,本不應放在同一資料夾,若要好管理可以新增一個上層資料夾例如:
D:\DATA <-存放區
D:\DATA\AAA <-未整理
D:\DATA\BBB <-已整理

2
comhlp
iT邦新手 4 級 ‧ 2018-03-05 14:45:12

你去CMD 打FORFILES /? 會有你要的答案

大概這樣

FORFILES /P C:\aaa\A7LCD77194 /D 19/7/2017 /C "cmd /c move @file C:\aaa\2017\7\19\A7LCD77194 /y"

MOVE =CUT & PASTE 所以不會存在重覆 除非你是COPY

我要發表回答

立即登入回答