2015-09-02 149 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