我怎样才能得到一个包含插入符号(^)作为parameter passing给Windowsbatch file的密码?

概要:
从命令行(在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(是的,复数)。

  1. 不需要使用任何forms的SetLocal / EndLocal
  2. 必须使用%〜1风格的语法 – 找不到用于保存插入符号的%1语法的任何forms
  3. 解决方法:不加引号,连续使用4个插入符号(例如:使用合格^^^^字来产生合格^字)
  4. 解决scheme:引用连续的2个插入符号(例如:使用“传递^^字”来产生传递^字)

在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%时候只能作为转义字符使用。

剥去报价可能更容易。 看到这个链接的一些信息。