如何让批处理脚本为外部应用程序提供带特殊字符的密码?

时间:2015-03-23 18:47:35

标签: windows batch-file cmd passwords

我有一个批处理脚本,它为Windows服务提供了启动该服务所需的用户名和密码。但是,我遇到了一些问题,试图提供一个具有Windows批处理操作符的特殊字符的密码。

我使用的密码有特殊字符,无法轻易更改以删除它们。在这种情况下,使用的特殊字符/批处理运算符为?>。我们说密码是my>passwor?d。密码存储在一个单独的批处理文件中,该文件使用引号将其存储为"my>passwor?d",以防止将运算符解释为此类。

密码提供给外部服务:

%MY_DIRECTORY%\MyService.exe -service %MY_USER% %MY_PWD%

我遇到麻烦的地方。默认情况下,%MY_PWD%包含引号作为字符串的一部分。因此,当我按原样提供时,"my>passwor?d"被提供给服务,这是不正确的,导致它失败。

当我删除引号以便我有my>passwor?d,正确的密码时,运行>?运算符,并在执行批处理脚本时导致分解错误。

最后,当我转义运算符时,my>passwor?d变为my^>passwor\?d,脚本失败,但提供给服务的密码包含转义字符,再次出错,导致服务失败。

我是否有任何解决方案可以提供包含特殊字符的密码(或实际上是任何变量),而不会传递转义字符或引号?

编辑:由于以下答案,我设法通过一些我想要注意的补充来解决这个问题。由于在外部共享文件中分配了变量,我无法更改

set MY_PWD="my>passwor?d"set "MY_PWD=my>passwor?d"

所以我不得不处理擦洗引号。我的代码最终看起来像:

setlocal enabledelayedexpansion

set MY_PWD=!MY_PWD:"=!

@echo Passing Credentials
/MyService.exe -service %MY_USER% !MY_PWD!
endlocal

1 个答案:

答案 0 :(得分:5)

对于“一般”解决方案,您可以尝试

set "MY_PWD=my>passwor?d"
for /f "delims= eol=" %%a in ("%MY_PWD%") do (
    %MY_DIRECTORY%\MyService.exe -service %MY_USER% %%~a
)

set "MY_PWD=my>passwor?d"
setlocal enabledelayedexpansion
%MY_DIRECTORY%\MyService.exe -service %MY_USER% !MY_PWD!
endlocal