Summary:
从命令行(在 Windows Server 2003 R2 上),我键入:
> SET password=a^b
> ECHO %password%
结果是“ab”。奇怪的插入符 (^) 去哪儿了?然后我尝试用 ^^、`^、%^、^^^ 来“转义”它,但这些都没有使插入符号传递到 echo 命令。这个批处理文件位于中间。因此,我既无法更改源系统的密码以避免使用插入符号,也无法更改目标系统的密码以使其与源系统不同步。
Details:
我搜索了谷歌,然后就这样了。虽然我现在有无数关于如何更好地设计我该死的 Windows 批处理文件的技巧,但我的问题仍然存在。
我有一个名为 run.bat 的批处理文件,它由一系列设置运行 Java 命令行应用程序的上下文的 SET 语句组成。 “cd”到正确的文件夹后,在命令行提示符处(在 Windows Server 2003 R2 上)我键入:
> run the_name the_pass^word
当我查看回显到命令行的输出时,我看到“java...config.user_name=the_name config.password=the_password”,其中...是一堆与此问题无关的参数和库噪音。该死的插入符号 (^) 消失了。
我尝试了各种我能找到的转义策略,试图让插入符号出现。我无法找到任何会导致插入符号出现的内容...除了用引号引起来的密码,如我输入的:
> run the_name "the_pass^word"
...然后生成的命令行如下所示:
java...config.user_name=the_name config.password="the_pass^word"
即我得到插入符号,但引号现在出现在字符串的内容中......这自然不适用于它们传递到的应用程序。
有没有人有一个明显的提示或技巧,我错过了将命令行上作为参数输入的内容通过未触及的方式传递到我的内部使用?该值实际上已到达 %2 的批处理文件变量中。但是,当我第一次看到 %2 的内容时,它已经“解除锁定”了。
呃,我不喜欢 Windows 批处理文件。
Update:
非常感谢约书亚·麦金农的回应。我选择他作为答案,因为它解决了我眼前的问题。但是,我想进一步详细说明解决方案(是的,复数)。
- 无需使用任何形式的SetLocal/EndLocal
- 必须使用 %~1 样式语法 - 未找到可用于保留插入符号的 %1 语法形式
- 解决方案:不加引号,使用 4 个连续的插入符号(例如:使用 pass^^^^word 生成 pass^word)
- 解决方案:引用,使用 2 个连续的插入符号(例如:使用“pass^^word”生成 pass^word)
在批处理文件“run.bat”中,使用 %~1 语法,如下所示:
java MyClass username=%~1 password=%~2
...然后在命令行中输入:
> run mr_clean puke^^^^boy
or
> run mr_clean "puke^^boy"
最终执行的语句将如下所示:
java MyClass username=mr_clean password=puke^boy
希望这可以帮助其他人节省一些时间。我花了 6 个小时的时间试图找出这种特质(更像是白痴同步性)。