我想编写一个批处理文件来读取输入文本文件,从中提取信息将其放入输出文件中。
例如:
FILE_NAME=apple FILE_SIZE=312 C=fwef sdf asdetg
FILE_SIZE=7867 C=ehtrghr FILE_NAME=sea&ocean G=tryr yujg
C=gert FILE_NAME=chair=12 tgrgd sfsf FILE_SIZE=66
dfgg ertergf C=ert A=344
fgdfg FILE_NAME=cat
我想只提取FILE_NAME=XXX
和FILE_SIZE=XXX
部分,放弃该行中的所有其他内容。输出应为:
-name apple -size 312
-name sea&ocean -size 7867
-name chair=12 -size 66
ERROR!!!
-name cat
input_count=5 and output_count=4
答案 0 :(得分:2)
人们没有给批量脚本足够的信任。试试这个:
@echo off
setlocal enableDelayedExpansion
set INPUT_FILE=input.txt
set OUTPUT_FILE=output.txt
set INPUT_COUNT=0
set OUTPUT_COUNT=0
:: Read the input file
for /f "tokens=*" %%s in (%INPUT_FILE%) do call :ParseLine "%%s"
echo. >>%OUTPUT_FILE%
echo input_count=!INPUT_COUNT! and output_count=!OUTPUT_COUNT! >>%OUTPUT_FILE%
exit /b
:: Parse one line and write to output
:ParseLine
set "str=%~1"
set ^"str=!str: =^
!"
set file_name=
set file_size=
for /f "eol= tokens=1,2 delims==" %%a in ("!str!") do (
set "tag=%%a"
set "value=%%b"
if "!tag!" equ "FILE_NAME" set "file_name=-name !value!"
if "!tag!" equ "FILE_SIZE" set "file_size=-size !value!"
)
set /a input_count+=1
if "!file_name!" equ "" if "!file_size!" equ "" (
echo ERROR^^!^^!^^! >>%OUTPUT_FILE%
goto Done
)
echo.!file_name! !file_size! >>%OUTPUT_FILE%
set /a output_count+=1
:Done
以下是对此的解释:
for
循环逐行读取文件,每行的内容作为输入参数发送到ParseLine
子例程。ParseLine
子程序接收str
中的每一行并迭代其空格分隔的单词(使用jeb的高级方法here)。tag
(=
之前的文本)和value
(=
之后的文本),以及相应地设置file_name
和file_size
。我相信这个方法几乎可以处理任何输入文件,包含或不包含特殊字符。