【问题标题】:Batch file for loop fails to execute inside for loop循环的批处理文件无法在循环内执行
【发布时间】:2017-07-31 12:38:22
【问题描述】:

任务很简单,从文件“input.txt”中获取输入,该文件包含需要在源文件“source.txt”中替换的关键字,并使用关键字名称创建新文件。您能否提出问题所在。

@echo off &setlocal
setlocal enableextensions disabledelayedexpansion
set "search=POP"
set "source=dev500_ABC_eu.env"
for /f %%a in (input.txt) do (
set "replace=%%a"
set "newfile=devga520_%replace%_eu.env"
for /f "delims=" %%i in (%textfile%) do (
   set "line=%%i"
   setlocal enabledelayedexpansion
   set "line=!line:%search%=%replace%!"
   echo(!line!
   endlocal
)>"%newfile%"
)

在 input.txt 中,假设它有“PQR”。所以它应该用“PQR”替换文件中的“POP”,并且新文件应该生成名称为 dev500_PQR_eu.env

Input file.txt
line 1 --> PQR
line 2 --> XYX
line 3 --> NOB
line 4 --> BOB

预期输出:用输入文件文本替换字符“ABC”后的 4 个不同文件,例如:在哪里有“ABC”,它应该被 dev500_ABC_eu.env 中的 PQR 替换,并且新文件要用文本重命名。

dev500_PQR_eu.env  --> replaced name and content as well by PQR.
dev500_XYX_eu.env 
dev500_NOB_eu.env 
dev500_BOB_eu.env 

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 除非您使用delayed expansion,否则您不应使用临时变量replacenewfile,只需声明%%adevga520_%%a_eu.env,分别对应......
  • 我已经尝试过了,但是也执行了第一个 for,结果只是在第二个 for 执行之后创建了最后一个文件。第一个 for 循环的执行应该为输入文本文件中没有发生的每个变量执行第二个 for 循环。有什么建议么。感谢您的帮助

标签: batch-file for-loop


【解决方案1】:
...
set "source=dev500_ABC_eu.env"
for /f %%a in (input.txt) do (set "replace=%%a")
set "newfile=devga520_%replace%_eu.env"
(
for /f "delims=" %%i in (%textfile%) do (
   set "line=%%i"
   setlocal enabledelayedexpansion
   set "line=!line:%search%=%replace%!"
   echo(!line!
   endlocal
)
)>"%newfile%"

有关更多信息,请参阅 SO 上的 delayed expansion 项目。代码块(带括号的一系列行)中的任何%var% 都将在第一次遇到代码块时替换为var 的值。

你需要在块外设置replace


您的修订澄清了问题。

@ECHO Off
SETLOCAL
SET "search=POP"
set "source=dev500_ABC_eu.env"
:: This is a replacement source file I used for testing...
set "source=c:q45416169_1.txt"
for /f %%a in (c:q45416169.txt) do (
 set "replace=%%a"
 set "newfile=devga520_%%a_eu.env"
 CALL DEL %%newfile%% >NUL 2>nul
 for /f "delims=" %%i in (%source%) do (
   set "line=%%i"
   setlocal enabledelayedexpansion
   set "line=!line:%search%=%%a!"
   >>!newfile! echo(!line!
   endlocal
 )
)

我使用了一个名为 q45416169.txt 的文件,其中包含我的测试数据。

我使用了一个名为 q45416169_1.txt 的文件,其中包含一些用于测试的虚拟文本数据。

我在代码中留下了replace 的赋值,但现在它是多余的。

【讨论】:

  • 谢谢 Magoo。如果输入文件只有一个关键字,它就可以工作。当它有多个关键字时,它会为最后一个生成文件。我猜替换函数首先执行,它设置了所有值,替换函数为最后一个关键字生成文件。 input.txt --> PQR XYZ LOL 在这种情况下它生成文件 dev500_LOL_eu.env。我怎样才能让它为所有输入替换和生成文件。
  • /f%% 之间添加"delims=" for/f 语句将文件中的整行分配给变量,否则只分配第一个“令牌”(有关详细信息,请参阅提示中的for /?|more
  • 问题不同,输入文件每行一个关键字。所以实际上它确实替换了 input.txt 中的所有关键字,然后最后一行的最后一个关键字将用于替换和生成新文件。第一个循环被执行并到达最后一个关键字,第二个循环将最后一个关键字作为输入并生成文件。我想为 input.txt 中的所有关键字生成文件,每行只有一个关键字。感谢您的帮助
  • 请在您的问题中编辑一些示例数据,显示预期的原始名称和新名称
  • 如果清楚请告诉我,谢谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2019-08-06
相关资源
最近更新 更多