使用Windows批处理文件,如何解析文件并将部分输出到一个文件,另一个文件?

时间:2012-07-10 07:11:18

标签: batch-file

我是Perl程序员,但我需要为特定任务执行Windows批处理文件。

脚本需要逐行读取输入文件,然后复制到输出文件。但是,在某种程度上,它需要切换输出文件。

对于读取输入文件并一般输出到文件,Jeb的以下文章中的解决方案似乎效果最好。 (当输入数据有奇怪的字符或长行时,其他解决方案不能正常工作)Batch files: How to read a file?

但是我不能让它在中途改变输出文件的地方工作。问题可能在于DelayedExpansion的工作方式。

当我运行以下脚本时,最后的outfile仍然是a.txt,并且没有设置new_variable。

@echo off
del /f/q a.txt
del /f/q b.txt
del /f/q c.txt
del /f/q out.txt

set outfile=a.txt
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    IF "!%var!" == "/************************** PLUGINS SECTION *************************/" (
   set outfile=b.txt
   set new_variable=this
   echo "FOUND! Value of outfile should change to b.txt"
  )
  echo( !outfile! !var! >>!outfile!
    ENDLOCAL
)

echo Outfile:      %outfile%
echo New Variable: %new_variable%

1 个答案:

答案 0 :(得分:1)

您在endlocal之后松开了变量。
因此,您需要将值保存在endlocal屏障上 最简单的方法是使用FOR-Endlocal技术。

 SETLOCAL DisableDelayedExpansion
 FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    if "!var!" == "****" (
      set outfile=b.txt
      set new_variable=this
    )
  FOR /F "tokens=1,2" %%O in (!outfile! !new_variable!) DO
  (
    ENDLOCAL
    set "outfile=%%O"
    set new_variable=%%P
  )
)

这适用于FOR循环的%% O和%% P参数不受ENDLOCAL的影响。
这两个值都在屏障上缓存