¿Cómo usar un archivo de configuración (ini, conf, ...) con un script de PowerShell?

14

¿Es posible usar un archivo de configuración con un script de PowerShell?

Por ejemplo, el archivo de configuración:

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

Y luego llame a esta información en el script de PS1:

start-process iexplore.exe $Link1
Xavier C
fuente

Respuestas:

17

Muchas gracias por su ayuda Dennis y Tim! Sus respuestas me pusieron en el buen camino y encontré esto

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 PODERES

#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]) } }

luego

Después de ejecutar el fragmento de código, una variable ($ h) contendrá los valores en una tabla hash.

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

* Para recuperar un elemento de la tabla, use el comando $h.Get_Item("MySetting1").*

Xavier C
fuente
44
También puede obtener la configuración por el mucho más amigable $ h.MySetting1
Ryan Shillington
Obtengo una excepción de matriz fuera de límites en la línea del analizador de expresiones regulares, a pesar de usar exactamente el mismo archivo .txt que se muestra en esta respuesta y el código del analizador (sin cambios) => 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.IndexOutOfRangeException¿Alguien tiene esto funcionando correctamente?
Shiva
Si el archivo de configuración no tiene [Sections]o ; semicolon comments, puede hacerlo solo $config = Get-Content $ConfigPath | ConvertFrom-StringData. Vea ConvertFrom-StringData para más detalles.
asmironov
4

Hay un buen hilo aquí que muestra el código (citando el hilo unido):

# 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

Entonces puedes hacer:

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

Suponiendo un archivo INI que se ve así:

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

Desafortunadamente, faltan expresiones regulares en el código en el enlace, por lo que tendrá que reproducirlas, pero hay una versión que maneja archivos sin encabezados de sección y líneas que son comentarios.

Pausado hasta nuevo aviso.
fuente
Puede manejar los comentarios fácilmente simplemente agregando otro caso al switchcon '^#' {}. También puede acceder a contenido de tabla hash con un punto, por lo $links.vendors.link1que también debería funcionar , lo que podría ser un poco mejor para leer.
Joey
2

Sí, los cmdlets que está buscando son get-content y select-string.

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

Para un enfoque más completo, considere https://github.com/alekdavis/ConfigFile . Este módulo admite archivos de configuración en formato JSON, así como INI. Permite expandir variables y hace algunos trucos geniales. Lo que debe recordar es que los nombres de los pares clave-valor en el archivo INI deben coincidir con los nombres de los parámetros o variables del script.

Alek Davis
fuente