概要:
从命令行(在Windows Server 2003 R2上),我键入:
> SET password=a^b > ECHO %password%
结果是“ab”。 怪胎(^)去哪了? 然后我尝试用^^,`^,%^,^^^来“逃避”它们,而这些工作中没有一个能够通过回显命令。 这个batch file在中间。 所以,我既不能更改源系统的密码以避免使用脱字符,也不能将目标系统的密码更改为与源系统不同步。
细节:
我search了Google,然后是SO。 虽然我现在有如何更好地devise我的血腥的Windowsbatch filebazillion技巧,我的问题依然存在。
我有一个名为run.bat的batch file,它由一系列SET语句组成,用于设置运行Java命令行应用程序的上下文。 在“cd”切换到正确的文件夹后,在命令行(在Windows Server 2003 R2上)的提示下,input:
> run the_name the_pass^word
当我看到输出回显到命令行时,我看到“java … config.user_name = the_name config.password = the_password”其中…是一堆参数和库噪声与此问题无关。 血腥的^(^)消失了。
我已经尝试了各种逃避策略,我可以find试图让脱口秀出现。 我一直无法find任何将导致插入符号出现的东西…除了用引号括起密码,就像我在input:
> run the_name "the_pass^word"
…然后生成的命令行如下所示:
java...config.user_name=the_name config.password="the_pass^word"
即我得到的脱字符,但引号现在出现在string的内容…这自然不适用于他们正在传递的应用程序。
有没有人有一个明显的提示或技巧,我已经错过了通过UNTOUCHED通过我的内部使用的命令行参数input的内容? 该值实际上是到达%2的batch filevariables。 但是,当我第一次看到%2的内容时,它已经被“解开”了。
UGH,我不是Windowsbatch file的粉丝。
更新:
非常感谢Joshua McKinnon的回应。 我select他作为解决我眼前的问题的答案。 但是,我想进一步阐述解决scheme(是的,复数)。
在batch file“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个小时的切线试图追捕这种特质(更像是白痴 – 同步)。
根据这个页面 , &| (<> ^是windows批处理文件中的所有保留字符,^是一个转义字符,以及行续字符^ ^应该给你一个^,但是那么^可能需要被转义。
要通过输入获取密码,是否尝试过将插入的数量翻两番?
eg: my_batch.cmd the_pass^^^^word
这解释了这个问题:
http://www.robvanderwoude.com/battech_inputvalidation_commandline.php
如果在批处理文件/ CMD脚本中处理一些任意字符串,请不要通过命令行参数传递它! 相反,把它们放到一个文件中,让批处理文件读取它。 因为在命令行参数中验证和消毒是永远不会被证明的。
主要的问题是,当在一行(在引号之外)找到插入符和其他特殊字符时,它们总是被处理。
当内容被%var%
扩展时,内容也被解析,但是不能用于!var!
的延迟扩展!var!
样品
@echo off setlocal Enabledelayedexpansion set variabl=-^^"^^- set variabl echo delayed !variabl! echo percent %variabl% --- Output --- variabl=-^"^^- delayed -^"^^- percent -"^-
变量的内容是set
行的问题,但是在使用%var%
时候只能作为转义字符使用。
剥去报价可能更容易。 看到这个链接的一些信息。