我目前正在尝试编写 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
}
}
}}
用法
- ini文件打开c:\temp\myini.ini
- 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}