Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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
如何使用PowerShell读取INI文件的特定项?_Powershell_Parameters_Arguments - Fatal编程技术网

如何使用PowerShell读取INI文件的特定项?

如何使用PowerShell读取INI文件的特定项?,powershell,parameters,arguments,Powershell,Parameters,Arguments,我想读取INI文件中的一个特定项目,INI文件的部分中有5个项目,我想读取4个项目,除了第3个项目 我已经尝试读取所有项目,但是我找不到一种方法来指定我要读取的项目以及我读取的文件的格式如下: Name Value AA 12 BB 13 CC 14 DD 15 EE 16 [Name] 1=Joe 2=Grace [Code] AA=12 BB=13 CC=14 DD=15 EE=16 函数读取文件{ Param( [参数(必需=$true)]$FilePath, [参数

我想读取INI文件中的一个特定项目,INI文件的部分中有5个项目,我想读取4个项目,除了第3个项目

我已经尝试读取所有项目,但是我找不到一种方法来指定我要读取的项目以及我读取的文件的格式如下:

Name Value AA 12 BB 13 CC 14 DD 15 EE 16 [Name] 1=Joe 2=Grace [Code] AA=12 BB=13 CC=14 DD=15 EE=16
函数读取文件{
Param(
[参数(必需=$true)]$FilePath,
[参数(必需=$true)]$a_节,
[参数(必需=$true)]$store
)
$input_file=$FilePath
$ini_文件=@{}
获取内容$input|文件| ForEach对象{
$\u.Trim()
}|对象在哪里{
$|-不匹配“^(;|$)”
}| ForEach对象{
如果($匹配“^\[.\]$”){
$section=$\替换“\[\\]”
$ini_文件[$section]=@{}
}否则{
$key,$value=$\分割'\s*=\s*',2
$ini_文件[$section][$key]=$value
}
}
$Path\u Store=$Store
$Get_Reg=$ini_文件。($a_部分)
$Output=$Get_Reg | Out File$Path_Store\Out_Test
}
$cmd,$params=$args
&$cmd@params
我的预期结果是,我有这样一个输出文件

AA=12 BB=13 DD=15 EE=16 AA=12 BB=13 DD=15 EE=16 我的INI文件如下所示:

Name Value AA 12 BB 13 CC 14 DD 15 EE 16 [Name] 1=Joe 2=Grace [Code] AA=12 BB=13 CC=14 DD=15 EE=16 [姓名] 1=乔 2=优雅 [守则] AA=12 BB=13 CC=14 DD=15 EE=16 试试这个:

function Get-IniSection {
    Param(
        [Parameter(Mandatory=$true)]$Path,
        [Parameter(Mandatory=$true)]$SectionName
    )

    $ini_file = @{}

    Get-Content $Path | ForEach-Object {
        $_.Trim()
    } | Where-Object {
        $_ -notmatch '^(;|$)'
    } | ForEach-Object {
        if ($_ -match '^\[.*\]$') {
            $section = $_ -replace '\[|\]'
            $ini_file += @{ $section = @{} }
        } else {
            $key, $value = $_ -split '\s*=\s*', 2
            $ini_file[$section] += @{ $key = $value }
        }
    }

    return $ini_file[$SectionName]
}

$section = Get-IniSection -Path "C:\temp\test.ini" -SectionName "code"

$section.GetEnumerator() | Where-Object { $_.Name -ne "EE" }

$section.GetEnumerator() | ForEach-Object { "$($_.Name)=$($_.Value)" }

$section.GetEnumerator() | 
    Where-Object { $_.Name -in @("A1","AE","AP","AS","E1","E2","JP","M1","M2","N1","N2","P1","P2","P3","P4","PR","RU","S1","S2","W1","W2","W3","W4","ZH") } | 
    Select-Object -ExpandProperty "Value"

$section.GetEnumerator() | 
    Where-Object { $_.Name -in @("A1","AE","AP","AS","E1","E2","JP","M1","M2","N1","N2","P1","P2","P3","P4","PR","RU","S1","S2","W1","W2","W3","W4","ZH") } | 
    Foreach-Object { ($_.Value -split ",")[0] }

谢谢你的回答,非常感谢。抱歉,我修改了我的问题。添加了另一个用例,用于当您只需要值列表中的第一项时我修改了此部分
$Get_Reg=$ini_文件。($SectionName)$Get_Reg=Get-ini部分$Path-SectionName$SectionName$Get_Reg.GetEnumerator()|其中对象{$_.Name-ne“N3”}$Get_Reg.GetEnumerator()|用于每个对象{“$($.Name)=$($.Value)”}$Get\u Reg.GetEnumerator();其中对象{$.Name-in@(“A1”、“AE”、“AP”、“AS”、“E1”、“E2”、“JP”、“M1”、“M2”、“N1”、“N2”、“P1”、“P2”、“P3”、“P4”、“PR”、“RU”、“S1”、“S2”、“W1”、“W2”、“W3”、“W4”、“ZH”)}对于每个对象{($.Value-split”、“0])$Get_Reg
但它不是WorkID您删除了
返回值
?您应该从函数返回值否,我不删除它`return$ini_file[$SectionName]}$section=Get-InSection-Path$Path-SectionName$section_Name$section.GetEnumerator()|其中对象{$\uName-ne“ne”}$section.GetEnumerator()| ForEach Object{“$($.Name)=$($.Value)”}$section.GetEnumerator()|其中Object{$.Name-in@(“A1”、“AE”、“AP”、“AS”、“E1”、“E2”、“JP”、“M1”、“M2”、“N1”、“N2”、“P1”、“P2”、“P3”、“P4”、“P4”、“PR”、“RU”、“S1”、“S2”、“W1”、“W2”、“W3”、“W4”、“ZH”)}| ForEach Object{($.Value-split“,”)[0])}我使用它,请不要移动目标。如果你有后续问题:发布一个新问题。