2015-09-02 148 views
0

我從Project Gutenberg下載了大約34000本.txt格式的圖書。現在我想根據它的內容重新命名它們。例如,每個文本文件都包含其「標題」和「作者姓名」,因此我想通過一些命令重命名其「標題」和「作者姓名」上的所有文本文件。批量重命名.txt文件

我創建了一個批處理文件。它運行但不重命名文件。這是我的代碼:

@echo off&setlocal 
    cd E:\Test 
    for /f "delims=" %%i in ('dir /a-d/b *.txt') do (
    set "nname=" 
    set "fname=%%~i" 
    for /f "usebackqskip=7delims=" %%f in ("%%~i") do if not defined nname  
    set "nname=%%f" 
    setlocal enabledelayedexpansion 
    set "nname=!nname:~0,40!" 
    echo rename "!fname!" "!nname!" 
    endlocal 
    ) 
+2

你的腳本不會重命名文件,因爲它不會嘗試(它不會在任何地方調用'ren',也不會''移動')。你的問題到底是什麼? – stakx

+0

感謝您的回覆。我的問題是,我需要一個腳本,通過其內容重命名文本文件。例如,一個文本文件名是9767.text,這個文件包括「作者:本約翰遜」。現在我想用腳本替換它的作者姓名「Ben Johnson」上的這個文件(9767.text)。我有34000個文本文件,其名稱是這樣的。 –

回答

0

您可以使用此作爲基礎

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem Change to source folder 
    pushd "e:\test" && (

     rem Where the renamed files will be placed to avoid re-rename 
     if not exist renamed\ md renamed 

     rem For each input file 
     for %%f in (*.txt) do (

      rem Retrieve the data from inside the file 
      set "author=" & set "title=" 
      for /f "tokens=1,* delims=: " %%a in (' 
       findstr /b "Author: Title:" "%%~ff" 
      ') do if not defined %%a set "%%a=%%b" 

      rem If the fields have been retrieved then do the rename 
      if defined author if defined title (
       setlocal enabledelayedexpansion 
       for /f "delims=" %%a in ("!author! - !title!") do (
        endlocal 
        echo move "%%~ff" "renamed\%%a%%~xf" 
        rem NOTE: operation is only echoed to console 
        rem  if console output seems correct, then 
        rem  remove the echo command 
       ) 
      ) 

     ) 
     rem Done. Return to previous active directory 
     popd 
    ) 

當然,文件系統有規則關於文件名中允許的內容,並且不知道可以找到哪種字符,則此代碼可能並可能無法重命名某些文件。

+0

代碼正在運行並創建一個文件夾,但文件夾爲空。 –

+0

@SaqibAlam,你有沒有在代碼中使用'NOTE'文本?操作僅與控制檯相呼應。你有沒有刪除'回聲'? –

+0

是的。有效 :) –

0

您當前的腳本將只打印重命名命令,而不執行它們。您應該刪除echo(後檢查它所產生)這一行:

echo rename "!fname!" "!nname!" 

您的腳本也有一些格式問題。應該有空間這樣的:

for /f "usebackq skip=7 delims=" %%f in ("%%~i") do 

而就後應該沒有換行:

if not defined nname 
+0

給予這個錯誤「E:\測試> fixfile 重複的文件名存在,或者文件 無法找到 重複的文件名存在,或者文件 無法找到 重複的文件名存在,或無法找到文件 「。 –

+0

@SaqibAlam我只是指出腳本中的明顯錯誤。我無法保證它做到了你的意圖,因爲我找不到你的描述和你提供的代碼(多於_batch_和_rename_)之間的任何關係。 – Melebius