使用PowerShell读取索引未知的文件中的特定行?

时间:2019-03-29 09:51:39

标签: powershell

我有一个如下所示的IN文件。

;**********  Information  **********
;Date=190303
;Class_1=US13091990#1Joyce#2Female
;Phone_Number=98233215.00
;School=St.Joseph\JuniorHighSchool
;ID=F1
;***********************************

我想阅读特定的行,例如,我想阅读Class_1。但是Class_1的索引必须牢记索引是动态的,并且可能会发生变化。

$File = Get-Content .\file_input
$File = Select-String "Class_1"
$File

5 个答案:

答案 0 :(得分:1)

您可以执行以下操作来读取INI文件,然后选择包含Class_ number 的行:

$a = Get-Content ini.ini
$data = $a | Select-String -Pattern "Class_\d+"

从那里,您可以使用$data访问行的不同部分。参见以下示例:

$NumberAfterUnderscore = ($data.matches.value -split "_")[1]
$DataAfterEqualSign = ($data -split "=")[1]
$DataBetweenEqualandPound = (($data -split "=")[1] -split "#")[0]
$DataBetweenFirstandSecondPounds = (($data -split "=")[1] -split "#")[1]
$DataAfterLastPound = (($data -split "=")[1] -split "#")[2]

以下是上面代码的输出:

$NumberAfterUnderscore
1

$DataAfterEqualSign
US13091990#1Joyce#2Female

$DataBetweenEqualandPound
US13091990

$DataBetweenFirstandSecondPounds
1Joyce

$DataAfterLastPound
2Female

$data.matches.value
Class_1

答案 1 :(得分:1)

编辑

正如这里所建议的,代码再次带有一些注释。 我还编辑了部分代码,以进一步说明如何获取文件中参数的各个值。

   foreach($line in Get-Content .\file_input) { #Loop though each line of the file
        if ($line.Contains("=") { #If the line contains "=" then we know that the line contains a parameter
            $splittedLine = $line.Split("=") #We know that the parameter line can be split at "=" to get parameter type and value of parameter
            $type = $splittedLine[0] #First part of line contains the type
            switch($type) { #Lets switch on the type to handle each type accordingly
                ";Date"{ #Here we have the Date type
                    $date = $splittedLine[1]
                }
                ";Class_1"{ #Here we have the Class_1 type
                    $class1 = $splittedLine[1]
                }
                ";Phone_Number"{ #Here we have the Phone_Number type
                    $phoneNum = $splittedLine[1]
                }
                ";School"{ #Here we have the School type
                    $school = $splittedLine[1]
                }
                ";ID"{ #Here we have the ID type
                    $id = $splittedLine[1]
                }
            }
        }
    }

答案 2 :(得分:1)

无需担心它在文件中出现的位置。在这里利用ConvertFrom-StringData的优势。它将键值对的列表转换为哈希表。

  1. 读入文件。
  2. 过滤分号,将反斜杠加倍(稍后将其视为转义序列),并忽略记录边界。
  3. 存储为单个字符串并传递到ConvertFrom-StringData
  4. 转换为PowerShell对象

$filteredContent = (Get-Content "c:\temp\file_input") -replace '^;' -replace '\\','\\' | Where-Object{-not $_.startswith('*')} 
$information = [pscustomobject]($filteredContent -join "`r`n" | ConvertFrom-StringData)
$information.class_1

因此,使用以上内容,$information就是这样。

Class_1      : US13091990#1Joyce#2Female
School       : St.Joseph\JuniorHighSchool
Date         : 190303
Phone_Number : 98233215.00
ID           : F1

这也将使得处理更多这些记录变得更加容易,并且如果您需要进行更多的后期处理,则可以为您提供更大的灵活性。

答案 3 :(得分:1)

使用Select-String返回的对象是MatchInfo对象。尝试将结果用作字符串时可能会给您带来问题。这是处理该问题的一种方法...并将输出解析为$ vars。

您可能更喜欢将行解析为PSCustomObject。如果您对此有疑问并需要帮助,请询问。 [咧嘴]

代码...

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
;**********  Information  **********
;Date=190303
;Class_1=US13091990#1Joyce#2Female
;Phone_Number=98233215.00
;School=St.Joseph\JuniorHighSchool
;ID=F1
;***********************************
'@ -split [environment]::NewLine

$ThingToFind = 'Class_1'

$FoundString = $InStuff |
    Select-String -SimpleMatch $ThingToFind

# Select-String returns a MatchInfo object,
#    so it needs to be converted to a regular string before using it as such
$ID_Number, $Name, $Gender = $FoundString.ToString().Split('=')[1].Split('#')
$Name = $Name.Trim('1')
$Gender = $Gender.Trim('2')


$FoundString.ToString()
$ID_Number
$Name
$Gender

输出...

;Class_1=US13091990#1Joyce#2Female
US13091990
Joyce
Female

答案 4 :(得分:-1)

您可以告诉程序,如果程序在脚本中找到Class_1,则会在=之后提取数据。