如何使用PowerShell使用参数读取特定的行值?

时间:2019-04-02 04:07:26

标签: powershell text-parsing

我有这种格式的文件。

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

请,任何人给我主意。谢谢

2 个答案:

答案 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]
    ...
}

我将按照您描述为自己的娱乐方式保留对象属性的输出方式!