在 .ini 文件中设置变量的优雅方法

在 .ini 文件中设置变量的优雅方法

我目前正在尝试编写 Microsoft Sql Server 2012 的安装脚本,但在让用户在我的 powershell 脚本中设置安装过程选项时遇到了问题

由于 sql server 的选项是在 .ini 文件中设置的,因此我不确定编辑该 .ini 文件的最佳方法是什么。我自己可以查看

  • 在 powershell 中复制整个 .ini 文件并在引号中设置变量以便稍后将其写出,或者
  • 单独保存 ini 文件并搜索每一行我需要将变量设置为字符串以进行单独编辑。

有没有比这更优雅的方式来处理 .ini 文件?有没有我可以使用的“查找和替换”文件的 powershell 模块?

答案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

您选择设计处理替换的方式将依赖于特定文件中的数据。

答案2

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. ini文件打开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}

相关内容