iT邦幫忙

0

使用bat批次檔做檔案歸類

  • 分享至 

  • xImage

各位前輩好,因為最近在整理電腦一些資料
由於資料量稍微龐大些,想說利用bat批次檔來整理比較快

其實小弟我只知道批次檔有這樣功能,但不知道怎麼撰寫下
我就拿去餵了Bing AI
但總是會出現問題

例如我的描述為
幫我做BAT程式
1.掃描資料夾下的檔案名稱
2.擷取檔案名稱的第5和第6字元
3.掃描資料夾下的子資料夾名稱
4.擷取子資料夾名稱的第1和第2字元
5.比較檔案名稱的第5和第6字元是否和子資料夾名稱的第1和第2字元相同
6.相同的時候顯示成功,否則顯示失敗
7.相同的時候匹配成功的檔案移動到匹配成功的資料夾裡

回答出來是

@echo off
setlocal enabledelayedexpansion
for %%a in (*) do (
    set filename=%%a
    set filechars=!filename:~4,2!
    for /d %%b in (*) do (
        set foldername=%%b
        set folderchars=!foldername:~0,2!
        if !filechars!==!folderchars! (
            echo Success: File !filename! matches folder !foldername!
            move !filename! !foldername!
        ) else (
            echo Failure: File !filename! does not match folder !foldername!
        )
    )
)
pause

就以執行結果來講

他是有執行做匹配的動作(因為會看到Success和Failure的顯示)
但是最後要移動檔案的部分卻沒有執行
顯示「命令語法不正確」

不知道這批次檔該怎麼改進比較好呢?
還請前輩不吝指教,謝謝!


這邊由於有前輩的回覆,我這邊改寫一下解答

@echo off
setlocal enabledelayedexpansion
for %%a in (*) do (
    set filename=%%a
    set filechars=!filename:~4,2!
    for /d %%b in (*) do (
        set foldername=%%b
        set folderchars=!foldername:~0,2!
        if !filechars!==!folderchars! (
            echo Success: File !filename! matches folder !foldername!
            
            rem 由於檔名和資料夾名屬於長檔名、特殊字元、空白等,需用"字串
            rem 可參考https://ithelp.ithome.com.tw/articles/10055209
                       
            move "!filename!" "!foldername!"
        ) else (
            echo Failure: File !filename! does not match folder !foldername!
        )
    )
)
pause
看更多先前的討論...收起先前的討論...
alien663 iT邦研究生 5 級 ‧ 2023-05-10 08:54:21 檢舉
有考慮過用python嗎?
我自己處理時,會為了好寫用python弄一弄了事XD
rucifa iT邦新手 5 級 ‧ 2023-05-10 09:23:01 檢舉
哈哈,其實不確定哪個比較好弄
之前有學了一點,但後續就沒有堅持下去(我搞這個其實也僅是應付日常工作,畢竟本業不是寫程式)

而且Python還要安裝程式(甚至更佳方便好用的插件資料庫)
有時想想算了,搞個批次檔搞不好比較快
如果是檔案文件的數據解析,我想這就只能用Python了
我還是不厭其煩的老調重彈.........批次檔真的太老舊了,真的要做這種事,建議用powershell 或 python 或其他有力的腳本語言來取代
MOVE 如果移動檔案到 不存在的資料夾,他其實作的是檔案更名的動作
例如 move AAA E:\AA
假如 E:\AA 不存在 AAA會變成 E:\AA,而不是 E:\AA\AAA
所以 ... 那個語法有BUG,要改
rucifa iT邦新手 5 級 ‧ 2023-05-10 15:26:40 檢舉
japhenchen大
我以前只知道bat批次檔這種東西,powershell雖然有聽過,但…說實在真的不會用
我也僅是偶爾遇到需要改善的大量檔案整理(一年不知道有沒有那麼個一次)
rucifa iT邦新手 5 級 ‧ 2023-05-10 15:42:06 檢舉
窮嘶發發發 大
感謝指證
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
re.Zero
iT邦研究生 5 級 ‧ 2023-05-09 23:27:18
最佳解答

如果只有 move !filename! !foldername! 出問題,我猜是 !filename! or !foldername! 有空白字元或特殊字元。
可以改成 move "!filename!" "!foldername!" (用"含括字串) 試試。

rucifa iT邦新手 5 級 ‧ 2023-05-10 08:09:01 檢舉

非常感謝,的確這個部分加入了"的話就成功移動了

我似乎搜尋到『長檔名或是特殊字元,無法辨識』,前後加上雙引號即可這說法(的確檔名長也是事實)
https://ithelp.ithome.com.tw/articles/10055209

re.Zero iT邦研究生 5 級 ‧ 2023-05-11 19:45:02 檢舉

@ rucifa :

rem 由於檔名和資料夾名屬於長檔名、特殊字元、空白等,需用"或是'字串
rem 可參考https://ithelp.ithome.com.tw/articles/10055209

  • 在 Batch 用 單引號 (') 含括字串的用法是哪來的? 我這邊測不出來。

    ( 如果是說 for 的部分使用情境, 那是特殊功能用法, 不是一般字串用法。 )

  • 這裡 所言:

    記得是不是 '' 單引號也行?

    這是疑問句, 不是肯定句, 沒實測或憑據就不要引用, 會自誤誤人喔~

rucifa iT邦新手 5 級 ‧ 2023-05-11 19:57:06 檢舉

@re.Zero
好的,這邊我修改一下

我要發表回答

立即登入回答