Прочитать файл свойств в powershell

Предположим, что у меня есть файл .properties и его содержимое:

app.name=Test App
app.version=1.2
...

как я могу получить значение app.name?


person jos11    schedule 28.11.2013    source источник
comment
Вы можете использовать регулярное выражение или -split строки в =.   -  person Ansgar Wiechers    schedule 29.11.2013


Ответы (4)


Вы можете использовать ConvertFrom-StringData для преобразования пар Key=Value в хеш-таблицу:

$filedata = @'
app.name=Test App
app.version=1.2
'@

$filedata | set-content appdata.txt

$AppProps = convertfrom-stringdata (get-content ./appdata.txt -raw)
$AppProps

Name                           Value                                                                 
----                           -----                                                                 
app.version                    1.2                                                                   
app.name                       Test App                                                              

$AppProps.'app.version'

 1.2
person mjolinor    schedule 28.11.2013
comment
спасибо!!! Я реализовал свой код следующим образом: $AppProps = convertfrom-stringdata (get-content ./app.properties -raw) $AppProps.'client.version' - person jos11; 29.11.2013
comment
Флаг -Raw был добавлен в PowerShell 3. Если вы хотите использовать его в PowerShell 2, используйте вместо него Get-Content $file | Out-String. - person Koraktor; 18.09.2014

Если вы используете powershell v2.0, вам может не хватать аргумента -Raw для Get-Content. В этом случае можно использовать следующее.

Содержимое C:\temp\Data.txt:

среда=Q ГРЗ

target_site = ФШХПУ

Код:

$file_content = Get-Content "C:\temp\Data.txt"
$file_content = $file_content -join [Environment]::NewLine

$configuration = ConvertFrom-StringData($file_content)
$environment = $configuration.'environment'
$target_site = $configuration.'target_site'
person a73x    schedule 11.03.2014

Я хотел добавить решение, если вам нужно экранирование (например, если у вас есть пути с обратной косой чертой):

$file_content = Get-Content "./app.properties" -raw
$file_content = [Regex]::Escape($file_content)
$file_content = $file_content -replace "(\\r)?\\n", [Environment]::NewLine
$configuration = ConvertFrom-StringData($file_content)
$configuration.'app.name'

Без -raw:

$file_content = Get-Content "./app.properties"
$file_content = [Regex]::Escape($file_content -join "`n")
$file_content = $file_content -replace "\\n", [Environment]::NewLine
$configuration = ConvertFrom-StringData($file_content)
$configuration.'app.name'

Или в однострочном стиле:

(ConvertFrom-StringData([Regex]::Escape((Get-Content "./app.properties" -raw)) -replace "(\\r)?\\n", [Environment]::NewLine)).'app.name'
person Brice Ruppen    schedule 03.03.2018
comment
Это была моя точная проблема! Спасибо, что добавили это. - person DarkerIvy; 21.03.2018
comment
Почему экранирование регулярных выражений и нормализация окончаний строк вручную? Get-Content, похоже, автоматически обрабатывает окончания любой строки в моей системе (Windows 10.0.17134.765). - person brianary; 19.08.2019

Я не знаю, есть ли какой-то встроенный в Powershell способ сделать это, но я могу сделать это с помощью регулярного выражения:

$target = "app.name=Test App
app.version=1.2
..."

$property = "app.name"
$pattern = "(?-s)(?<=$($property)=).+"

$value = $target | sls $pattern | %{$_.Matches} | %{$_.Value}

Write-Host $value

Должно быть напечатано «Тестовое приложение».

person Vasili Syrakis    schedule 28.11.2013