我有一个如下所示的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
答案 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
的优势。它将键值对的列表转换为哈希表。
ConvertFrom-StringData
$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
,则会在=
之后提取数据。