我有一种情况,我们通过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
答案 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参数解析器。