2016-09-22 63 views
2

我經常必須重命名子文件夾結構中的數百個文件。我一直在創建一個包含所有重命名命令的批處理文件,並手動將其粘貼到每個子文件夾中,以便一次執行一個子文件夾。我想修改批處理腳本,以便一次執行所有子文件夾,從父目錄運行一次。跨子文件夾運行批處理腳本(遞歸)

我的重命名是非常手動的,所以我需要爲每個文件創建一個離散條目。例如,這裏有三條線:

REN STWP01_00669087* BCBSRI-01849351* 
REN BCBSRI-01849357* 2011-12-19_BCBSRI-01849357* 
REN STWP01_00669094* BCBSRI-01849369* 

我與FOR /R command實驗,包括試圖調用我的重命名批處理文件(通過CALL command)一個單獨的批處理文件。沒有運氣。

我不得不認爲這很簡單,但我是批處理新手,所以任何幫助將不勝感激。

謝謝!


@Magoo,

非常感謝您的回覆。到目前爲止,你的方法將比我自己的方法更有效率。

有幾個問題。請耐心等待,因爲我是帶批命令的總新手。

這是我所做的:我將你的代碼保存到一個.BAT文件(「RRename.bat」),根據你的指令修改我的文件名並將它們保存到一個文本文件(「Filenames.txt」),然後從命令行運行此命令:{RRename.bat Filenames.txt}。

生成的命令窗口確認正確的重命名。所以我刪除了ECHO和PAUSE命令並重新運行。沒有運氣。只是一堆命令窗口確認目錄。

理想情況下,我很想把它保存爲一個.BAT文件,並將其與頂層目錄一起放入包含舊文件名和新文件名的數據文件中。因此,雙擊「RRename.bat」將解析「Filenames.txt」的內容,並在所有子文件夾中工作,在遇到任何匹配時重命名。繁榮。

爲此目的:
1.我該如何做到這一點{SET「sourcedir =}指示當前目錄(即批處理文件所在的目錄)?這種方式我永遠不需要(我應該注意到,我在網絡位置上運行此腳本,這需要我映射驅動器,每次都會生成不同的驅動器號)。
2.如何硬編碼名稱把數據文件寫入腳本本身?我的目標是一個容易複製的過程,最大限度地減少用戶輸入(除了數據文件的內容)
3.如何阻止個別命令窗口出現?我將重命名數千一次一個文件,不想看到數千個相應的命令視窗。

謝謝!

+0

你有沒有考慮過PowerShell?如果你有系統的重命名方式,那麼你可以在PowerShell腳本中編寫它,如果你可以提供實際的文件名和它應該重命名爲csv文件的名字,那麼PowerShell腳本可以實現它。 如果您給我們舉例說明如何重命名它,那麼可能有人可以給你一些代碼。 – Junaid

+0

查看[這個答案](http://stackoverflow.com/questions/8397674/windows-batch-file-looping-through-directories-to-process-files/8398621#8398621)爲另一種更簡單的方法來做到這一點... – Aacini

回答

2
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
:: read parameters 
SET "filename1=%~1" 
SET "filename2=%~2" 
IF DEFINED filename2 GOTO name 
IF NOT DEFINED filename1 GOTO :EOF 
:: 1 parameter - must be filename 
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO START /min "ren %%a" "%~f0" %%a 
GOTO :eof 

:: we have 2 parameters so rename pattern 1 to pattern 2 

:name 
FOR /r "%sourcedir%" %%a IN ("%filename1%*") DO CALL :process "%%a" 
PAUSE 

GOTO :EOF 

:: Process the filenames and actually do the rename 
:process 
:: Name of file to be changed - name and extension of %1 
SET "changeme=%~nx1" 
:: REPLACE up-to-from-pattern with nothing = remainder of name/extension 
CALL SET "endpart=%%changeme:*%filename1%=%%" 
:: and RENAME... 
ECHO(REN "%~1" "%filename2%%endpart%" 
GOTO :eof 

你需要改變的sourcedir設置,以滿足您的具體情況。

修正後的數據文件

STWP01_00669087 BCBSRI-01849351 
BCBSRI-01849357 2011-12-19_BCBSRI-01849357 
STWP01_00669094 BCBSRI-01849369 

在處理上述文件,重命名文件開始(列1的條目),以開始針對

方法(列2的條目。):

運行批處理作爲

batchname文件名

這將執行批處理,處理文件名

如何:

具有被設置爲從,設置filename1&2到供給的參數的值開始處理的目錄名。

如果只有1被提供時,它是文件名,因此處理它線由行和START「在第一組的報價與窗口名稱」最小化的新方法/min和與所述數據執行該同批從依次文件的每一行,然後通過轉到:eof(結束文件 - 內置到CMD)完成

子過程都具有2個參數(例如BCBSRI-01849357 2011-12-19_BCBSRI-01849357),所以處理前進到:name。這將運行一個for /r循環,從指定的源的目錄,與來自第一塔+ *指定的名稱,並執行:process傳遞發現作爲參數1

:processchangeme到所討論的文件名的文件名,通過去除計算endpart字符串filename1changeme這將提供呃,結束部分。

然後只需將提供的文件名重命名爲endpart計算的替換名稱+。

爲了測試目的,所需的REN命令僅僅是ECHO驗證命令是否正確後,將ECHO(REN更改爲REN以實際重命名文件。

暫停只是讓建議的變化被看到。處理完成後,將PAUSE更改爲EXIT

AAMOI,運行

*batchname* STWP01_00669094 BCBSRI-01849369 

例如,將執行遞歸重命名從STWP01_00669094 *到BCBSRI-01849369 *


可悲的是, 「不走運」 是沒有意義的。

我對指示做了輕微的改動。測試後PAUSE應更改爲EXIT

測試後,ECHO(...行應成爲

REN "%~1" "%filename2%%endpart%" 

其實際執行的重命名。如果您剛刪除該行,則會解釋不可見結果。

恢復原始代碼並通過小代表性僞子樹進行驗證後,更改echo(...行並再次測試。文件名應該更改。如果不是,那麼某件事是非常錯誤的。不用說,這對我來說非常滿意...

然後再試一次,PAUSE更改爲EXIT。這一次,生成的窗口將顯示在任務欄上,然後在輸入文件的該行重命名完成時消失。例如BCBSRI-01849357 rentwo會發生一次 - 每個文件rename都不會發生一次。

硬編碼的文件名,刪除行

IF NOT DEFINED filename1 GOTO :EOF 

並更換

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO START /min "ren %%a" "%~f0" %%a 

FOR /f "usebackqdelims=" %%a IN ("YOURFILENAMEHERE") DO START /min "ren %%a" "%~f0" %%a 

對於 「運行從這裏」 命令,改變

SET "sourcedir=U:\sourcedir" 

SET "sourcedir=." 

.意味着 「當前目錄」

如果你把thisbatchfilename.bat到任意目錄上您PATH那麼你可以簡單地通過執行thisbatchfilename運行程序。

您可以在提示符下輸入

path 

顯示你的路徑。 PATH是如果在當前目錄中找不到可執行文件,Windows搜索的目錄序列。爲了提供路徑,谷歌「改變路徑窗口」 - 有經驗的批處理程序在批處理文件的路徑上創建一個單獨的目錄。有時,他們將目錄命名爲「鐘樓」。

+0

非常感謝您的幫助!我在問題中發佈了一些其他信息,如果您有任何其他想法,我將不勝感激。 – lneidorf

+0

@Magoo +1,我們需要更多這樣的答案 – samdd

相關問題