2016-04-22 448 views
0

有點奇怪的事發生在我身上。 幾年前,我爲一個正在開發的項目提供了一個重命名批處理文件(包括StackOverflow在內的各種幫助)。 它會重命名一些文件並以父文件夾的前5個字符(即'12345 - Site')爲前綴。 我還沒有使用BAT文件好幾個月,現在有需要,但它不能正常工作。重命名BAT突然不能正常工作

它重命名這些文件,但它使用的是整個父文件夾,而不是僅僅前5個字符的。我已經在另一臺PC上測試過它,並將它運行在以前工作過的文件夾中。

沒有人有任何想法,爲什麼會發生這種情況,如何解決它,或者我可以添加到批處理文件來達到同樣的效果?

只是想指出,我是一個完整的新手,花了多少個夜晚,得到第一個批處理文件,通過從網絡上類似的批處理文件要求的試錯和剪切和粘貼工作。

我當前的代碼:

for %%z in ("%cd%") do (
for %%a in ("%%~dpz%\.") do (
for /f "delims=" %%i in ('dir /b /a-d *.pdf,*.xlsx,*.docx,*.xlsm') do move "%%i" "%%~nxz %%i")) 
+2

沒有什麼,可以縮短什麼「前5個字符」的代碼。如果它以前做過,那是另一批文件。 – Stephan

+0

它看起來像我的原始已經結束了。 :(有沒有辦法從中提取出前5個字符? – Legg1979

+1

您的批處理的意圖對我來說不清楚,第一個FOR循環應該只運行一次,用於當前目錄的值,以及索引%a第二次爲不使用的話,它只是重複使用第一個%Z指數。什麼是你想要的呢? –

回答

3

這應該爲你工作。

for %%z in ("%cd%") do (
    for %%a in ("%%~dpz%\.") do (
     for /f "delims=" %%i in ('dir /b /a-d *.pdf,*.xlsx,*.docx,*.xlsm') do call :renameStuff "%%i" "%%~nxz" 
     ) 
    ) 
goto :eof 

:renameStuff 
set "originalName=%~1" 
set "parentFolder=%~2" 
echo move "%originalName%" "%parentFolder:~0,5% %originalName%" 
exit /b 

你正在尋找的特定位是%parentFolder:~0,5%,這需要的%parentFolder%開始字符0和後5個字符停止子。這給你你正在尋找的前5個字符。

棘手的是,你不能在這些for循環%%z類型的變量上使用它。因此,你必須把它傳遞給另一個變量。此外,因爲你已經有了一些嵌套循環延遲擴張使得這實在難看,所以我通過可變進一個子程序(call :renameStuff "%%i" "%%~nxz")果然那些爲%1%2類型變量,然後傳遞入普通變量(set "originalName=%~1")這將與之合作。

+1

@ legg1979:'echo'只是將'move'命令打印到屏幕上,而不是執行它(安全原因)。一旦輸出看起來很好,只需刪除'echo'這個詞,你可能也想插入'@echo off'作爲第一行。它告訴腳本,在執行之前不要將每個命令都打印到屏幕上。 (這些都是非常基礎的,但是你聲稱是一個完整的noob,我認爲這是值得一提的) – Stephan

+0

'for %% a'循環(已經存在於原始代碼中)完全沒有意義,'%% a'是沒用過; (如果它有意義,它的集合'%%〜dpz%\。'應該讀取'%%〜dpz。');它枚舉當前目錄的父目錄的所有項目,但迭代項目從不使用;在每次迭代中,內部的for/F循環嘗試重命名這些文件,因此可能會發生這些文件最後有多個五個字符的前綴... – aschipfl

+0

@Wes Larson謝謝,您的代碼讓我想起了一個額外的部分可能在原來的。我確定它以某種方式被覆蓋。我現在雙倍支持它! – Legg1979