我有一个批处理脚本,它为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
答案 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