如何从文件中批量恢复特定字符串
How to recuperate a particular string from a file in batch
我正在尝试使用批处理文件从文件(我们称之为 MyFile.dart)恢复特定数据。
更准确地说,我正在尝试从这一行中恢复 2.4:
static var version = 2.4;
首先,我使用 for 循环遍历文件的每一行:
FOR /F "tokens=*" %%i IN (MyFile.dart)
然后我想检查该行是否包含特定字符串(此处为“var version”)
set str = %%i
if not %str:"var version"=% == %str% DO
我从 this topic 得到了这个,但在这里我得到了错误:
=str is unexpected
由于检查不起作用,我对其进行评论,然后在 MyFile.dart 的每一行上尝试下一个 for 循环(如果检查有效,它会仅在包含“var version”的行上):
set str = %%i
FOR /F "tokens=2 delims==" %%a IN (%str%) DO (
@echo %%a
)
在这里我应该使用“=”作为分隔符来拆分行并显示拆分数组的第二个元素,但是我在控制台中没有打印任何内容,当我注释掉@echo 时,我看到那 %str% 是空的。我尝试直接使用 %%i 但我也遇到了错误。
所以我硬编码了我对循环感兴趣的行:
set str = %%i
FOR /F "tokens=2 delims==" %%a IN ("static var version = 2.4;") DO (
@echo %%a
)
并得到了2.4的预期结果;在控制台中(但显然这不是我想要的)。
总结一下:
第一个问题:检查行是否包含特定子字符串的“if not”不起作用。
第二个问题:我无法将变量从第一个循环(文件的一行)传递到第二个循环然后解析它。
这是我的全部代码:
FOR /F "tokens=*" %%i IN (MyFile.dart) DO (
set str = %%i
if not %str:"var version"=% == %str% DO (
FOR /F "tokens=2 delims==" %%a IN (%str%) DO (
@echo %%a
)
)
)
注意:如果你有一个完全不同的算法来得到相同的结果,我会接受它!
set str = %%i
这会将变量“strSpace”设置为值“Space(值%%i
)"
使用语法
set "str=%%i"
包括引号。使用 set "var1=value"
设置 STRING 值 - 这避免了由尾随空格引起的问题。设置算术值不需要引号 (
set /a`)
if not %str:"var version"=% == %str% DO (
正确的语法是
if not "%str:var version=%" == "%str%" (
或者更好
if "%str:var version=%" neq "%str%" (
比较是字面的 - 比较运算符的两边都必须用引号引起来,因为值可能包含空格等分隔符。
字符串替换的正确语法是 %varname:string=substitutestring%
为什么要重新设置str
?
要使用 =
作为分隔符解析字符串,请使用
FOR /F "tokens=2 delims==" %%a IN ("string") DO (
但是请注意,%str%
将是 str
在遇到 outer 循环 (%%i
) 时的值。有关其工作原理的解释,请参阅
您应该考虑使用
FOR /F "tokens=2 delims==" %%a IN ("%%i") DO (
这对我有用 - 我更改了文件的名称
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=*" %%i IN (q71930885.txt) DO (
set "str=%%i"
if "!str:var version=!" neq "!str!" (
FOR /F "tokens=2 delims==" %%a IN ("%%i") DO ( @echo %%a )
)
)
GOTO :EOF
回复:
Space2.4;
我正在尝试使用批处理文件从文件(我们称之为 MyFile.dart)恢复特定数据。
更准确地说,我正在尝试从这一行中恢复 2.4:
static var version = 2.4;
首先,我使用 for 循环遍历文件的每一行:
FOR /F "tokens=*" %%i IN (MyFile.dart)
然后我想检查该行是否包含特定字符串(此处为“var version”)
set str = %%i
if not %str:"var version"=% == %str% DO
我从 this topic 得到了这个,但在这里我得到了错误:
=str is unexpected
由于检查不起作用,我对其进行评论,然后在 MyFile.dart 的每一行上尝试下一个 for 循环(如果检查有效,它会仅在包含“var version”的行上):
set str = %%i
FOR /F "tokens=2 delims==" %%a IN (%str%) DO (
@echo %%a
)
在这里我应该使用“=”作为分隔符来拆分行并显示拆分数组的第二个元素,但是我在控制台中没有打印任何内容,当我注释掉@echo 时,我看到那 %str% 是空的。我尝试直接使用 %%i 但我也遇到了错误。
所以我硬编码了我对循环感兴趣的行:
set str = %%i
FOR /F "tokens=2 delims==" %%a IN ("static var version = 2.4;") DO (
@echo %%a
)
并得到了2.4的预期结果;在控制台中(但显然这不是我想要的)。
总结一下:
第一个问题:检查行是否包含特定子字符串的“if not”不起作用。
第二个问题:我无法将变量从第一个循环(文件的一行)传递到第二个循环然后解析它。
这是我的全部代码:
FOR /F "tokens=*" %%i IN (MyFile.dart) DO (
set str = %%i
if not %str:"var version"=% == %str% DO (
FOR /F "tokens=2 delims==" %%a IN (%str%) DO (
@echo %%a
)
)
)
注意:如果你有一个完全不同的算法来得到相同的结果,我会接受它!
set str = %%i
这会将变量“strSpace”设置为值“Space(值%%i
)"
使用语法
set "str=%%i"
包括引号。使用 set "var1=value"
设置 STRING 值 - 这避免了由尾随空格引起的问题。设置算术值不需要引号 (
set /a`)
if not %str:"var version"=% == %str% DO (
正确的语法是
if not "%str:var version=%" == "%str%" (
或者更好
if "%str:var version=%" neq "%str%" (
比较是字面的 - 比较运算符的两边都必须用引号引起来,因为值可能包含空格等分隔符。
字符串替换的正确语法是 %varname:string=substitutestring%
为什么要重新设置str
?
要使用 =
作为分隔符解析字符串,请使用
FOR /F "tokens=2 delims==" %%a IN ("string") DO (
但是请注意,%str%
将是 str
在遇到 outer 循环 (%%i
) 时的值。有关其工作原理的解释,请参阅
您应该考虑使用
FOR /F "tokens=2 delims==" %%a IN ("%%i") DO (
这对我有用 - 我更改了文件的名称
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=*" %%i IN (q71930885.txt) DO (
set "str=%%i"
if "!str:var version=!" neq "!str!" (
FOR /F "tokens=2 delims==" %%a IN ("%%i") DO ( @echo %%a )
)
)
GOTO :EOF
回复:
Space2.4;