PowerShell:如何展开数组@内的变量?WinRM HTTPS监听器配置变量未解析问题求助
解决WinRM命令中变量未展开的问题
你猜的没错,问题根源就是单引号字符串不会被PowerShell解析变量——你用单引号包裹了整个哈希表配置字符串,所以$result被当成了字面文本传递给winrm服务,而非你定义的证书指纹值。
这里有几种简单的修复方法,任选其一即可:
方法1:转义双引号包裹配置字符串
把外层的单引号换成双引号,同时对配置里的内部双引号用反引号()转义,这样PowerShell会解析字符串里的$result`变量:
$result = "F651F545A059588ABFDCE7EE3EEB27EED8CED28D" winrm create winrm/config/Listener?Address=*+Transport=HTTPS "`@{Hostname=`"my.host.winagent`"; CertificateThumbprint=`"$result`"}"
方法2:提前构建配置字符串
先把配置内容存到一个变量里,再传递给winrm命令,这样代码更易读:
$result = "F651F545A059588ABFDCE7EE3EEB27EED8CED28D" $listenerConfig = "@{Hostname=`"my.host.winagent`"; CertificateThumbprint=`"$result`"}" winrm create winrm/config/Listener?Address=*+Transport=HTTPS $listenerConfig
方法3:使用双引号Here-String
Here-String是PowerShell里处理多行/带引号字符串的利器,双引号版本的Here-String会自动解析变量,内部双引号也不需要额外转义:
$result = "F651F545A059588ABFDCE7EE3EEB27EED8CED28D" $config = @" @{Hostname="my.host.winagent"; CertificateThumbprint="$result"} "@ winrm create winrm/config/Listener?Address=*+Transport=HTTPS $config
原理总结:PowerShell中,单引号字符串是字面量字符串,不会解析任何变量、转义字符;而双引号字符串是可扩展字符串,会自动替换变量为实际值。你的原始代码用单引号包裹整个配置,导致$result没有被替换,winrm服务自然会认为这个字面量$result不是有效的十六进制指纹。
内容的提问来源于stack exchange,提问作者Wojtas.Zet
相关产品推荐
相关产品推荐

