powershell psobject 显示为字符串而不是 psobject,如何转换回 psobject

powershell psobject showing as string instead of psobject, how to convert back to psobject

我将以下变量 $Obj 设置为以下字符串值:

$Obj = '@{Version=1; Name=a;}'

如何将此值从字符串转换为自定义 psobject?

我希望能够打电话

$Obj.Version 并获取值 1。目前此调用 returns 没有任何内容。

注意:由于我检索此变量的方式,我无法在没有单引号的情况下对其进行初始化。

编辑:

这是当前代码:

$Command = "script.ps1 -ExtraInfo $_"
Write-Host $Command
Invoke-Expression -Command $Command

其中 $_@{Version=1; Name=a;}(不带引号)

原来这段代码写成

. script.ps1 -ExtraInfo $_

并且有效,但是当我添加单元测试时,我将其更改为使用 Invoke-Expression,以便可以使用 Pester 单元测试对其进行测试。有没有更好的方法?

编辑2:

事实证明,这可以通过在表达式前加一个反引号 ` 来解决,这为我解决了问题。谢谢大家的意见。

$Command = "script.ps1 -ExtraInfo `$_"
Write-Host $Command
Invoke-Expression -Command $Command

正如我在评论中所述,这很奇怪,应该在代码库中尽早解决。但是,如果那不可能,请使用 Invoke-Expression

喜欢

$newObj = Invoke-Expression $Obj

Further reading on Invoke-Expression

这不适用于 Name=a,因为 a 不是已知对象(或者至少未在我的 PS 会话中定义)。但是如果这是一个字符串,这可以用下面的脚本来完成:

$Obj = '@{Version=1; Name="a";}'
$s= [System.Management.Automation.ScriptBlock]::Create("New-Object -TypeName PSObject -Property $Obj")
$o = Invoke-Command -ScriptBlock $s
$o.Version

[pscustomobject] 实例的字符串化版本,类似于 哈希表文字,不是适用于程序化处理,如下例所示:

# Stringify a [pscustomobject] instance.
PS> "$([pscsutomobject] @{ Version=1; Name='a value' })" 

@{Version=1; Name=a value}  # !! Quoting of the .Name value was lost

对于本身是复杂对象的 属性 个值,问题变得更糟。


由于您似乎确实可以访问原始 [pscustomobject] 实例,解决方案是 stringify

为此,您只需使用 verbatim (single-quoted) string literal ('...') and letting Invoke-Expression - 避免 预先 字符串插值 - 将 $_ 变量解释为其原始类型:

# Use *single* quotes to prevent up-front expansion.
$Command = 'script.ps1 -ExtraInfo $_'
Write-Host $Command
Invoke-Expression -Command $Command

请注意,verbatim(非内插)字符串文字的使用使得 Invoke-Expression 的使用在这里是安全的,因为 Santiago Squarzon 点出来,一般来说可能有更好的选择,尤其是在 Pester.

的背景下

基于script-block的解决方案 ({ ... })接收对象作为参数:

$Command = { script.ps1 -ExtraInfo $args[0] }
Write-Host "Calling { $Command } with argument $_"
. $Command $_