根据内容中的多个字符串重命名文本文件

时间:2014-04-15 22:42:22

标签: batch-file

首先,这里有几个类似的问题(Rename file based on file Content batch file是我试图回答的问题 - 但我并不知道我在做什么),不过我找不到任何符合我确切需求的东西,这是我第一次真正涉足批量编程,所以语法对我来说还是个新鲜事。

问题:

我有几百个文本文件,名称不同,标题的格式如下:

"Event Type : Full Histogram"
"Serial Number : xxxxxx"
"Version :  V 10.60-8.17 "
"File Name : W133FA0Z.580H"
"Histogram Start Time : 12:39:08"
"Histogram Start Date : 2014-04-11"

我希望尽可能创建一个批处理文件,将文件夹中的所有文件重命名为以下格式:

StartDate StartTime

所以对于这个例子:

2014-04-11 12:39:08 

我的问题在于我不确定如何将其指向哪里找到字符串(如果只是一行)(我已尝试编辑上面发布的问题中的答案) )。此外,我不知道如何添加第二位代码来查找StartTime字符串,然后将其附加到StartDate。

提前致谢,

克里斯

4 个答案:

答案 0 :(得分:1)

这是一种非常有效的方法。

@echo off
pushd "pathToYourFolderContainingFilesToRename"
for /f "tokens=1,3 delims=:" %%A in (
  'findstr /bc:^"\"Histogram Start Date :" *.txt'
) do for /f delims^=^"^  %%C in (
  "%%B"
) do for /f tokens^=4-6^ delims^=^":^  %%D in (
  'findstr /bc:^"\"Histogram Start Time :" "%%A"'
) do ren "%%A" "%%C %%D.%%E.%%F.txt"
popd

第一个循环有两个目的。它建立包含开始日期字符串的文件名,并返回每个文件的日期字符串。

第二个循环从日期字符串中删除空格和引号。

第3个循环从文件中解析出开始时间。

第二个和第三个循环具有非常笨拙的语法,可以在分隔符列表中包含引号。第二个循环将DELIMS设置为引号和空格。第3集DELIMS引用,冒号和空格。

答案 1 :(得分:0)

以下内容将获得您想要的输出,输出将显示为2014-04-11 123908

@echo off

set file=test.txt

for /f "delims=: tokens=2-4" %%a in ('find "Time" %file%') do set ftime=%%a%%b%%c
for /f "delims=: tokens=2"   %%a in ('find "Date" %file%') do set fdate=%%a

echo %fdate:~1,-1% %ftime:~1,-1%

如果所有文件都在同一目录中,那么您可以在另一个for循环中执行此操作。

@echo off
setLocal enableDelayedExpansion
for /f %%f in ('dir C:\whatever\path\*.txt /B') do (    
    for /f "delims=: tokens=2-4" %%a in ('find "Time" %%a') do set ftime=%%a%%b%%c
    for /f "delims=: tokens=2"   %%a in ('find "Date" %%a') do set fdate=%%a
    ren "%%~a" "!fdate:~1,-1! !ftime:~1,-1!.txt"
)

这会将指定目录中的所有文本文件重命名为其内容中的日期和时间。请注意,这不会考虑在其内容中包含日期和时间的文本文件。您可以(也可能应该)根据需要添加。

答案 2 :(得分:0)

假设您 JUST 的文件格式与工作目录中的描述类似:

@echo off&cls

setlocal EnableDelayedExpansion

for %%x in (*.txt) do (
set /a $sw=1
for /f "skip=4 tokens=2-4 delims=:" %%a in ('type "%%x"') do (
if !$sw! equ 1 set $Time=%%a-%%b-%%c
if !$sw! equ 2 (
set $Date=%%a
call:DoRen !$Time:~1,-1! !$Date:~1,-1! %%~nx%%~xx)
set /a $sw+=1
)
)
exit/b

:DoRen

echo ren "%3" "%2 %1"

如果输出正常,您可以删除echo

答案 3 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
DEL incorrectformat.log 2>nul
DEL alreadyprocessed.log 2>nul
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%a IN ('dir /b /a-d "%sourcedir%\*.txt" ') DO (
 SET keepprocessing=Y
 SET "newname="
 FOR /f "tokens=1-5delims=:" %%b IN (
   'TYPE "%sourcedir%\%%a"^|findstr /n /r "$" ') DO IF DEFINED keepprocessing (
  IF %%b==1 IF NOT "%%~c"=="Event Type " SET "keepprocessing="&>>incorrectformat.log ECHO %%a
  IF %%b==5 SET newname=%%d%%e%%f
  IF %%b==6 (
   SET "keepprocessing="
   SET "newname=%%d!newname!.txt"
   SET "newname=!newname:"=!"
   SET "newname=!newname:~1!"
   IF "!newname!"=="%%a" (>>alreadyprocessed.log ECHO(%%a) ELSE (ECHO REN "%sourcedir%\%%a" "!newname!")
  )
 )
)

GOTO :EOF

这是我的版本。

您需要将sourcedir的值设置为目标目录。 与incorrectformat.log生成的文件列表不符合指定的格式 已处理文件的列表将生成为alreadyprocessed.log

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO REN更改为REN以实际重命名文件。