簡體   English   中英

Powershell-XML中的對象引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM