即使经过深入的谷歌搜索,我也无法解决我的问题。 有一个名为 test.txt 的文本文件。我需要的是使用批处理文件更改以“Root:”开头的行和其他内容。
setLocal EnableDelayedExpansion
FINDSTR /B Root: test.txt
::returns the correct line - works well
for /f %%i in ('FINDSTR /B Root: test.txt') do set root=%%i
echo %root%
::echos "Root:" - instead of the line content
FOR /F "tokens=*" %%G IN (test.txt) DO
(set x=%%G
if !x!==%root% set x=Hello
echo !x! >> test.txt)
::The syntax of the command is incorrect.
我该怎么做?
编辑: 基于 Magoo 和 RobW 在 Batch / Find And Edit Lines in TXT file - 我的问题解决如下:
for /f "tokens=*" %%i in ('"FINDSTR /B Root: test.txt"') do set root=%%i
::root holds test.txt's line starts with "Root:"
echo %root%
SETLOCAL=ENABLEDELAYEDEXPANSION
::iterate on test.txt's lines and compare to the root's value
rename test.txt test.tmp
for /f "tokens=*" %%a in (test.tmp) do (
set foo=%%a
echo !foo!
echo %root%
echo "%root%"
if "!foo!"=="%root%" (set foo=hello)
echo !foo! >> test.txt)
del test.tmp
谢谢! 罗尼
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q34900978.txt"
FINDSTR /B Root: "%filename1%"
::returns the correct line - works well
FOR /f "tokens=*" %%i IN (
'FINDSTR /B Root: "%filename1%"
') do set "root=%%i"
echo %root%
::echos "Root:" - instead of the line content
FOR /F "usebackqdelims=" %%G IN ("%filename1%") DO (
if "%%G"=="%root%" (
ECHO(x=Hello
) ELSE (
ECHO(%%G
)
)
GOTO :EOF
您需要更改
sourcedir
的设置以适合您的情况。
我使用了一个名为
q34900978.txt
的文件,其中包含一些虚拟数据用于测试。
tokens=*
(或for...%%i
)中的delims=
选项将整行分配给“标记1”,然后分配给元变量%%i
。
默认是分配
token 1
但使用 [SpaceTab,;] 作为分隔符,因此你只得到字符串 Root:
与你的代码(最多但不包括默认分隔符) )
看
对于/?
来自文档提示。
语法
SET "var=value"
(其中值可以为空)用于确保分配的值中不包含任何杂散尾随空格。 set /a
可以安全地“无引号”使用。
下一步是处理文件。同样的故事(但由于我引用文件名并提供完整路径,所以我需要
usebackq
选项。
整行被分配给
%%G
(注意:除了空行和以;开头的行)
然后是一个简单的
if
语句 - if“行内容”==“目标内容”。引号是必需的,因为引号将“包含分隔符的字符串”分组为一个字符串,并且 if
语法为 if string
运算符 string2 (dothis) else (dothat)`
请注意,左括号必须与 do 位于同一物理行,if 也是如此。 else,前面的闭括号和后面的开括号必须位于同一物理行,且之间有一个空格。
请注意
ECHO(
的使用,如果 echo
(在本例中)没有值,则 %%G
会成为空行。就嵌套而言,(
不算在内。
(这里的%%G必须有一个值 - 但在一般情况下,如果
echo %var%
未定义,echo is on/off
将产生var
,但echo(%var%
将干净地产生一个新行)。