我將以下變數$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
uj5u.com熱心網友回復:
[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。
對于這一點,你只需要避免的前期使用字串插值逐字(單引號)字串常量('...')和讓Invoke-Expression- 這通常應避免-解釋$_變數作為其原始型別:
# Use *single* quotes to prevent up-front expansion.
$Command = 'script.ps1 -ExtraInfo $_'
Write-Host $Command
Invoke-Expression -Command $Command
請注意,逐字(非插值)字串文字的使用在Invoke-Expression此處使用安全,但正如Santiago Squarzon指出的那樣,通常可能有更好的替代方案,尤其是在 Pester 的背景關系中。
甲腳本塊系溶液({ ... }),其接收所述物件作為引數:
$Command = { script.ps1 -ExtraInfo $args[0] }
Write-Host "Calling { $Command } with argument $_"
. $Command $_
uj5u.com熱心網友回復:
正如我在評論中所述,這很奇怪,應該在代碼庫中更早地解決。但是,如果這是不可能的,請使用Invoke-Expression
像這樣
$newObj = Invoke-Expression $Obj
進一步閱讀 Invoke-Expression
uj5u.com熱心網友回復:
這不起作用,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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/369571.html
上一篇:如何在批處理檔案中指定一個帶有希伯來語名稱的檔案夾以在使用Rar.exe創建RAR存檔時排除?
下一篇:分隔以日期分隔的文本字串
