2014-03-27 21 views
2

在與Windows 7 PC的破折號,我用一個簡單的批處理腳本重命名一些Excel文件,預掛起他們的父文件夾名稱:如何處理的文件名

for /f "delims=" %%i in ('dir /b /AD') do (
    cd "%%i" 
    for /f "delims=" %%j in ('dir /b *.xl*') do ren "%%~j" "%%i_%%~j" 
    cd.. 
) 

我注意到某些文件產生了一個錯誤,「系統找不到指定的文件」。這些文件都在文件名中有一個破折號(—)。在我使用Windows資源管理器將em破折號改爲常規連字符( - )後,腳本在這些文件上運行良好。

我該如何幫助腳本重命名這些文件?

回答

1

你的問題是不是與批次變量:在命令行中能正常工作:

for %i in (*) do ren "%~i" "test_%~i" 

但是,從可以看出:

for /f "delims=" %i in ('dir /b /a-d') do @echo ren "%~i" "test2_%~i" 

dir /b正在改變EM衝上一個連字符,因此ren命令顯然不會找到要更改的文件。

爲了您的例子,你應該找到:

for /d %%i in (*) do (

for %%j in (*.xl*) do ... 

應該正常工作。

如果您因爲其他原因需要dir /b,我目前沒有看到解決方案。

(I有旋繞嘗試交換爲問號所有連字符,使用如SET /?CMD /?所描述的,允許任何字符來匹配,然後再次使用ren「環境變量替換」和「延遲的環境變量擴展」模式匹配忽略該問題。

SETLOCAL ENABLEDELAYEDEXPANSION 

for /f "delims=" %%I in ('dir /b /a-d') do (
Set K=%%I 
ren "!K:-=?!" "test2_!K:-=?!" 
) 

ren * x*x取代文件的開始,因此在插入test_之前,上述內容會替換帶有該位置內容的連字符。

所以最好這種方法可以做的是EM破折號轉換爲連有:

SETLOCAL ENABLEDELAYEDEXPANSION 

for /f "delims=" %%I in ('dir /b /a-d') do (
Set K=%%I 
ren "!K:-=?!" "test2_!K!" 
) 

並確認它是dir /b輸出這就是問題所在:在命令行上:

dir /b *—* > test.txt 

是一個em破折號,只會列出帶有破折號的文件,但在輸出文件中,例如Notepad test.txt,你只能找到連字符,並沒有破折號。

順便說一句我已經在Windows 8.1上完成了所有這些測試,其中VER顯示爲Microsoft Windows [Version 6.3.9600]

(正如我提到上面我確實有這個答案ren * x*,但取代的第一個字符用x,而不是將其插入,我一直以爲ren做到了!)

+0

謝謝你的提示,標記。使用(* .xl *)中的'%% j'確實很好,但現在還有另一個問題 - 從重命名過程中查看文件名被「回顯」,看起來好像在一個文件被重命名後它是動態地添加到列表中(僅在我的測試中出現三個中的第一個文件時),導致該文件被重命名兩次,例如「folderName_folderName_originalFilename」。有什麼辦法可以防止這種情況發生? –

+0

我想出了一個竅門 - 創建一個臨時文件夾,在重命名後移動文件,然後移回文件並刪除臨時目錄。 –