Batch file 批处理输入文件
我想写一个批处理文件来读取输入文本文件,从中提取信息并将其放入输出文件中Batch file 批处理输入文件,batch-file,Batch File,我想写一个批处理文件来读取输入文本文件,从中提取信息并将其放入输出文件中 输入文件中的每一行都有不同的信息,因此我希望批处理在每一行中循环 我想从输入文件中提取某些信息,并放弃其余信息 输入文件可以有任意数量的行 如果输入行没有有用的信息,我想留下一条错误消息 我需要两个计数器,第一个告诉输入文件中的行数,第二个告诉输出文件中的行数(不计算空行) 我希望该批处理像普通字母一样处理特殊字符 例如: FILE_NAME=apple FILE_SIZE=312 C=fwef sdf asdet
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
我只想提取文件名=XXX
和文件大小=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
人们对批处理脚本没有给予足够的信任。试试这个:
@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高级方法)。子程序循环的逻辑非常简单:它将每个单词分成
标记(前面的文本=
)和值(后面的文本=
),并相应地设置文件名和文件大小
我相信这个方法可以处理几乎所有的输入文件,有或没有特殊字符。我知道这不是批处理文件方法,所以可能不适合,但awk和sed都是(linux)用于重新排列文本行的命令行工具,如此。也许您可以从UnxUtils项目下载
sed
和awk
版本,并在批处理文件中使用它们。好的,但对于所有变量file\u NAME和file\u SIZE,这将更改,但我想为其中的1个变量执行此操作them@user1447199-你不应该改变你的问题完全地,最好问一个新的。这是一个很大的区别,如果是XML、CSV或自定义formathelp plz,我注意到如果输入文件名在这一行中为/f“tokens=*”%%s in(%input_file%)do call:ParseLine“%%s”留有空格会出现问题,我尝试放置“%input_file%”,但没有解决方案?我找到了一个有效的解决方案,我做了这样的交换,设置input2=“%INPUT\u FILE%”,然后:for/f“tokens=*”%%s in(%input2%)调用:ParseLine“%%s”,它就起作用了,但也许有一个更聪明的解决方案。我有一个问题,是否可以使用单词而不是=
作为分隔符