如何将.ini文件解析为PowerShell变量

时间:2011-03-22 16:37:40

标签: powershell

我有以下包含单个记录的.ini文件(名为metrics.ini),但将来可能会添加更多记录:

$DatabaseConnection_STR=MYSERVER\MYINSTANCE

我需要将此文件解析为PowerShell变量。我可以使用以下内容解析字符串,但是我无法创建新的$ DatabaseConnection_STR变量(基于从.ini文件解析的内容)。我不想在我的脚本中硬编码$ DatabaseConnection_STR - 我宁愿让脚本弄清楚它以便将来可以处理其他变量。

# This code assumes that no blank lines are in the file--a blank line will cause an early termination of the read loop

    ########################################
    #
    # Confirm that the file exists on disk
    #
    ########################################

    $IniFile_NME="C:\temp\metrics.ini"

    dir $IniFile_NME

    ########################################
    #
    # Parse the file
    #
    ########################################

    $InputFile = [System.IO.File]::OpenText("$IniFile_NME")

    while($InputRecord = $InputFile.ReadLine())
        {
            # Display the current record

            write-host "`$InputRecord=$InputRecord"
            write-host ""

            # Determine the position of the equal sign (=)

            $Pos = $InputRecord.IndexOf('=')
            write-host "`$Pos=$Pos"

            # Determine the length of the record

            $Len = $InputRecord.Length
            write-host "`$Len=$Len"

            # Parse the record

            $Variable_NME = $InputRecord.Substring(0, $Pos)
            $VariableValue_STR = $InputRecord.Substring($Pos + 1, $Len -$Pos -1)

            write-host "`$Variable_NME=$Variable_NME"
            write-host "`$VariableValue_STR=$VariableValue_STR"

            # Create a new variable based on the parsed information--**the next line fails**

            `$Variable_NME=$VariableValue_STR
        }
    $InputFile.Close()

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

使用split命令可能更简单,更简洁。您还可以将配置值存储在哈希表中:

$config = @{}

Get-Content $IniFile_NME | foreach {
    $line = $_.split("=")
    $config.($line[0]) = $line[1]
}

如果不想要哈希表,你仍然可以使用相同的创建变量的方法,但使用Powershell的读取,循环和拆分会使它变得更容易。

答案 1 :(得分:0)

这很有效。事实证明,New-Variable命令不使用带有“-name”参数的美元符号($);所以,我不得不解析它。见下文。

# This code assumes that no blank lines are in the file--a blank line will cause an early termination of the read loop

########################################
#
# Confirm that the file exists on disk
#
########################################

$IniFile_NME="C:\temp\metrics.ini"

dir $IniFile_NME

########################################
#
# Parse the file
#
########################################

$InputFile = [System.IO.File]::OpenText("$IniFile_NME")

while($InputRecord = $InputFile.ReadLine())
    {
        # Display the current record

        write-host "`$InputRecord=$InputRecord"
        write-host ""

        # Determine the position of the equal sign (=)

        $Pos = $InputRecord.IndexOf('=')
        write-host "`$Pos=$Pos"

        # Determine the length of the record

        $Len = $InputRecord.Length
        write-host "`$Len=$Len"

        # Parse the record

        $Variable_NME = $InputRecord.Substring(1, $Pos -1)
        $VariableValue_STR = $InputRecord.Substring($Pos + 1, $Len -$Pos -1)

        write-host "`$Variable_NME=$Variable_NME"
        write-host "`$VariableValue_STR=$VariableValue_STR"

        # Create a new variable based on the parsed information

        new-variable -name $Variable_NME -value $VariableValue_STR
        get-variable -name $Variable_NME
    }
$InputFile.Close()