Елегантний спосіб встановлення змінних у файлах .ini


1

Наразі я намагаюся скриптувати встановлення Microsoft Sql Server 2012, і у мене виникла проблема з тим, щоб дозволити користувачеві встановити параметри для процесу встановлення в моєму скрипті повноважень

Оскільки параметри сервера sql встановлені у файлі .ini, я не впевнений, що найкращий спосіб редагувати вказаний файл .ini. Я міг бачити себе

  • Скопіюйте весь файл .ini в оболонку потужності та встановивши змінні в лапки, щоб потім виписати його, або
  • збереження файлу ini окремо та пошук кожного рядка, мені потрібно встановити змінні як рядок для редагування окремо.

Чи є якийсь більш елегантний спосіб роботи з .ini файлами, ніж цей? Чи є якийсь модуль "знайти і замінити" модуль оболонки для файлів, які я міг би використовувати?


Напевно, найкраще переписати весь файл .ini із змінної "in-script", яка містить ваш шаблон, оскільки тоді ви можете гарантувати, що вміст буде таким, яким він вам потрібен (плюс значення, які користувач встановлює) ...
Кіннект

"Чи є який-небудь" знайти і замінити "модуль PowerShell для файлів, які я міг би використовувати?" Файли INI - це лише текст, будь-яка з стандартних команд пошуку та заміни PS працюватиме на одній. Завантажте файл у пам’ять, знайдіть та замініть, перекиньте назад у файл.
Ƭᴇcʜιᴇ007

Відповіді:


1

Розглядайте .ini як текстовий файл. Скажімо, у нас є такі .ini:

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

Щоб змінити значення, присвоєне "var2", ми можемо зробити:

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

Де "bar2" - це визначене користувачем значення. Щоб включити визначене користувачем значення, ви можете:

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

Те, як ви вирішите спроектувати, як обробляти заміну, буде залежати від даних у вашому конкретному файлі.


Це занадто просто, а якщо є кілька записів =foo2, вам також потрібно вказати ім'я значення. Що робити, якщо в різних розділах є дублюючі імена значень?
Пітер Гандорф

0

з 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
        }
    } 
}}

Використання

  1. inifile відкрити c: \ temp \ myini.ini
  2. inifile значення колонтитула запису заголовка

$ a = $ (iniread нижній колонтитул)

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}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.