批处理batch查询目录下文件中的特定字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理batch查询目录下文件中的特定字符串相关的知识,希望对你有一定的参考价值。

如何用批处理实现这个功能?

在C:/dir 目录下有很多txt文件
文本文件的内容如下,并格式化的。以|为分隔符

日期:2013-03-31 所属地区: 北京
─────────────────────────
姓名 |性别 |学历 | 婚姻 |毕业学校
──────────────────────────
张某 | 30 |初中 | 已婚 | 某某1中
何某 | 40 |学士 | 未明 | 某某大学
─────────────────────────────────

如果发现 某某大学的字符特征,就在另外的一个文本tt.txt中追加 一些内容
形成如下的格式

何某 | 40 |学士 | 未明 | 某某大学 | 2013-03-31 | 北京 |文件名(含有这记录的文件名)

谢谢
附上图片说明txt文件格式内容

参考技术A @echo off
for /f "delims=" %%i in ('dir/b c:\dir\*.txt') do (
for /f "delims=" %%j in (%%i) do (
echo %%j |find "某某大学" &&echo%%j | 2013-03-31 | 北京 |%%i>>tt.txt)追问

谢谢答复,我测试了一下结果没有产生tt.txt
的文件。我用的是win2003. 是否和平台有关系?

追答

不好意思少了个),也没用转义字符。下面是测试可用的。
@echo off
for /f "delims=" %%i in ('dir/b 1.txt') do (
for /f "delims=" %%j in (%%i) do (
echo %%j|find "某某大学" &&echo %%j ^| 2013-03-31 ^| 北京 ^|%%i>>tt.txt))

追问

谢谢。 不过日期:2013-03-31也是变量,也就是目录下不同文件中那个日期是不同的而不是固定 2013-03-31,有没有办法改进一下吗?在'日期:2013-03-31   所属地区: 北京'前还有其他几行不相关内容。也就是我举例的只是整个txt文件中的一段而已,可能一个txt文件中会含有好几段这样的内容,日期不同单个记录行可能相同可能不同。我已经附上图片更好的说明txt文件的格式内容

追答

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir/b c:\dir\*.txt') do (
for /f "delims=" %%j in (%%i) do (
echo %%j|find "日期" &&(
for /f "tokens=2,4 delims=: " %%k in ("%%j") do set nowDate=%%k&set nowCity=%%l)
echo %%j|find "某某大学" &&echo %%j ^| !nowDate! ^| !nowCity! ^|%%i>>tt.txt))

追问

是否要改成这样样???

for /f "delims=" %%j in (c:\dir\%%i) do (
否则老是提示无法找到文件

本回答被提问者采纳
参考技术B 建议你参考一下http://zhidao.baidu.com/question/133037887.html
然后把这些文件合并起来
Copy *.txt newfile.txt
然后在word或excel中处理newfile.txt追问

谢谢提示。不过这不是我需要的答案。谢谢

使用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

答案

如果你想更进一步,并分割你的各行以获得所需的变量并重命名文件,你可以在called标签部分返回到重命名循环。

示例,(基于发布的文本文件片段和任何文件中只有一个匹配的行):

@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查询目录下文件中的特定字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用BATCH文件使用文件中的部分行重命名多个文件

bat批处理 识别文件中的特定字符并移动到有相同特定字符的文件夹中去?

批处理/cmd如何复制名称特定的文件?

Powershell仅在包含特定字符串的文件夹名称中移动子目录中的项目

Spring Batch - 如何将字符串从文件转换为日期?

MS Dos Batch删除目录中的旧文件[重复]