1

В настоящее время я пытаюсь выполнить сценарий установки Microsoft Sql Server 2012, и у меня возникла проблема с возможностью установки пользователем параметров для процесса установки в моем сценарии powershell.

Поскольку параметры сервера SQL установлены в INI-файле, я не уверен, как лучше всего отредактировать указанный INI-файл. Я мог видеть себя

  • Копирование всего файла .ini в powershell и установка переменных в кавычках, чтобы выписать его позже, или
  • Сохранение INI-файла отдельно и поиск каждой строки Мне нужно установить переменные в виде строки для редактирования отдельно.

Есть ли более элегантный способ работы с файлами .ini, чем этот? Есть ли какой-нибудь модуль PowerShell для поиска и замены файлов, которые я мог бы использовать?

2 ответа2

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

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

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. открыть файл 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}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .