Como usar um arquivo de configuração (ini, conf,…) com um Script do PowerShell?

14

É possível usar um arquivo de configuração com um script do PowerShell?

Por exemplo, o arquivo de configuração:

#links
link1=http://www.google.com
link2=http://www.apple.com
link3=http://www.microsoft.com

E, em seguida, chame essas informações no script PS1:

start-process iexplore.exe $Link1
Xavier C
fonte

Respostas:

17

Muito obrigado pela sua ajuda, Dennis e Tim! Suas respostas me colocaram no bom caminho e achei isso

SETTINGS.TXT

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
[General]
MySetting1=value

[Locations]
InputFile="C:\Users.txt"
OutputFile="C:\output.log"

[Other]
WaitForTime=20
VerboseLogging=True

COMANDO DE POWERSHELL

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
Get-Content "C:\settings.txt" | foreach-object -begin {$h=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $h.Add($k[0], $k[1]) } }

então

Depois de executar o trecho de código, uma variável ($ h) conterá os valores em uma HashTable.

Name                           Value
----                           -----
MySetting1                     value
VerboseLogging                 True
WaitForTime                    20
OutputFile                     "C:\output.log"
InputFile                      "C:\Users.txt"

* Para recuperar um item da tabela, use o comando $h.Get_Item("MySetting1").*

Xavier C
fonte
4
Você também pode obter as configurações pelo muito mais amigável $ h.MySetting1
Ryan Shillington
Recebo uma exceção fora dos limites da linha do analisador de expressões regulares, apesar de usar exatamente o mesmo arquivo .txt mostrado nesta resposta e o código do analisador (sem alterações) => Index was outside the bounds of the array. At C:\testConfigreader.ps1:13 char:264 + ... -ne $True)) { $h.Add($k[0], $k[1]) } } + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException + FullyQualifiedErrorId : System.IndexOutOfRangeExceptionAlguém está funcionando corretamente?
Shiva
Se o arquivo de configuração não tiver [Sections]ou ; semicolon comments, você pode fazer exatamente $config = Get-Content $ConfigPath | ConvertFrom-StringData. Consulte ConvertFrom-StringData para obter detalhes.
asmironov 8/06/19
4

Há um bom thread aqui que mostra esse código (citando o thread vinculado):

# from http://www.eggheadcafe.com/software/aspnet/30358576/powershell-and-ini-files.aspx
param ($file)

$ini = @{}
switch -regex -file $file
{
    "^\[(.+)\]$" {
        $section = $matches[1]
        $ini[$section] = @{}
    }
    "(.+)=(.+)" {
        $name,$value = $matches[1..2]
        $ini[$section][$name] = $value
    }
}
$ini

Então você pode fazer:

PS> $links = import-ini links.ini
PS> $links["search-engines"]["link1"]
http://www.google.com
PS> $links["vendors"]["link1"]
http://www.apple.com

Supondo um arquivo INI parecido com este:

[vendors]
link1=http://www.apple.com
[search-engines]
link1=http://www.google.com

Infelizmente, as regexes estão ausentes no código no link, então você terá que reproduzi-las, mas há uma versão que manipula arquivos sem cabeçalhos de seção e linhas que são comentários.

Pausado até novo aviso.
fonte
Você pode lidar com comentários facilmente apenas adicionando um outro caso para o switchcom '^#' {}. Além disso, você também pode acessar o conteúdo da hashtable com um ponto; portanto, $links.vendors.link1deve funcionar também, o que pode ser um pouco melhor para ler.
Joey
2

sim, os cmdlets que você procura são get-content e select-string.

$content=get-content C:\links.txt
start-process iexplore.exe $content[0]
Tim
fonte
0

Para uma abordagem mais abrangente, considere https://github.com/alekdavis/ConfigFile . Este módulo suporta arquivos de configuração no formato JSON, bem como INI. Ele permite expandir variáveis ​​e faz alguns truques legais. É importante lembrar que os nomes dos pares de valores-chave no arquivo INI devem corresponder aos nomes dos parâmetros ou variáveis ​​do script.

Alek Davis
fonte