1

我是一名 Perl 程序员,但我需要为特定任务创建一个 Windows 批处理文件。

该脚本需要逐行读取输入文件,并复制到输出文件。然而,在完成的过程中,它需要切换输出文件。

对于通常读取输入文件并输出到文件,Jeb 的以下文章中的解决方案似乎效果最好。(当输入数据有奇怪的字符或长行时,其他解决方案效果不佳)批处理文件:如何读取文件?

但是,在中途更改输出文件的情况下,我无法让它工作。问题可能与 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%
4

1 回答 1

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.
这两个值都缓存在屏障上。

于 2012-07-10T07:23:15.887 回答