如何将包含插入符号(^)的密码作为参数传递给Windows批处理文件?

cha*_*ium 12 windows cmd batch-file

摘要:
从命令行(在Windows Server 2003 R2上),我键入:

> SET password=a^b  
> ECHO %password%
Run Code Online (Sandbox Code Playgroud)

结果是"ab".怪胎插入符号(^)去了哪里?然后我尝试用^^,`^,%^,^^^"逃避"它,并且这些都没有使插入符号传递给echo命令.这个批处理文件位于中间.因此,我既不能更改源系统的密码以避免使用插入符,也不能将目标系统的密码更改为与源系统不同步.

细节:
我搜索了Google,然后搜索了SO.虽然我现在有很多关于如何更好地设计我的血腥Windows批处理文件的技巧,但问题仍然存在.

我有一个名为run.bat的批处理文件,它由一系列SET语句组成,用于设置运行Java命令行应用程序的上下文.在"cd"到正确的文件夹之后,在命令行上的提示符下(在Windows Server 2003 R2上),我输入:

> run the_name the_pass^word
Run Code Online (Sandbox Code Playgroud)

当我查看回显到命令行的输出时,我看到"java ... config.user_name = the_name config.password = the_password",其中...是一堆参数和库噪声与此问题无关.血腥的插入符号(^)消失了.

我已经尝试了各种逃避策略,我试图让插入符号显示出来.我无法找到任何会导致插入符号显示的内容...除了用引号包围密码,如我输入:

> run the_name "the_pass^word"
Run Code Online (Sandbox Code Playgroud)

...然后生成的命令行如下所示:

java...config.user_name=the_name config.password="the_pass^word"
Run Code Online (Sandbox Code Playgroud)

即我得到插入符号,但引号现在出现在字符串的内容中...这自然不适用于它们被传递的应用程序.

有没有人有一个明显的提示或技巧我错过了在命令行中输入的内容通过UNTOUCHED传递给我的内部利用?该值实际上是在%2的批处理文件变量中.但是,当我第一次看到%2的内容时,它已被"解除".

嗯,我不是Windows批处理文件的粉丝.

更新:
非常感谢Joshua McKinnon的回应.我选择了他作为答案,因为它解决了我的直接问题.但是,我想进一步阐述解决方案(是的,复数).

  1. 无需使用任何形式的SetLocal/EndLocal
  2. 必须使用%~1样式语法 - 找不到用于保留插入符号的%1语法形式
  3. 解决方案:不带引号,使用4个连续插入符号(例如:使用传递^^^^字来产生传递^字)
  4. 解决方案:引用,使用2个连续插入符号(例如:使用"传递^^字"来产生传递^字)

在批处理文件"run.bat"中,使用%~1语法,如下所示:

java MyClass username=%~1 password=%~2
Run Code Online (Sandbox Code Playgroud)

...然后在命令行输入:

> run mr_clean puke^^^^boy  
Run Code Online (Sandbox Code Playgroud)

要么

> run mr_clean "puke^^boy"  
Run Code Online (Sandbox Code Playgroud)

然后,这将导致最终执行的语句看起来像:

java MyClass username=mr_clean password=puke^boy  
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他节省时间.我结束了6个小时的切线试图追捕这种特质(更像是白痴同步).

Jos*_*non 9

根据这个页面,&| (<> ^是windows批处理文件中的所有保留字符.^是一个转义字符,以及行继续符.^^应该给你一个^,但那时^可能需要转义.

要通过输入获取密码,您是否尝试过多次插入数量?

e.g.:  my_batch.cmd the_pass^^^^word
Run Code Online (Sandbox Code Playgroud)

  • 需要的原因4是因为每次处理时,每个^^变成^.因此,当读取参数时,它从^^^^变为^^,当读取该变量并将其放入另一个变量时,它从^^变为^.如果它第三次处理,你甚至需要更多.(每次总是两倍.)幸运的是,它似乎在那时停止了:) (3认同)