我正在编写一个批处理脚本来从文件中读取。该文件包含诸如token = value之类的行。我有代码来解析文件的每一行,它存储在%% i中。以下代码尝试提取令牌的值:
请注意,此脚本正在使用延迟扩展,如评论中所述。
for /f "tokens=1* delims==" %%a in ("%%i") do (
if "%%a"=="password" ( set password=%%b )
)
如果令牌密码的值包含“!”,那么“!”被跳过,只有其余的字符串存储在变量密码中。例如,如果该行是:
密码=测试!
然后变量密码=测试。我试图以各种方式更改输入文件,批处理脚本读取除“!”之外的所有内容。我用过:
密码=测试%!
密码=测试%!
一切都跳过“!”。知道如何用“!”读取字符串变成一个变量?
答案 0 :(得分:5)
假设您正在使用延迟变量扩展,请暂时将其禁用以进行比较。要在非延迟模式下进行比较,我将解析当前行分割!
,并检查第一个标记是否与整行相同:
@echo off
setlocal enableDelayedExpansion
for /f "delims=" %%i in (sourcefile.txt) do (
setlocal disableDelayedExpansion
for /f "delims=! tokens=1" %%z in ("%%i") do (
if "%%z"=="%%i" ( rem The line has no !
for /f "tokens=1* delims==" %%a in ("%%i") do (
if "%%a"=="password" ( set "password=%%b" )
)
)
)
endlocal
)
pause
但是password
变量仅在内部setlocal上下文中可用,要使用that answer导出它。
答案 1 :(得分:1)
我发布的代码没有遇到这个问题。我认为错误可能在您发布的代码之前,该代码将文件的每一行存储在%% i中。
在%%循环之前在其中放置一个echo语句,以便在进一步处理之前验证%% i的内容。我非常怀疑这个惊叹号并没有让它成为%% i。
以下是我在Windows 7上运行的完整CMD文件:
@echo off
for /f "tokens=1* delims= " %%i in ("password=Test!") do (
echo i: %%i
for /f "tokens=1* delims==" %%a in ("%%i") do (
if "%%a"=="password" ( set password=%%b )
)
)
echo password: %password%
输出如下:
i: password=Test!
password: Test!
因此,当%% i包含Test!
时,您可以看到password=Test!
正在完成for循环。如果您想发布批处理文件的早期部分,我们可以帮助您进一步排除故障。