使用BATCH文件使用文件中的部分行重命名多个文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用BATCH文件使用文件中的部分行重命名多个文件相关的知识,希望对你有一定的参考价值。
我有多个文件在文件中的某处有这样的行:
10.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
该行有几条信息,长度可变。
我正在尝试编写一个将在目录中查找的批处理文件,在每个文件中搜索字符串start,ani
,然后设置一个变量值。喜欢
VAR1=04/10/2018
VAR2=17:21:07
VAR3=1234567890
然后我需要将/和:更改为_,最后重命名文件:
1234567890_04_10_201817_21_07.txt
我可以处理将字符更改为下划线,我遇到的问题是尝试提取该行并将信息设置为变量。
这是我一直在玩的:
cd /d %tmp%
set var1=1
if %var1%==1 (
for /F "delims=" %%a in ('findstr /I "start,ani" %tmp%\*.txt') do (
set "var=%%a"
echo %%a
echo %var%
)
)
我的目标只是找到整个内容的线和set var
。但是,当我回应var它只是说echo off
。
如果你想更进一步,并分割你的各行以获得所需的变量并重命名文件,你可以在call
ed标签部分返回到重命名循环。
示例,(基于发布的文本文件片段和任何文件中只有一个匹配的行):
@Echo Off
SetLocal EnableDelayedExpansion
For /F "Tokens=1* Delims=:" %%A In (
'FindStr/RIC:",start,ani," *.txt'
) Do (
Call :Sub "%%B"
Echo=Ren "%%A" "!VAR3!_!VAR1!_!VAR2!%%~xA"
)
Pause
Exit /B
:Sub
Set "line=%*"
Set "line=%line:,=","%"
Set "#=0"
For %%A In (%line%) Do (
Set /A #+=1
Set "VAR!#!=%%~A"
)
For /F "Tokens=1-6 Delims=/:. " %%A In ("%VAR2%") Do (
Set "VAR1=%%A_%%B_%%C"
Set "VAR2=%%D_%%E_%%F"
)
Set "VAR3=%VAR6%"
For %%A In (4 5 6) Do Set "VAR%%A="
Exit /B
如果输出看起来不错,请删除Echo=
和Pause
。
在我关闭命令运行的回显之后,通过在脚本顶部添加@echo off
,我对脚本没有任何问题。我创建了一个名为file.txt
的文件,粘贴了您提供的模拟行,并将此目录放在tmp
环境变量中。一旦我运行脚本,var
环境变量包含找到的行,它也按预期打印出来。
我用过的脚本:
@echo off
cd /d %tmp%
set var1=1
if %var1%==1 (
for /F "delims=" %%a in ('findstr /I "start,ani" %tmp%\*.txt') do (
set "var=%%a"
echo %%a
echo %var%
)
)
This post在@
和echo off
上有更多。
更新:我不确定您的完整场景,但这可能是您最终遇到的问题,因为您正在设置变量并在for循环中回显它。如果文件中有两行,标记为“start,ani”,则输出将如下所示(文件路径已被删除并替换为简单的[file path]
):
[file path]:10.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
[file path]:11.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
[file path]:11.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
[file path]:11.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
正如您所看到的,%var%
的第一个回波与最后一个相同,这是因为变量只展开一次。要获得更多预期输出,您需要使用延迟扩展:
@echo off
setlocal ENABLEDELAYEDEXPANSION
cd /d %tmp%
set var1=1
if %var1%==1 (
for /F "delims=" %%a in ('findstr /I "start,ani" %tmp%\*.txt') do (
set "var=%%a"
echo %%a
echo !var!
)
)
现在var
的第一个回声将按预期显示:
[file path]:10.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
[file path]:10.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
[file path]:11.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
[file path]:11.18.77.14.152392.16.APP_Ret,04/10/2018 17:21:07.592,,start,ani,1234567890
This post有关延迟扩张的更多信息。
以上是关于使用BATCH文件使用文件中的部分行重命名多个文件的主要内容,如果未能解决你的问题,请参考以下文章