3 votes

Une manière élégante de définir des variables dans les fichiers .ini

J'essaie actuellement de script l'installation de Microsoft Sql Server 2012, et j'ai rencontré un problème en laissant l'utilisateur définir des options pour le processus d'installation dans mon powershell script.

Comme les options du serveur SQL sont définies dans un fichier .ini, je ne sais pas quelle est la meilleure façon d'éditer ce fichier .ini. Je pourrais me voir

  • Copier l'ensemble du fichier .ini dans powershell et définir des variables entre guillemets pour l'écrire plus tard, ou
  • en sauvegardant le fichier ini séparément et en recherchant chaque ligne dont j'ai besoin pour définir les variables sous forme de chaîne à éditer séparément.

Existe-t-il une façon plus élégante de travailler avec les fichiers .ini ? Existe-t-il un module powershell de recherche et de remplacement de fichiers que je pourrais utiliser ?

2voto

root Points 3412

Traiter le fichier .ini comme un fichier texte. Supposons que nous ayons le fichier .ini suivant :

[section1]
var1=foo1
[section2]
var2=foo2
var3=foo3

Pour modifier la valeur attribuée à "var2", nous pouvons faire :

(get-content .\test.ini).Replace('foo2','bar2') | Set-Content .\test.ini

Où "bar2" est la valeur définie par l'utilisateur. Pour incorporer la valeur définie par l'utilisateur, vous pourriez faire :

$ini = ".\test.ini"
$userInput = Read-Host -Prompt "Enter a new value for var2"
(get-content $ini).Replace('foo2',$userInput) | Set-Content $ini

La manière dont vous choisirez de gérer le remplacement dépendra des données contenues dans votre fichier.

0voto

De https://github.com/brandoncomputer/vds

function inifile ($a,$b,$c,$d){
switch ($a){ 
    open {
        $global:inifile = $b
    } 
    write {
        $Items = New-Object System.Collections.Generic.List[System.Object]
        $content = get-content $global:inifile
        if ($content)
        {
            $Items.AddRange($content)
        }
        if ($Items.indexof("[$b]") -eq -1)
            {
            $Items.add("")
            $Items.add("[$b]")
            $Items.add("$c=$d")
            $Items | Out-File $global:inifile
            }
        else
        {
        For ($i=$Items.indexof("[$b]")+1; $i -lt $Items.count; $i++) 
        {
        if ($Items[$i].length -gt $c.length)
            {
            if ($Items[$i].substring(0,$c.length) -eq $c -and ($tgate -ne $true))
                {
                    $Items[$i] = "$c=$d"
                    $tgate = $true
                }
            }
            if ($Items[$i].length -gt 0)
            {
                if (($Items[$i].substring(0,1) -eq "[") -and ($tgate -ne $true))
                {
                    $i--
                    $Items.insert(($i),"$c=$d")
                    $tgate = $true
                    $i++
                }
            }               
        }
        if ($Items.indexof("$c=$d") -eq -1)
        {
            $Items.add("$c=$d")
        }

        $Items | Out-File $global:inifile -enc ascii
        }
    } 
}}

Utilisation

  1. inifile open c : \temp\myini.ini
  2. inifile write header footer value

$a = $(iniread header footer)

function iniread($a,$b) {
$Items = New-Object System.Collections.Generic.List[System.Object]
$content = get-content $global:inifile
if ($content)
{
    $Items.AddRange($content)
}
if ($Items.indexof("[$a]") -eq -1)
    {
    $return = ""
    }
else
{
    $return = ""
    For ($i=$Items.indexof("[$a]")+1; $i -lt $Items.count; $i++) 
    {
    if ($Items[$i].length -gt $b.length)
        {
        if ($Items[$i].substring(0,$b.length) -eq $b -and $gate -ne $true)
            {
                $return = $Items[$i].split("=")[1]
                $gate = $true
            }
        }
        if ($Items[$i].length -gt 0)
        {
            if (($Items[$i].substring(0,1) -eq "[") -and ($tgate -ne $true))
            {$gate = $true}
        }
    }
}return $return}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X