我将以下变量$Obj设置为以下字符串值:
$Obj = '@{Version=1; Name=a;}'
如何将此值从字符串转换为自定义的psobject?
我想打电话给你
$Obj.Version并获取值1。当前,此调用不返回任何内容。
注意:由于我是如何检索这个变量的,如果没有单引号,我就无法初始化它。
编辑:
以下是当前代码:
$Command = "script.ps1 -ExtraInfo $_"
Write-Host $Command
Invoke-Expression -Command $Command其中$_是@{Version=1; Name=a;} (没有引号)
最初,这段代码是作为
. script.ps1 -ExtraInfo $_
并且起作用了,但是当我添加单元测试时,我将它更改为使用调用表达式,以便它可以与Pester单元测试一起测试。有更好的办法吗?
Edit2:
事实证明,这可以通过在表达式前面加上一个抽搐‘来解决,这为我解决了这个问题。谢谢大家的意见。
$Command = "script.ps1 -ExtraInfo `$_"
Write-Host $Command
Invoke-Expression -Command $Command发布于 2021-11-29 17:18:01
正如我在评论中指出的那样,这是很奇怪的,应该在代码库的前面解决。但是,如果不可能,请使用Invoke-Expression
就像这样
$newObj = Invoke-Expression $Obj发布于 2021-11-29 18:42:33
[pscustomobject] 实例的字符串化版本(类似于哈希表文字)是notE 212E 113适合编程处理E 214>,如下例所示:
# 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 - 一般情况下应该避免 -将$_变量解释为其原始类型,从而避免预先插入字符串:
# 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解决方案 ({ ... })
$Command = { script.ps1 -ExtraInfo $args[0] }
Write-Host "Calling { $Command } with argument $_"
. $Command $_发布于 2021-11-29 17:18:19
这不适用于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.Versionhttps://stackoverflow.com/questions/70158357
复制相似问题