如何使用 PowerShell 读取带有参数的特定行值?
How to read specific line value with argument using PowerShell?
我有一个这种格式的文件。
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)","`$Value"}
$FileContent
我的期望,当我执行这个命令时
powershell.ps1 -FilePath file.txt -Key Name
会 return : Gerry
拜托,谁给我个主意。谢谢
当您执行 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]
...
}
我将按照您描述的方式输出对象属性,作为您自己享受的练习!
最好的选择是使用 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
.
注意,如果你的键名有空格,你必须将它引用传递给脚本;例如:
... -FilePath file.txt -Key 'ID Number'
我有一个这种格式的文件。
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)","`$Value"}
$FileContent
我的期望,当我执行这个命令时
powershell.ps1 -FilePath file.txt -Key Name
会 return : Gerry
拜托,谁给我个主意。谢谢
当您执行 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]
...
}
我将按照您描述的方式输出对象属性,作为您自己享受的练习!
最好的选择是使用 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
.
注意,如果你的键名有空格,你必须将它引用传递给脚本;例如:
... -FilePath file.txt -Key 'ID Number'