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
这不适用于 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 $_
我将以下变量 $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
这不适用于 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 $_