PowerShell читает переменные из текстового файла - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь создать программу, которая получает переменные из внешнего файла.Моя проблема заключается в том, что политика компании не позволяет пользователям запускать файлы ps1 (программа работает, потому что я компилирую ps1 в exe с помощью ps2exe), поэтому этот внешний файл должен быть в формате txt, csv или в другом текстовом формате.Я не хочу записывать эти переменные в исполняемый файл, потому что пользователям нужна некоторая гибкость в использовании значений, которые они используют.

Я попытался создать хеш-таблицу и получить переменные в нее с помощью ConvertFrom-StringData, но этопортит вывод.

file.txt

one = foo
two = bar

prog.ps1

$variable = Get-Content ".\file.txt" | Out-String | ConvertFrom-StringData
Write-Host $variable.one
Write-Host "$variable.two"

Последний отображается как: System.Collections.Hashtable.two вместозначения $ variable.two.Конечно, в этом упрощенном примере на самом деле не было необходимости в кавычках вокруг второй переменной, но эта программа нуждается в некоторых местах.

Когда я хранил переменные в правильном формате в файле ps1и внедрил его обычным

. .\file.ps1

способом, он работал как надо, но его не могут использовать пользователи, которым он нужен.

Буду признателен за любые идеи о том, какзаставить это работать.Я имею в виду, если это вообще возможно.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Ваша проблема - просто неверное использование синтаксиса интерполяции внутри расширяемой строки ("...") :

"$variable.two" расширяет $variable самостоятельно , за которым следует литерал .two, потому что для того, чтобы встроить выражения в расширяемые строки Вы должны заключить их в $(...), т. е. в этом случае "$($variable.two)" - см. этот ответ для краткого изложения правил расширения строк PowerShell.

Возможно, что удивительно, Write-Host $variable.one - без с включением "..." - успешно получили доступ к значению свойства, потому что это выражение значения , а не (неявно) расширяемая строка; этот ответ содержит больше информации о том, как без кавычек токены анализируются как аргументы команды.

Также:

  • Если вы работаете в PowerShell v3 или выше, Get-Content -Raw проще и эффективнее, чем ... | Out-String, чтобы получить весь текстовый файл в виде одной многострочной строки.

  • В качестве отступления: Write-Host, как правило, является неправильным инструментом для использования , если только намерение не состоит в том, чтобы записать только на дисплей , минуя поток успешных выходных данных и с его помощью можно отправлять вывод другим командам, записывать его в переменную, перенаправлять в файл. В PSv5 + Write-Host записывает в поток информации , чей вывод может быть записан, но только через 6>. См. Нижний раздел этот ответ для получения дополнительной информации.

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

$variable = Get-Content -Raw .\file.txt | ConvertFrom-StringData

'--- implicit output, to success stream'
$variable.one
$variable.two

'--- explicit to-host output, via expandable string'
write-host $variable.one
write-host "$($variable.two)"  # Note the $(...) around the property access

Вышеуказанные выходы:

--- implicit output, to success stream
foo
bar
--- explicit to-host output, via expandable string
foo
bar
0 голосов
/ 29 апреля 2019

То, что вы делаете, работает, но вы используете неверный синтаксис для указанных в кавычках переменных.

Должно быть:

$variable = Get-Content ".\file.txt" | Out-String | ConvertFrom-StringData
Write-Host $variable.one
Write-Host "$($variable.two)"

Для получения дополнительной информации см. этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...