Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows bat文件以字符串形式动态地将%替换为%%_Windows_Batch File_Cmd - Fatal编程技术网

Windows bat文件以字符串形式动态地将%替换为%%

Windows bat文件以字符串形式动态地将%替换为%%,windows,batch-file,cmd,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" "fAh

我有这样一种情况,我们通过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

正如@Gerhard Barnard已经说过的,延迟扩展是解决这类问题的好方法,因为延迟扩展变量的内容不再改变

当您在变量(如
pwd
中包含密码时,这是安全的,如果密码包含引号或反斜杠,则只有java参数解析器可能会失败

java ... set_password "sysadmin" "!pwd!" || exit /b
主要问题是将密码输入
pwd
变量。
但这或多或少很简单,所有百分比加倍,所有报价加倍。
第一个
禁用delayedexpansion
是为了避免在密码被分配到
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参数解析器。

我不确定如何从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!

您需要提供代码并显示密码的来源或存储位置。我认为这是批处理文件的最坏情况之一。不使用powershell有什么具体原因吗?如果启用
延迟Expansi,就很容易了在
上,但显示代码。@GerhardBarnard这不容易。如果我的密码包含
!appdata!
,那会怎么样?@anders,仍然可行,但这个问题是关于
%
而不是
我想补充一点,确保变量来自外部,因为如果在内部创建变量,它将丢弃
%
在密码中,如果你只有1
%
@GerhardBarnard因此,我写了
双倍所有百分比和双倍所有引号
,或者你的意思不同吗?是的,对不起,我应该更清楚。OP希望动态双倍
%
,而不是手动,因此如果你在脚本中将密码变量设置为
psw=P%ssword
即使在delayedexpansion中,它也会回显
Pssword
,除非变量来自外部。@GerhardBarnard谢谢,未更改的密码只能由读取文件功能处理,然后必须以某种方式存储在模糊接口的文件中。未更改的密码参数字符串根本不能由批处理,想想像
ab^c&“&%cd%
@jeb这样的密码是的,你是正确的,这更多地是基于用户的密码示例,如果使用插入符号或系统变量,则会出现问题。