【问题标题】:With Windows batch file, how to parse a file and output part to one file, part to another?使用 Windows 批处理文件,如何解析文件并将部分输出到一个文件,部分输出到另一个文件?
【发布时间】:2012-07-10 18:22:03
【问题描述】:

我是一名 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%

【问题讨论】:

    标签: batch-file


    【解决方案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 的影响。
    这两个值都缓存在屏障上方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2020-08-27
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多