以下Powershell脚本演示了此问题:
$hash = @{'a' = 1; 'b' = 2}
Write-Host $hash['a'] # => 1
Write-Host $hash.a # => 1
# Two ways of printing using quoted strings.
Write-Host "$($hash['a'])" # => 1
Write-Host "$($hash.a)" # => 1
# And the same two ways Expanding a single-quoted string.
$ExecutionContext.InvokeCommand.ExpandString('$($hash[''a''])') # => 1
$ExecutionContext.InvokeCommand.ExpandString('$($hash.a)') # => Oh no!
Exception calling "ExpandString" with "1" argument(s): "Object reference not set to an instance of an object."
At line:1 char:1
+ $ExecutionContext.InvokeCommand.ExpandString('$($hash.a)')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NullReferenceException
任何人都知道为什么$hash.key
语法可以在任何地方工作但在显式扩展中?这可以修复,还是我必须使用$hash[''key'']
语法进行修改?
答案 0 :(得分:4)
我使用此方法,因为v4(不是在v5中)存在此错误
function render() {
[CmdletBinding()]
param ( [parameter(ValueFromPipeline = $true)] [string] $str)
#buggy
#$ExecutionContext.InvokeCommand.ExpandString($str)
"@`"`n$str`n`"@" | iex
}
您的示例的用法:
'$($hash.a)' | render
答案 1 :(得分:1)
ExpandString api并不完全适用于PowerShell脚本,而是为C#代码添加了更多。这仍然是一个错误,你的例子不起作用(我认为它已在V4中修复),但它确实意味着有一个解决方法 - 我建议一般使用。
双引号字符串有效(但不是字面意思)调用ExpandString。所以以下内容应该是等效的:
$ExecutionContext.InvokeCommand.ExpandString('$($hash.a)')
"$($hash.a)"
答案 2 :(得分:1)
我试图存储在文本文件中提示用户的文本。我希望能够在文本文件中包含从我的脚本扩展的变量。
我的设置存储在名为$ profile的PSCustomObject中,因此在我的文本中我尝试执行以下操作:
Hello $($profile.First) $($profile.Last)!!!
然后从我的脚本中我试图做到:
$profile=GetProfile #Function returns PSCustomObject
$temp=Get-Content -Path "myFile.txt"
$myText=Join-String $temp
$myText=$ExecutionContext.InvokeCommand.ExpandString($myText)
当然给我留下了错误
使用“1”参数调用“ExpandString”的异常:“对象 引用未设置为对象的实例。“
最后我发现我只需要在常规旧变量中存储我想要的PSCustomObject值,更改文本文件以使用它们而不是object.property版本,一切运行良好:
$profile=GetProfile #Function returns PSCustomObject
$First=$profile.First
$Last=$profile.Last
$temp=Get-Content -Path "myFile.txt"
$myText=Join-String $temp
$myText=$ExecutionContext.InvokeCommand.ExpandString($myText)
在文中我改为
Hello $ First $ Last !!!