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

How can I make a batch script supply a password with special characters to an external application?

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

对于 "general" 的解决方案,您可以尝试

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