要点:
从命令行(在Windows Server 2003 R2上),我输入:
> SET password=a^b
> ECHO %password%
结果是“ab”。怪胎插入符号(^)去了哪里?然后我尝试用^^,`^,%^,^^^“逃避”它,并且这些都没有使插入符号传递给echo命令。这个批处理文件位于中间。因此,我既不能更改源系统的密码以避免使用插入符,也不能将目标系统的密码更改为与源系统不同步。
详细信息:
我搜索谷歌,然后搜索SO。虽然我现在有很多关于如何更好地设计我的血腥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"
即。我得到了插入符号,但引号现在出现在字符串的内容中......这自然不适用于它们传递给它的应用程序。
有没有人有一个明显的提示或技巧我错过了在命令行中输入的内容通过UNTOUCHED传递给我的内部使用?该值实际上是在%2的批处理文件变量中。但是,当我第一次看到%2的内容时,它已被“解除”。
UGH,我不喜欢Windows批处理文件。
更新
非常感谢Joshua McKinnon的回应。我选择了他作为答案,因为它解决了我的直接问题。但是,我想进一步阐述解决方案(是的,复数)。
在批处理文件“run.bat”中,使用%~1语法,如下所示:
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个小时的切线试图追捕这种特质(更像是白痴同步)。
答案 0 :(得分:9)
根据this page,& | (<> ^ 是Windows批处理文件中的所有保留字符。^是转义字符,以及行继续符。^^应该给你一个^,但那时^可能需要转义。
要通过输入获取密码,您是否尝试过多次插入数量?
e.g.: my_batch.cmd the_pass^^^^word
答案 1 :(得分:3)
这解释了问题:
http://www.robvanderwoude.com/battech_inputvalidation_commandline.php
如果在批处理文件/ CMD脚本中处理一些任意字符串,请不要通过命令行参数传递它!而是将它们放入文件中,让批处理文件读取它。因为命令行参数中的验证和清理绝不是万无一失的。
答案 2 :(得分:2)
主要问题是当在一行(引号之外)找到插入符号和其他特殊字符时,它们总是被处理。
当内容按%var%
展开时,内容也会被解析,但不会因!var!
样品
@echo off
setlocal Enabledelayedexpansion
set variabl=-^^"^^-
set variabl
echo delayed !variabl!
echo percent %variabl%
--- Output ---
variabl=-^"^^-
delayed -^"^^-
percent -"^-
变量的内容是-^"^^-
,这是set
行的问题。
但是,当使用%var%
时,插入符号仅用作转义字符。
答案 3 :(得分:0)
剥离报价可能更容易。有关详细信息,请参阅此SO link。