【问题标题】:Batch: Reading values from .properties file that contain special characters批处理:从 .properties 文件中读取包含特殊字符的值
【发布时间】:2018-12-11 13:59:05
【问题描述】:

我有两个文件。

values.properties

user=username
password=Password1234!

mybatch.bat

SETLOCAL EnableDelayedExpansion
For /F "tokens=1,2 delims==" %%A IN (path/values.properties) DO (
    IF "%%A"=="user" set user=%%B
    IF "%%A"=="password" set password=%%B
    )

在批处理文件中,密码的值为:

Password1234

所以基本上,“!”消失。我想让“密码”存储任何值,无论包含什么特殊字符。我怎样才能做到这一点?我试图逃避“!”添加“密码=^^%%B”。不工作。

谢谢。

【问题讨论】:

  • 禁用延迟扩展,你会看到它有效;问题是 %%A 在延迟扩展发生之前扩展,这会消耗 !...
  • 我不敢相信!有效。我仍然不知道为什么我添加了“EnableDelayedExpansion”。我正在为这个脚本工作一段时间,并且在某个地方需要它。非常感谢你。您可以添加您的评论作为答案,以便我批准吗?你摇滚!

标签: batch-file properties delayedvariableexpansion


【解决方案1】:

对不起。我无法抗拒发布这个答案的诱惑......

假设您有一个数值变量,其值可能为 10、25 和 50,并且您想将其添加到总变量中。你可以这样做:

if %num% equ 10 set /A total+=10
if %num% equ 25 set /A total+=25
if %num% equ 50 set /A total+=50

...或者你可以这样做:

set /A total+=num

你更喜欢哪一个?


您的代码的问题在于您启用延迟扩展此时分配已完成。只需将其删除,如果需要,稍后再启用它:

SETLOCAL
For /F "delims=" %%A IN (path/values.properties) DO set "%%A"

SETLOCAL EnableDelayedExpansion
echo Password=!password!

本答案的第一部分解释了代码中的其他更改。 %%A 周围的引号用于保护其他特殊字符,例如 &>

【讨论】:

  • 非常感谢您提供的信息!您可能已经发现,我刚刚开始学习如何使用批处理文件。我试图在 .property 文件中添加 cmets,这就是为什么我想摆脱所有特殊字符(无论如何我都删除了 cmets)。我找不到更好的方法来分配属性文件中的值。
【解决方案2】:

问题是您在启用delayed expansion 的同时扩展了for 变量引用%%A,这会消耗感叹号。

因此,只需禁用延迟扩展,您的代码就可以工作。

我建议使用引用的set 语法set "user=%%B" 以避免特殊字符的麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多