即使在Googeling之后我也无法解决我的问题。 有一个名为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
谢谢! 罗尼
答案 0 :(得分:0)
@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
,但使用[ Space Tab , ; ]为分隔符,因此您只需使用代码获取字符串Root:
(最多但不包括默认分隔符)
见
for /?
来自文档提示。
语法SET "var=value"
(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a
可以安全地使用"无报"。
下一步是处理文件。同样的故事(但由于我引用文件名并提供完整路径,我需要usebackq
选项。
整行被分配到%%G
(注意:除了空行和行开头;
然后它是一个简单的if
声明 - 如果"行内容" =="目标内容"。引号是必需的,因为引用组"包含分隔符的字符串"一个字符串和if
语法是if string
运算符string2(dothis)else(dothat)`
请注意,左括号必须与执行位于同一物理行,而如果则相同。 else ,前面的近括号和后面的左括号必须都在同一物理行上,并且它们之间有空格。
请注意使用ECHO(
echo
如果%%G
(在这种情况下)没有值,则(
为空行。就嵌套而言,echo %var%
不计算在内。
(%% G必须有一个值 - 但在一般情况下,如果echo is on/off
未定义,则var
将产生echo(%var%
,但{{1}}将干净地生成新行)