摘要:
我在Windows Server 2003 R2的命令行中输入以下命令:
> SET password=a^b
> ECHO %password%
并且结果是 "ab"。这该死的插入符号(^)去哪了?我试图用 ^^、`^、%^、^^^ 进行“转义”,但是没有任何一种方式可以让插入符号传递到 echo 命令。这个批处理文件在中间,所以我既无法更改源系统的密码以避免使用插入符号,也无法更改目标系统的密码以使其与源系统不同步。
详情:
我在Google和 Stackoverflow 上进行了搜索。虽然现在我有了大量关于如何更好地设计我的Windows批处理文件的技巧,但我的问题仍然存在。
我有一个名为 run.bat 的批处理文件,其中包含一系列 SET 语句,用于设置运行Java命令行应用程序的上下文。在“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批处理文件。
更新: 感谢Joshua McKinnon的回答。我选择他的答案,因为它解决了我的即时问题。但是,我想进一步阐述解决方案(是的,复数)。
- 不需要使用任何形式的SetLocal / EndLocal
- 必须使用%~1样式语法-找不到保留插入符的任何形式的%1语法
- 解决方案:未引用,使用4个连续的插入符(例如:使用pass^^^^word生成pass^word)
- 解决方案:引用,使用2个连续的插入符(例如:使用“pass^^word”生成pass^word)
java MyClass username=%~1 password=%~2
...然后在命令行中输入:
> run mr_clean puke^^^^boy
或者> run mr_clean "puke^^boy"
这将导致最终执行的语句如下所示:
java MyClass username=mr_clean password=puke^boy
希望这能帮助其他人节省一些时间。我花了6个小时的时间试图追踪这个怪异问题(更像是白痴-同步性)。
^
会被加倍。这个SO答案https://dev59.com/02nWa4cB1Zd3GeqPwATG#12656803解释了这个问题,并展示了如何通过引用传递变量,这对我解决了问题。 - Mark Berry