Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将.ini文件解析为PowerShell变量_Powershell - Fatal编程技术网

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

如何将.ini文件解析为PowerShell变量,powershell,Powershell,我有以下.ini文件(名为metrics.ini),其中包含一条记录,但将来可能会添加更多记录: $DatabaseConnection_STR=MYSERVER\MYINSTANCE 我需要将此文件解析为PowerShell变量。我可以用以下内容解析字符串,但是我无法创建新的$DatabaseConnection_STR变量(基于从.ini文件解析的内容)。我不想在我的脚本中硬编码$DatabaseConnection\u STR——我宁愿让脚本来解决这个问题,这样将来就可以处理其他变量了

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

$DatabaseConnection_STR=MYSERVER\MYINSTANCE
我需要将此文件解析为PowerShell变量。我可以用以下内容解析字符串,但是我无法创建新的$DatabaseConnection_STR变量(基于从.ini文件解析的内容)。我不想在我的脚本中硬编码$DatabaseConnection\u 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()

有什么想法吗?

这很有效。结果表明,newvariable命令在“-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()

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

$config = @{}

Get-Content $IniFile_NME | foreach {
    $line = $_.split("=")
    $config.($line[0]) = $line[1]
}
如果不需要哈希表,您仍然可以使用相同的方法创建变量,但使用Powershell的读取、循环和拆分将使其更容易