如何在带有许多引号的 Windows Docker 容器中执行 WMI 查询?

How to perform a WMI query in a Windows Docker container with many quotes?

我很难在 docker 容器中执行 WMI 查询。在我的主机上,我可以毫无问题地执行下面的查询。

Get-WmiObject -Namespace "root\cimv2" -query "select HotfixID from Win32_QuickFixEngineering where HotFixID = `"KB4571756`"" 

但是,当我尝试在 docker 容器中执行相同的查询时,我不断收到如下错误:

docker exec my_container powershell "Get-WmiObject -Namespace `"root\cimv2`" -query `"select HotfixID from Win32_QuickFixEngineering where HotFixID = `"KB4571756`"`""

请注意,我试图转义命令中的每个引号。上述命令的错误是:

The string is missing the terminator: ".
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordEx
   ception
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

我尝试使用不同的引号,例如 "',但都没有成功。我知道我可以使用 docker 交互模式执行相同的查询而不会出现问题,但是需要以这样一种方式集成此查询,以便我可以使用 Stdin 执行它们并从我编写的另一个代码中读取 Stdout 的输出。

两种可能的方式:

A​​) 在命令中对字符串使用单引号

docker exec my_container powershell "Get-WmiObject -Namespace 'root\cimv2' -Query 'select HotfixID from Win32_QuickFixEngineering where HotFixID = ''KB4571756'''"

B) 使用EncodedCommand

$command = { Get-WmiObject -Namespace "root\cimv2" -Query "select HotfixID from Win32_QuickFixEngineering where HotFixID = 'KB4571756'" }
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command.ToString())
$encodedCommand = [Convert]::ToBase64String($bytes)

docker exec powershell -EncodedCommand $encodedCommand