首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >powershell psobject显示为字符串而不是psobject,如何将其转换回psobject

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

Stack Overflow用户
提问于 2021-11-29 16:53:15
回答 3查看 343关注 0票数 1

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

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

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

我想打电话给你

$Obj.Version并获取值1。当前,此调用不返回任何内容。

注意:由于我是如何检索这个变量的,如果没有单引号,我就无法初始化它。

编辑:

以下是当前代码:

代码语言:javascript
复制
$Command = "script.ps1 -ExtraInfo $_"
Write-Host $Command
Invoke-Expression -Command $Command

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

最初,这段代码是作为

. script.ps1 -ExtraInfo $_

并且起作用了,但是当我添加单元测试时,我将它更改为使用调用表达式,以便它可以与Pester单元测试一起测试。有更好的办法吗?

Edit2:

事实证明,这可以通过在表达式前面加上一个抽搐‘来解决,这为我解决了这个问题。谢谢大家的意见。

代码语言:javascript
复制
$Command = "script.ps1 -ExtraInfo `$_"
Write-Host $Command
Invoke-Expression -Command $Command
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-29 17:18:01

正如我在评论中指出的那样,这是很奇怪的,应该在代码库的前面解决。但是,如果不可能,请使用Invoke-Expression

就像这样

代码语言:javascript
复制
$newObj = Invoke-Expression $Obj

进一步解读调用-表达式

票数 -1
EN

Stack Overflow用户

发布于 2021-11-29 18:42:33

[pscustomobject] 实例的字符串化版本(类似于哈希表文字)是notE 212E 113适合编程处理E 214>,如下例所示:

代码语言:javascript
复制
# Stringify a [pscustomobject] instance.
PS> "$([pscsutomobject] @{ Version=1; Name='a value' })" 

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

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

由于您似乎确实可以访问原始[pscustomobject]实例,所以解决方案是而不是来对进行字符串化。

为此,您只需使用(单引号)字符串文字 ('...')并让Invoke-Expression - 一般情况下应该避免 -将$_变量解释为其原始类型,从而避免预先插入字符串:

代码语言:javascript
复制
# Use *single* quotes to prevent up-front expansion.
$Command = 'script.ps1 -ExtraInfo $_'
Write-Host $Command
Invoke-Expression -Command $Command

请注意,使用逐字(非内插)字符串文字可以使Invoke-Expression在这里安全使用,不过,正如圣地亚哥·斯夸尔松指出的,可能有更好的替代方法,特别是在Pester的上下文中。

接收对象作为参数的https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Script_Blocks-based解决方案 ({ ... })

代码语言:javascript
复制
$Command = { script.ps1 -ExtraInfo $args[0] }
Write-Host "Calling { $Command } with argument $_"
. $Command $_
票数 1
EN

Stack Overflow用户

发布于 2021-11-29 17:18:19

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

代码语言:javascript
复制
$Obj = '@{Version=1; Name="a";}'
$s= [System.Management.Automation.ScriptBlock]::Create("New-Object -TypeName PSObject -Property $Obj")
$o = Invoke-Command -ScriptBlock $s
$o.Version
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70158357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档