我是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%
答案 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
的影响。
这两个值都在屏障上缓存。