公司檔案有許多檔案的檔名及副檔名是EX:TC123456.789(英文字變化較少,主要是數字皆不近相同)請問該如何使用批次檔將檔案及附檔名變更為:TC123456789.log呢?
這類檔案有上萬筆,請各位批次檔高手幫幫忙!!!
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"
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"
如果還是得靠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
然後裡面的%要改成%%
我是需要放在批次檔中執行的,但可能我是新手在執行上顯示錯誤訊息,在麻煩幫我解答一下。
我設参數為
set sbc=
for %%i in (*) do set ext=%%~xi & ren "%%i" "%%~ni!ext:~1,3!.log"
顯示失敗,是参數設錯了嗎?
還是應該如何修改呢??在麻煩幫我解答,謝謝!
mo0904提到:
顯示失敗,是参數設錯了嗎?
在 SET 前加上
SETLOCAL ENABLEDELAYEDEXPANSION
可以執行了!!!!謝天謝地!!!
原來還要加上延遲變數執行才會正常,可以知道什麼情況該加嗎?
不過,我的主程式也全部改成.LOG了......XD
SETLOCAL ENABLEDELAYEDEXPANSION
我忘了有這個...感謝
原來還要加上延遲變數執行才會正常,可以知道什麼情況該加嗎?
因為你不開延遲變數的話,跑FOR迴圈時,他會直接抓FOR執行前的變數值,然後接下來迴圈跑的都會是同一個值...
開了變數延遲之後,他就會每次跑都抓一次目前的值。
然後會改用!變數!,而不是%變數%
我的主程式也全部改成.LOG了
把(*)裡面的*改成你要更換檔名的條件阿,可以用萬用字元,例如改成(TC*)
謝謝大大~~剛剛將條件放上去就行了!!
我嘗試加入"檔案長度"共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.....殘念
還要在麻煩各位高手了~~~
不了解你說的的檔案長度指的是什麼,不過你的例子無法得到正確的值
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的規則,例名檔名長度是否一致、檔名是否有規則性、附檔名類型有哪些等
補充:
雖然可將批次檔改成不會修改曾改過的檔案,為了管理方便會將改過的檔案存到另一個地方.
謝謝大大~~~本想經過檔案的長度讓程式判定是否為正確檔案而修改正確檔名。試了很久,於是把"改檔名"程式寫成批次檔B放在根目錄下讓批次檔A去呼叫,結果呼叫後變成批次檔A可以正常執行但"改檔名"的批次檔B卻無法執行(但單獨執行它是沒問題的),不知道問題出在哪?
把你的批次檔貼上來看是哪兒問題
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
其實沒什麼改,可是呼叫後無法執行。
<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批次檔與捷徑意思雷同.
在麻煩大大指點...路徑加入後還是沒執行成功。
在A批次檔呼叫前加入路徑:
cd\
cd d:\backup\rsc
call D:\BACKUP\RSC\change.bat
或在B批次檔環境變數前加入路徑:
cd\
cd d:\backup\rsc
setlocal enabledelayedexpansion
都有產生問題,還是有哪邊遺漏了呢?
ren *.* *.log
他問的不是這樣...
他問的是要把檔名跟副檔名合併起來
了解
解出來了
forfiles /C "cmd /c rename @file @fname @ext"
forfiles /C "cmd /c rename @file @fname.log"
內建的不用下載
但...@fname @ext 都會有帶雙引號耶,你不會嗎?
我有測過了 可以 run
forfiles 對於我這種不會寫程式的人還算好用
xp 沒有內建要另外下載
但...@fname @ext 都會有帶雙引號耶,你不會嗎?
對不起 我不知道要加雙引號但是真的可以跑
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"
大概不同的OS會有不同的狀況發生
我在8.1當中跑的是會帶雙引號
設批次檔名為 myrename.bat
程式碼如下:
<pre class="c" name="code">
set FILE=%~n1
set DOTEXT=%~x1
set EXT=%DOTEXT:~1%
ren %1 %FILE%%EXT%.log
執行結果如下:
<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>
以前寫的小工具可以試試
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
分兩次進行, 之後加附檔名的部分應該不用贅述 大家都會吧