【发布时间】:2022-01-06 12:27:09
【问题描述】:
我将以下变量 $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 $_
并且工作,但是当我添加单元测试时,我将其更改为使用 Invoke-Expression,以便可以使用 Pester 单元测试对其进行测试。有没有更好的办法?
编辑2:
事实证明,这可以通过在表达式前加上一个反引号 ` 来解决,这为我解决了这个问题。谢谢大家的意见。
$Command = "script.ps1 -ExtraInfo `$_"
Write-Host $Command
Invoke-Expression -Command $Command
【问题讨论】:
-
请告诉我们
$Obj是如何生成的,以及为什么没有单引号就不能初始化它。 -
这确实是一个奇怪的情况,我不禁相信可以在代码库中更早地解决它
-
编辑了我的问题以显示更多信息。到目前为止,感谢您的 cmets。
-
不确定 pester 是如何工作的,从不关心它的使用,但
. script.ps1 -ExtraInfo $_看起来比iex好得多。 -
在 Pester 方面有经验的人可能会给你一个替代你正在做的事情的方法,我认为 不应该在任何情况下都需要使用
iex(除非非常利基)。如果您想获得“编码最佳实践”的答案,我建议您添加 Pester 代码以及script.ps1的最小示例(至少是param(...)块)。此外,在您的问题中添加pester 标签。
标签: string powershell psobject