[英]Powershell - Object reference from XML
我需要確定在哪里加載“公司”表單配置文件。
<config>
<username>$env:username</username>
<company>$User.Company</company>
</config>
加載配置文件后:
$ConfigFile=[xml](Get-Content $ConfigFileName)
$ConfigFile.config.Company
它返回:
$User.Company
“ $ User”是另一個對象,其中$ User.Company等於:
ACME Company
我試過了:
$Company=$ExecutionContext.InvokeCommand.ExpandString($ConfigFile.config.Company)
但這只會擴展“ $ User”,而不是“ $ User.Company”。
如何將$ Company設置為$ Config.config.Company,這將導致字符串“ ACME Company”?
$ExecutionContext.InvokeCommand.ExpandString()
執行與 PowerShell隱式在"..."
上執行的相同類型的字符串擴展(插值) ,即雙引號字符串 。
在雙引號字符串內, 展開諸如$User.Company
類的表達式 (而不是單純的變量引用 (例如$User
)), 要求將該表達式括在$(...)
,否則,就像您在曾經經歷過的$User
會自行擴展,而.Company
則被視為字面值 。
請參閱此答案以了解PowerShell的字符串擴展規則。
您有兩種選擇:
在將字符串的內容傳遞給$ExecutionContext.InvokeCommand.ExpandString()
之前,將其內容包含在$(...)
$ExecutionContext.InvokeCommand.ExpandString()
請改用Invoke-Expression
,但請注意, 通常應避免使用Invoke-Expression
也就是說, 這兩種解決方案最終都會盲目執行字符串中包含的所有表達式/語句,因此您只應在您信任的輸入中執行此操作 。
放在一起:
# Sample $User object
$User = [pscustomobject] @{ Company = 'ACME Company' }
# Read the XML
$ConfigFile = [xml] '<config>
<username>$env:username</username>
<company>$User.Company</company>
</config>'
# Pass the element value of interest to $ExecutionContext.InvokeCommand.ExpandString
# after enclosing it in '$(...)' via -f, the string-formatting operator.
$ExecutionContext.InvokeCommand.ExpandString('$({0})' -f $ConfigFile.config.Company)
以上收益:
ACME Company
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.