windows批處理之七-變數延遲擴充套件與檔案重新命名

regonly1發表於2015-02-16
之前從sqlserver備份了大量儲存過程,以每個儲存過程一個檔案的方式匯出。格式如下:
資料庫名稱.架構名稱.過程名稱,如:ods_data.dbo.sp_etl_channelno.sql
通常這種檔名看起來比較麻煩,有的檔名長點的就被省略掉了。所以,希望能夠將檔名的字首都截掉,保留實際的儲存過程名稱即可。

如果只有幾個檔案,那可以直接手工修改。但是,如果有幾十個上百個,手工處理就不那麼讓人愉快了。所以,這個時候就需要批處理出馬。

那麼,批處理該怎麼做?

我的理解是,用for迴圈遍歷出檔名,然後依次rename即可。所以,就有了如下程式碼:
for /F %%i in('dir *.sql') do (
rename %%i %i:~13%
)
跑了之後,發現不對。開始以為是字串擷取的語法寫錯了。查了下,沒錯。於是上網找案例。發現很多重新命名的案例都會出現感嘆號引用變數的情況,不明白為何意。
於是又搜尋“批處理 感嘆號”的關鍵字,結果出來有關變數延遲擴充套件的概念,再補習了下這塊概念。
發現微軟對於DOS指令碼語言的支援確實比較弱,好好的一段程式碼,硬是被直譯器解釋的奇奇怪怪,再到讓人詬病的for迴圈語法,讓人無法理解。
好了,言歸正傳,學習了變數延遲擴充套件的概念後,就知道為什麼我的for迴圈用不了了。

首先,申明要變數延遲擴充套件:
setlocal ENABLEDELAYEDEXPANSION

然後,告訴直譯器,變數在什麼情況下要延遲(即感嘆號代替百分號引用),如:
set b=!b:~1!

完整的程式碼如下(擷取13位以後的檔名):
@echo off
setlocal ENABLEDELAYEDEXPANSION

for /f %%a in ('dir /b *.sql') do (
set b=%%a
set b=!b:~13!
ren "%%a" "!b!"
)


pause



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-1437270/,如需轉載,請註明出處,否則將追究法律責任。

相關文章