如何用"!"读取字符串 从Windows批处理脚本中的文件?

cpp*_*der 4 windows cmd batch-file

我正在编写一个批处理脚本来从文件中读取.该文件包含诸如token = value之类的行.我有代码来解析文件的每一行,它存储在%% i中.以下代码尝试提取令牌的值:

请注意,此脚本正在使用延迟扩展,如评论中所述.

   for /f "tokens=1* delims==" %%a in ("%%i") do (  
      if "%%a"=="password" ( set password=%%b )  
   )
Run Code Online (Sandbox Code Playgroud)

如果令牌密码的值包含"!",那么"!" 被跳过,只有其余的字符串存储在变量密码中.例如,如果该行是:

密码=测试!

然后变量密码=测试.我试图以各种方式更改输入文件,批处理脚本读取除"!"之外的所有内容.我用过:

  1. 密码="测试!"
  2. 密码= "测试^!"
  3. 密码=测试%!

    密码=测试%!

一切都跳过"!".知道如何用"!"读取字符串 变成一个变量?

wOx*_*xOm 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
Run Code Online (Sandbox Code Playgroud)

但是password变量只能在内部setlocal上下文中使用,导出它使用该答案.