如何在带有许多引号的 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
我很难在 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