首先,这里有几个类似的问题(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。
提前致谢,
克里斯
答案 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
以实际重命名文件。