iT邦幫忙

0

如何使用批次檔變更檔名及副檔名呢?

mo0904 2014-10-09 00:54:1525294 瀏覽

公司檔案有許多檔案的檔名及副檔名是EX:TC123456.789(英文字變化較少,主要是數字皆不近相同)請問該如何使用批次檔將檔案及附檔名變更為:TC123456789.log呢?
這類檔案有上萬筆,請各位批次檔高手幫幫忙!!!

看更多先前的討論...收起先前的討論...
蟹老闆 iT邦大師 1 級 ‧ 2014-10-13 12:20:02 檢舉
已結案不能補充在這討論
在B批次檔中加入 pause 這樣可以查看錯誤訊息
mo0904 iT邦新手 5 級 ‧ 2014-10-13 13:38:53 檢舉
謝謝大大~後來總算執行成功了。

for %%i in ("%~pd0SC??????.???" "%~pd0SB??????.???") do set ext=%%~xi & ren "%~pd0%%i" "%~pd0%%~ni!ext:~1,3!.log"

嘗試執行後無法成功,可以請大大指導一下嗎?
蟹老闆 iT邦大師 1 級 ‧ 2014-10-13 15:36:01 檢舉
這個方法可以執行,為什麼你那執行後無法成功要看錯誤訊息,如果是什麼訊息都沒有的話有幾個可能
1.這個批次需要與SC及SB檔同一路徑
2.檔名需為SC或SB開頭且後面接著6個任意字元
3.副檔名必定是3個字元
4.一樣要加 setlocal enabledelayedexpansion
蟹老闆 iT邦大師 1 級 ‧ 2014-10-13 15:37:30 檢舉
補充:
上面指的檔名不是指批次檔檔名
mo0904 iT邦新手 5 級 ‧ 2014-10-13 16:10:55 檢舉
有,訊息是:檔案名稱、目錄名稱或磁碟區標籤語法錯誤。

但我是放在同一個目錄底下的(D:\backup。檔案名稱也是SC,SB開頭。不太懂標籤語法錯誤是指?
mo0904 iT邦新手 5 級 ‧ 2014-10-13 16:16:34 檢舉
對了,在執行檔案更名時會在所有的檔名向後移補上.log,若原始資料已有.log可否選擇不執行它呢??

因為原始已有.Log的狀況下變成"SB123456789 log.log"。
小成 iT邦高手 10 級 ‧ 2014-10-13 17:05:43 檢舉
mo0904提到:
for %%i in ("%~pd0SC??????.???" "%~pd0SB??????.???") do set ext=%%~xi & ren "%~pd0%%i" "%~pd0%%~ni!ext:~1,3!.log"


改這樣試試
for %%i in ("%~pd0SC??????.???" "%~pd0SB??????.???") do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"
小成 iT邦高手 10 級 ‧ 2014-10-13 17:17:19 檢舉
中間的話我目前只知道土法煉鋼法,不過我有疑問,明明已前用 ?????? 是指一定要剛好六個字元的,怎麼現在其他超過六個字元的也一併也被包括在內了...?

for %%i in (%~pd0S*.0* %~pd0S*.1* %~pd0S*.2* %~pd0S*.3* %~pd0S*.4* %~pd0S*.5* %~pd0S*.6* %~pd0S*.7* %~pd0S*.8* %~pd0S*.9*) do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log" 
mo0904 iT邦新手 5 級 ‧ 2014-10-13 17:42:45 檢舉
謝謝大大,更改後可以執行了。

因為部份檔案也許之前就更名為:"SB123456789.log",但在系統執行時會偵測它該檔SB*開頭,就會變"SB123456789 log.log"了。所以才想是否能在加入判斷的方式?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
6
小成
iT邦高手 10 級 ‧ 2014-10-09 09:27:15
最佳解答

如果還是得靠SET的話,我是想到用這樣...
先執行

<pre class="c" name="code">cmd /v:on

來啟用延遲環境變數展開
然後執行下面這指令

<pre class="c" name="code">for %i in (*) do set ext=%~xi & ren "%i" "%~ni!ext:~1,3!.log"

如果要放批次檔跑,記得跑的命令提示字元要加參數 /v:on
然後裡面的%要改成%%

看更多先前的回應...收起先前的回應...
mo0904 iT邦新手 5 級 ‧ 2014-10-09 12:29:12 檢舉

我是需要放在批次檔中執行的,但可能我是新手在執行上顯示錯誤訊息,在麻煩幫我解答一下。

我設参數為
set sbc=
for %%i in (*) do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"
顯示失敗,是参數設錯了嗎?
還是應該如何修改呢??在麻煩幫我解答,謝謝!

蟹老闆 iT邦大師 1 級 ‧ 2014-10-09 12:37:27 檢舉

mo0904提到:
顯示失敗,是参數設錯了嗎?

在 SET 前加上
SETLOCAL ENABLEDELAYEDEXPANSION

mo0904 iT邦新手 5 級 ‧ 2014-10-09 13:44:25 檢舉

可以執行了!!!!謝天謝地!!!
原來還要加上延遲變數執行才會正常,可以知道什麼情況該加嗎?

mo0904 iT邦新手 5 級 ‧ 2014-10-09 14:05:03 檢舉

不過,我的主程式也全部改成.LOG了......XD

Orz

小成 iT邦高手 10 級 ‧ 2014-10-09 14:47:00 檢舉

SETLOCAL ENABLEDELAYEDEXPANSION

我忘了有這個...感謝

原來還要加上延遲變數執行才會正常,可以知道什麼情況該加嗎?

因為你不開延遲變數的話,跑FOR迴圈時,他會直接抓FOR執行前的變數值,然後接下來迴圈跑的都會是同一個值...
開了變數延遲之後,他就會每次跑都抓一次目前的值。
然後會改用!變數!,而不是%變數%

我的主程式也全部改成.LOG了

把(*)裡面的*改成你要更換檔名的條件阿,可以用萬用字元,例如改成(TC*)

mo0904 iT邦新手 5 級 ‧ 2014-10-09 16:37:15 檢舉

謝謝大大~~剛剛將條件放上去就行了!!
我嘗試加入"檔案長度"共11個字元的辨識(實在很擔心檔名衝突後全部都改了),但是確無法辨識
SET SCB=
for /f "tokens=1,3" %%i in ("TC*" "AB*") do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"--->辨識失敗

SET SCB=
for /f "tokens=1,3" %%i in ("*.*") do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"----->好像只有.123能辨識但轉出來變.log.....殘念
還要在麻煩各位高手了~~~

蟹老闆 iT邦大師 1 級 ‧ 2014-10-09 17:16:43 檢舉

不了解你說的的檔案長度指的是什麼,不過你的例子無法得到正確的值

mo0904提到:
for /f "tokens=1,3" %%i in ("TC*" "AB*") do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"--->辨識失敗

SET SCB=
for /f "tokens=1,3" %%i in ("*...(恕刪)

如果你說的是第二次執行後會不會又改到第一次執行的 <---會
如何修正需要檔名TC或AB的規則,例名檔名長度是否一致、檔名是否有規則性、附檔名類型有哪些等

蟹老闆 iT邦大師 1 級 ‧ 2014-10-09 17:19:18 檢舉

補充:
雖然可將批次檔改成不會修改曾改過的檔案,為了管理方便會將改過的檔案存到另一個地方.

mo0904 iT邦新手 5 級 ‧ 2014-10-10 02:28:34 檢舉

謝謝大大~~~本想經過檔案的長度讓程式判定是否為正確檔案而修改正確檔名。試了很久,於是把"改檔名"程式寫成批次檔B放在根目錄下讓批次檔A去呼叫,結果呼叫後變成批次檔A可以正常執行但"改檔名"的批次檔B卻無法執行(但單獨執行它是沒問題的),不知道問題出在哪?

蟹老闆 iT邦大師 1 級 ‧ 2014-10-10 11:49:54 檢舉

把你的批次檔貼上來看是哪兒問題

mo0904 iT邦新手 5 級 ‧ 2014-10-12 14:52:28 檢舉

A批次檔:call D:\BACKUP\RSC\change.bat
b批次檔:
@echo off

setlocal enabledelayedexpansion

set file=

for %%i in ("SC*" "SB*") do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"

END

其實沒什麼改,可是呼叫後無法執行。

蟹老闆 iT邦大師 1 級 ‧ 2014-10-12 23:35:21 檢舉
&lt;pre class="c" name="code">
setlocal enabledelayedexpansion
for %%i in ("%~pd0SC??????.???" "%~pd0SB??????.???") do set ext=%%~xi & ren "%~pd0%%i" "%~pd0%%~ni!ext:~1,3!.log"

原因是原本在上層執行A批次檔,當呼叫B批次檔時SC*程式所在的路徑為上層路徑,所以無法查詢到RSC路徑內的檔案.

加上路徑後就可以得到正確的結果了,上面做的修改只會對檔案名稱為 SC 及 SB 開頭且後面包含是6個字元檔名及3個字元副檔名的檔案有效,如果要改完檔名後放到其它資料夾可改用 MOVE 指令.

在不變更B批次檔的情狀況也是可以修正執行結果,只要將B批次檔建立一個捷徑,要使用時點選該捷徑就可以了,因為A批次檔與捷徑意思雷同.

mo0904 iT邦新手 5 級 ‧ 2014-10-13 01:17:53 檢舉

在麻煩大大指點...路徑加入後還是沒執行成功。

在A批次檔呼叫前加入路徑:
cd\
cd d:\backup\rsc
call D:\BACKUP\RSC\change.bat

或在B批次檔環境變數前加入路徑:
cd\
cd d:\backup\rsc
setlocal enabledelayedexpansion

都有產生問題,還是有哪邊遺漏了呢?

8
hon2006
iT邦大師 1 級 ‧ 2014-10-09 08:43:14

ren *.* *.log

看更多先前的回應...收起先前的回應...
小成 iT邦高手 10 級 ‧ 2014-10-09 09:00:21 檢舉

他問的不是這樣...
他問的是要把檔名跟副檔名合併起來

hon2006 iT邦大師 1 級 ‧ 2014-10-09 09:09:57 檢舉

了解

hon2006 iT邦大師 1 級 ‧ 2014-10-09 10:38:57 檢舉

解出來了
forfiles /C "cmd /c rename @file @fname @ext"
forfiles /C "cmd /c rename @file @fname.log"

hon2006 iT邦大師 1 級 ‧ 2014-10-09 10:42:02 檢舉
小成 iT邦高手 10 級 ‧ 2014-10-09 11:46:43 檢舉

內建的不用下載
但...@fname @ext 都會有帶雙引號耶,你不會嗎?

hon2006 iT邦大師 1 級 ‧ 2014-10-09 11:48:26 檢舉

我有測過了 可以 run

hon2006 iT邦大師 1 級 ‧ 2014-10-09 11:50:23 檢舉

forfiles 對於我這種不會寫程式的人還算好用

hon2006 iT邦大師 1 級 ‧ 2014-10-09 12:17:21 檢舉

xp 沒有內建要另外下載
但...@fname @ext 都會有帶雙引號耶,你不會嗎?
對不起 我不知道要加雙引號但是真的可以跑

蟹老闆 iT邦大師 1 級 ‧ 2014-10-09 12:18:39 檢舉

hon2006提到:
forfiles /C "cmd /c rename @file @fname @ext"
forfiles /C "cmd /c rename @file @fname.log"

一行就可以了
forfiles /C "cmd /c rename @file @fname@ext.Log"

小成 iT邦高手 10 級 ‧ 2014-10-09 14:38:20 檢舉

大概不同的OS會有不同的狀況發生
我在8.1當中跑的是會帶雙引號

小成 iT邦高手 10 級 ‧ 2014-10-09 14:42:38 檢舉

hon2006 iT邦大師 1 級 ‧ 2014-10-09 14:56:30 檢舉

用 echo 會,rename 則不會

player iT邦大師 1 級 ‧ 2014-10-09 23:20:49 檢舉

檔名與路徑要用雙引號字元包起來
是為了避免檔名或路徑之中有空白字元所導致的誤判
基本上在處理非8.3的長檔名時, 都建議用雙引號把整個檔名包起來

14
海綿寶寶
iT邦大神 1 級 ‧ 2014-10-09 09:02:56

設批次檔名為 myrename.bat
程式碼如下:

&lt;pre class="c" name="code">
set FILE=%~n1
set DOTEXT=%~x1
set EXT=%DOTEXT:~1%
ren %1 %FILE%%EXT%.log

執行結果如下:

&lt;pre class="c" name="code">
C:\Temp>myrename TC123456.789

C:\Temp>set FILE=TC123456

C:\Temp>set DOTEXT=.789

C:\Temp>set EXT=789

C:\Temp>ren TC123456.789 TC123456789.log
系統找不到指定的檔案。

C:\Temp>
看更多先前的回應...收起先前的回應...
小成 iT邦高手 10 級 ‧ 2014-10-09 09:09:38 檢舉

果然還是得用到SET嗎?
我本來想看有沒有人有不用SET的解法...
XD

hon2006 iT邦大師 1 級 ‧ 2014-10-09 09:16:42 檢舉

shell script 可能比較簡單

拍手

hon2006 iT邦大師 1 級 ‧ 2014-10-09 09:28:54 檢舉
hon2006 iT邦大師 1 級 ‧ 2014-10-09 09:32:02 檢舉

如果先把每個檔案加上 .log 檔,然後再把每個檔案的第一個逗點去掉的批次會不會比較好寫

蟹老闆 iT邦大師 1 級 ‧ 2014-10-09 12:22:44 檢舉

hon2006提到:
如果先把每個檔案加上 .log 檔,然後再把每個檔案的第一個逗點去掉的批次會不會比較好寫

用esyc的解答改一下結果一樣方法不同
for %i in (*) do set ext=%~xi & ren "%i" "!ext:.=!.log"

蟹老闆 iT邦大師 1 級 ‧ 2014-10-09 12:35:23 檢舉

發問人會不會再出現都不知道呢

那是一定要的啦哈哈哈哈哈哈

小成 iT邦高手 10 級 ‧ 2014-10-09 14:48:55 檢舉

dream提到:
!ext:.=!

多學一招XD
讚

4
wwx
iT邦好手 1 級 ‧ 2014-10-10 10:12:04

以前寫的小工具可以試試

http://ftw.edu.wwx.tw/solutions/xing-qing-cheng-shi-shuo-ming/log_killers/log_killer_files/renspec.rar?attredirects=0&d=1
用來變更檔名中的第一順位符合的字串內容置換成想要的新內容,檔名支援萬用字元與Unicode

Usage:
renspec "filenameToBeModify" "WordToBeReplace" "NewWord"

for Exam:
renspec "Pili[xyz]005" "[xyz]" ""
change filename "Pili[xyz]005" to "Pili005"

執行結果
renspec "TC*.*" "." ""
"TC123456.789"==>change to"TC123456789" ok.

先把全部副檔名那個小點消去後再統一加上想要的新副檔名 .log
分兩次進行, 之後加附檔名的部分應該不用贅述 大家都會吧臉紅

我要發表回答

立即登入回答