PowerShell从简单的.ini文件中读取单个值

时间:2017-04-28 23:51:37

标签: powershell ini

我发现的一切看起来都很复杂。 这几乎就像我只需要阅读一个文本文件。

ADAP.ini包含此内容,其他内容:

http://xxx.104.xxx.226
APP=2.3.6
DLL=2.3.6

使用Powershell, 我该如何阅读APP =值是什么? 和/或DLL =值是什么?

我会将值存储在变量中,稍后在Powershell脚本中使用它。

5 个答案:

答案 0 :(得分:7)

这似乎是ConvertFrom-StringData的一个很好的用例,它默认查找由等号符号分隔的键值对。

因为.ini文件的第一行没有等于,我们需要跳过它以避免错误。这可以通过Select -Skip 1完成。

以下是代码:

$ADAP = Get-Content 'ADAP.ini' | Select -Skip 1 | ConvertFrom-StringData

然后,您可以通过访问它们作为$ADAP对象的命名属性来获取APP和DLL的值,如下所示:

$ADAP.APP
$ADAP.DLL

答案 1 :(得分:5)

您可以轻松编写PowerShell函数,以便读取ini文件:

function Get-IniFile 
{  
    param(  
        [parameter(Mandatory = $true)] [string] $filePath  
    )  

    $anonymous = "NoSection"

    $ini = @{}  
    switch -regex -file $filePath  
    {  
        "^\[(.+)\]$" # Section  
        {  
            $section = $matches[1]  
            $ini[$section] = @{}  
            $CommentCount = 0  
        }  

        "^(;.*)$" # Comment  
        {  
            if (!($section))  
            {  
                $section = $anonymous  
                $ini[$section] = @{}  
            }  
            $value = $matches[1]  
            $CommentCount = $CommentCount + 1  
            $name = "Comment" + $CommentCount  
            $ini[$section][$name] = $value  
        }   

        "(.+?)\s*=\s*(.*)" # Key  
        {  
            if (!($section))  
            {  
                $section = $anonymous  
                $ini[$section] = @{}  
            }  
            $name,$value = $matches[1..2]  
            $ini[$section][$name] = $value  
        }  
    }  

    return $ini  
}  

$iniFile = Get-IniFile .\ADAP.ini
$app = $iniFile.NoSection.APP
$dll = $iniFile.NoSection.DLL

对于保存为Test.ini的此示例ini文件:

; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Widgets Inc.

[database]
; use IP address in case network name resolution is not working
server=192.0.2.62     
port=143
file="payroll.dat"

这样做:

$testIni = Get-IniFile .\Test.ini

允许您检索如下值:

$server = $testIni.database.server
$organization = $testIni.owner.organization

答案 2 :(得分:3)

你做"只需要阅读文本文件" ..然后找到哪一行以APP开头,然后从中提取值。

# read text file                        # find line beginning APP=
$AppLine = Get-Content -Path test.ini | Where-Object { $_ -match 'APP=' }

# split on = symbol and take second item
$AppVersion = $AppLine.Split('=')[1]

您可能会从[version]$AppVersion中受益,使其成为一个正确的可排序,可比较的版本号而不是字符串。

您可以通过多种方式进行阅读,匹配和提取值(Get-Contentswitch -fileSelect-StringForEach-Object-match 'APP=(.*)'等各种组合。)

但Mark Wragg的答案总体上更好。

答案 3 :(得分:1)

$content = Get-Content ADAP.ini

$app = $content[1].Substring($content[1].IndexOf("=") + 1)
$dll = $content[2].Substring($content[2].IndexOf("=") + 1)

您可以通过调用cmdlet Get-Content并将其分配给变量来获取内容。通过访问数组中索引之类的行,您可以调用处理字符串的方法。

注意:代码很难看,我知道。

答案 4 :(得分:1)

马克·沃格(Mark Wragg)的答案的稍作修改的版本,通过简单的检查来确保每行有效,然后再将其传递到cmdlet进行处理。

set(app_compile_options "-Wall -Wextra -Wshadow -Wnon-virtual-dtor \
    -Wold-style-cast \
    -Woverloaded-virtual -Wzero-as-null-pointer-constant \
    -pedantic -fPIE -fstack-protector-all -fno-rtti")

add_executable(foo foo.cpp)
target_compile_options(foo PUBLIC ${app_compile_options})

add_executable(bar bar.cpp)
target_compile_options(bar PUBLIC ${app_compile_options})

仅在我自己登陆时添加它,最后使用该解决方案来处理具有多个类别和注释行的配置文件。