我有这种格式的文件。
English
Name
Gerry
Class
Elementry
ID Number
0812RX
Gender
*Male
Female
Address
St.Joseph Rd.78
Member Name
Jack
此文件的结构为Name
的值,其中有一个enter
和一个tab
,然后是值Gerry
我想读取每个项目的值。 我尝试了这段代码。
Param(
[parameter(mandatory=$true)][string]$FilePath, $Key
)
$FileContent = Get-Content $FilePath | Where-Object{"^($Key)","`$1$Value"}
$FileContent
我的期望,当我执行此命令
powershell.ps1 -FilePath file.txt -Key Name
它将返回:Gerry
请,任何人给我主意。谢谢
答案 0 :(得分:2)
最好的选择是将switch
statement与-File
参数一起使用:
$found = $false
$value = switch -File file.txt {
'Name' { $found = $true }
default { if ($found) { $_.Substring(1); break } }
}
在示例输入中,$value
应该包含Gerry
。
$found
,就将 $true
设置为'Name'
;在default
块中(对所有其他行都执行),然后返回下一行,并去除其初始(制表符)字符。
包裹在带参数的脚本中,为简洁起见,此处使用脚本块进行了模拟:
# Create a sample file; "`t" creates a tab char.
@"
Name
`tGerry
Class
`tElementary
ID Number
`t0812RX
"@ > file.txt
# Script block that simulates a script file.
& {
param(
[Parameter(Mandatory)] [string] $FilePath,
[Parameter(Mandatory)] [string] $Key
)
$found = $false
switch -File $FilePath {
$Key { $found = $true }
default { if ($found) { return $_.Substring(1) } }
}
} -FilePath file.txt -Key Name
以上产生Gerry
。
请注意,如果您的键名包含空格,则必须将其 quoted 传递给脚本。例如:
... -FilePath file.txt -Key 'ID Number'
答案 1 :(得分:0)
当您执行Get-Content
时,文件将作为可引用的字符串数组被提取。
这假定您的文件具有一致的格式-它们具有相同的行数,并且这些行对应于示例中指定的字段。如果没有,则可以使用正则表达式执行某些操作,但我们现在不讨论。
$file = (get-content c:\temp\myfile.txt).trim()
$lang = $file[0]
$name = $file[3]
$class = $file[5]
$idNo = $file[7]
if ($file[9] -match '`*') {$gender = "Male"}
if ($file[10] -match '`*') {$gender = "Female"}
$address = $file[12]
然后,您可以将已捕获的值分配给PSCustomObject或哈希表。实际上,最简单的是同时执行。
$student= [PsCustomObject]@{
Lang = $file[0]
Name = $file[3]
Class = $file[5]
...
}
我将按照您描述为自己的娱乐方式保留对象属性的输出方式!