Powershell - ссылка на объект из XML - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно определить, куда загружать «Компанию» из файла конфигурации.

<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"?

1 Ответ

0 голосов
/ 20 февраля 2019

$ExecutionContext.InvokeCommand.ExpandString() выполняет такой же тип расширения строки (интерполяция) , который PowerShell неявно выполняет для "...", то есть двойные кавычки строки .

Внутри строки в двойных кавычках , расширяющей выражение , такое как $User.Company - в отличие от простой ссылки на переменную (например,$User) - требует, чтобы выражение было заключено в $(...) - в противном случае, как вы уже видели $User, расширение само по себе , с учетом .Company буквальный .

См. этот ответ для обзора правил расширения строк PowerShell.

У вас есть два варианта:

При этом оба решения в конечном итоге слепо выполняют любые выражения / операторы, содержащиеся в строке, поэтому вам следуетделайте это только с помощью ввода, которым вы доверяете .

Чтобы сложить все вместе:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...