当我们传递用“(双反转逗号)引用的参数时,批处理脚本问题

时间:2016-04-06 10:28:24

标签: windows batch-file cmd

我写了下面的脚本,要求用户输入密码作为参数 如果我输入密码"Hello&123",它会失败,但它适用于!Hello&123>之类的其他情况,请提出一些克服这种情况的好方法。

TestScript1.bat

@echo off
setlocal

set "psCommand=powershell -Command "$pword = read-host 'Enter password:' -AsSecureString ; ^
      $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
            [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
if "%password%" == "" @echo password cannot be empty & goto DIE
TestScript2.bat.bat testuser "192.168.1.1" "%password%"
endlocal

:DIE
exit /b 1

TestScript2.bat

@echo off

echo n | psftp %1@%2 -pw %3 -b Test3.bat >> TestLog.log 2>&1

3 个答案:

答案 0 :(得分:1)

尝试扩展变量时,需要使用延迟扩展 对于任何内容,延迟扩展始终是安全的 但由于延迟扩张,感叹号和插入符号存在问题 这就是为什么你应该在set "password=%%p"之后启用它。

@echo off
setlocal DisableDelayedExpansion
set "psCommand=powershell -Command "$pword = read-host 'Enter password:' -AsSecureString ; ^
      $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
            $str=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR); ^
            Write-host('#'+$str)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set "password=%%p"
setlocal EnableDelayedExpansion
set "password=!password:*#=!"
if not defined password (

    echo password cannot be empty
    goto :DIE
)
echo It works: pwd=!password!
TestScript2.bat testuser "192.168.1.1" "!password!"

但是你会得到TestScript2.bat的下一个问题,因为扩展本身是安全的,但是你不能通过值将任意密码传递给函数或批处理文件(这实际上是不可能的)。

所以你应该通过ref而不是值来传递它。

TestScript2.bat testuser "192.168.1.1" password

使用!%~3!

再次在TestScript2.bat中使用它

但是用密码调用psftp命令会再次导致任意值的问题 您需要将内容转义为安全格式,在这种情况下,您必须考虑psftp的规则 我测试过,psftp将\""替换为"

<强> TestScript2.bat

@echo off
setlocal EnableDelayedExpansion
set "password=!%~3!"
set "password=!password:"=\""!"
... more replace rules
echo n | psftp %1@%2 -pw "!password!" -b Test3.bat >> TestLog.log 2>&1

答案 1 :(得分:0)

我认为你想要的是这样的:

SET Test="Hello"
FOR /F "TOKENS=2 DELIMS==" %a in ('SET Test') DO @ECHO %~a

%~a删除任何引号。

答案 2 :(得分:0)

&符号和>都需要转义(!Hello^&123^>),因为它们当前不是%3,而是!Hello

您可以使用延迟扩展来解决此问题:

setlocal enableDelayedExpansion
TestScript2.bat testuser "192.168.1.1" !password!