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

时间:2015-09-30 18:52:09

标签: windows batch-file cmd

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

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

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

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

密码=测试!

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

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

    密码=测试%!

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

2 个答案:

答案 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循环。如果您想发布批处理文件的早期部分,我们可以帮助您进一步排除故障。