如何在PowerShell脚本中使用配置文件(ini,conf等)?


14

是否可以将配置文件与PowerShell脚本一起使用?

例如,配置文件:

#links
link1=http://www.google.com
link2=http://www.apple.com
link3=http://www.microsoft.com

然后在PS1脚本中调用此信息:

start-process iexplore.exe $Link1

Answers:


17

非常感谢您的帮助,丹尼斯和蒂姆!您的回答使我步入正轨,我发现了这一点

设置文件

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
[General]
MySetting1=value

[Locations]
InputFile="C:\Users.txt"
OutputFile="C:\output.log"

[Other]
WaitForTime=20
VerboseLogging=True

POWERSHELL命令

#from http://tlingenf.spaces.live.com/blog/cns!B1B09F516B5BAEBF!213.entry
#
Get-Content "C:\settings.txt" | foreach-object -begin {$h=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $h.Add($k[0], $k[1]) } }

然后

执行代码段后,变量($ h)将包含HashTable中的值。

Name                           Value
----                           -----
MySetting1                     value
VerboseLogging                 True
WaitForTime                    20
OutputFile                     "C:\output.log"
InputFile                      "C:\Users.txt"

*要从表中检索项目,请使用命令 $h.Get_Item("MySetting1").*


4
您也可以通过友好得多的$ h.MySetting1
Ryan Shillington

尽管使用了此答案中显示的完全相同的.txt文件和解析器代码(无更改),但是我在regex解析器行中得到了数组超出范围的异常(没有更改)=> Index was outside the bounds of the array. At C:\testConfigreader.ps1:13 char:264 + ... -ne $True)) { $h.Add($k[0], $k[1]) } } + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException + FullyQualifiedErrorId : System.IndexOutOfRangeException有人能正常工作吗?
湿婆神

如果您的配置文件没有[Sections]; semicolon comments,则可以执行$config = Get-Content $ConfigPath | ConvertFrom-StringData。有关详细信息,请参见ConvertFrom-StringData
asmironov

4

这里有一个很好的线程显示此代码(引用链接的线程):

# from http://www.eggheadcafe.com/software/aspnet/30358576/powershell-and-ini-files.aspx
param ($file)

$ini = @{}
switch -regex -file $file
{
    "^\[(.+)\]$" {
        $section = $matches[1]
        $ini[$section] = @{}
    }
    "(.+)=(.+)" {
        $name,$value = $matches[1..2]
        $ini[$section][$name] = $value
    }
}
$ini

然后,您可以执行以下操作:

PS> $links = import-ini links.ini
PS> $links["search-engines"]["link1"]
http://www.google.com
PS> $links["vendors"]["link1"]
http://www.apple.com

假设一个INI文件如下所示:

[vendors]
link1=http://www.apple.com
[search-engines]
link1=http://www.google.com

不幸的是,链接的代码中缺少正则表达式,因此您必须重制它们,但是有一个版本可以处理没有节头和注释行的文件。


您只需在switchwith中添加另一个大小写即可轻松处理注释'^#' {}。您也可以用点访问哈希表内容,因此也$links.vendors.link1应该可以工作,这可能会更好地读取。
乔伊

2

是的,您要查找的cmdlet是get-content和select-string。

$content=get-content C:\links.txt
start-process iexplore.exe $content[0]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.