Windows bat文件在字符串

时间:2018-05-02 09:58:58

标签: windows batch-file cmd

我有一种情况,我们通过bat文件将用户密码发送到不同的系统,并且在大多数情况下完全正常。

但是,如果我的密码为fAhCog1H!V2%xaH,其中包含%个字符,则我们会遇到问题。

我知道%需要通过加倍%%进行转义,但我不确定我们如何动态附加额外的%以便它存储为fAhCog1H!V2%xaH }。

java -DTEST_INSTALL_DIR="C:/Program Files" com.xyz.test.installation set_password "sysadmin" "fAhCog1H!V2%xaH" || exit /b

2 个答案:

答案 0 :(得分:1)

我不确定你是如何从你的html调用批处理文件的,但是让我们说它是这样的:

call batchfile.cmd com.xyz.test.installation "sysadmin" "fAhCog1H!V2%xaH"

如果您这样做,那么您的批次将最有效:

java -DTEST_INSTALL_DIR="C:/Program Files" %1 set_password %2 %3 || exit /b

或启用delayedexpansion

@echo off
setlocal disabledelayedexpansion
set Inst=%1
set myuser=%2
set passw=%3
setlocal enabledelayedexpansion
java -DTEST_INSTALL_DIR="C:/Program Files" !Inst! set_password !myuser! !passw! || exit /b

请注意,如果密码中存在以下任何内容,则仍然存在此限制,但不起作用。 ^或系统变量(扩展前),例如%appdata%%cd% 扩展变量仍然有效,例如!cd!!appdata!

答案 1 :(得分:0)

就像@Gerhard Barnard已经说过的那样,延迟扩展对于这些类型的问题是一个很好的解决方案,因为延迟扩展变量的内容不再发生变化。

如果密码在pwd之类的变量中,则 safe ,如果密码包含引号或反斜杠,则只有java参数解析器可能会失败。

java ... set_password "sysadmin" "!pwd!" || exit /b

主要问题是将密码输入pwd变量 但这或多或少容易,所有百分比加倍,所有报价加倍 当密码被分配到DisableDelayedExpansion时,第一个pwd是为了避免感叹号和插入符号出现问题。

setlocal DisableDelayedExpansion
set "pwd=fAh""Cog1H!V2%%xaH"   

setlocal EnableDelayedExpansion
set "pwd=!pwd:\=\\!"  
set "pwd=!pwd:""=\"!"  This convert double double quotes to an escaped double quotes
java ... set_password "sysadmin" "!pwd!" || exit /b

双引号问题首先加倍所有引号,然后将它们转换为java参数解析器\"

反斜杠本身可能需要加倍以防止进一步的问题,不是批处理,而是java参数解析器。