我有供应商属性文件,它有属性名称和值。现在我必须读取属性文件并仅显示属性名称。
以下是一些属性名称及其值。
ipaddr=10.1.1.1,12.4.5.6
ports=2345
location=anywhere
我希望我的输出显示如下
ipaddr
ports
location
我使用以下命令读取文件:
Get-Content -Path "C:\Test\run.properties" |
Where-Object {!$_.StartsWith("#") }
答案 0 :(得分:2)
您可以使用正则表达式删除值:
Get-Content -Path "C:\Test\run.properties" |
Where-Object {!$_.StartsWith("#") } |
ForEach-Object {
$_ -replace '=.*'
}
答案 1 :(得分:0)
补充Martin Brandl's helpful answer:
对于 小型文件,例如属性文件,您可以 简化并加快处理 使用PowerShell的运算符 然后读取所有行 ,其中许多行可以在数组值<< / em> LHS值:
@(Get-Content "C:\Test\run.properties") -notmatch '^#' -replace '=.*'
@(Get-Content "C:\Test\run.properties")
将输入文件的所有行读入数组
@(...)
,数组子表达式运算符,确保结果确实是数组;否则,如果文件恰好只包含单个行,则会返回字符串,这将改变-notmatch
的行为。 -notmatch '^#'
仅输出那些不以^
字符开头(#
)的数组元素(行)。
-replace '=.*'
对其余行进行操作,有效删除以=
开头的行部分。 (.*
匹配行尾的任何字符序列,并且未指定替换字符串,匹配的部分实际上已被删除)。
最快的替代大概是使用 switch -file -regex
:
switch -file -regex "C:\Test\run.properties" { '^#' {continue} default {$_ -replace '=.*'} }
-file
告诉switch
逐个处理指定文件的行。
-regex
告诉它将分支条件(在本例中为'^#'
)解释为常规表达式。
分支条件'^#'
再次匹配以#
开头的行,continue
进入下一个输入行,实际上忽略它们。
分支条件default
适用于所有剩余的行,如上所述,$_ -replace '=.*'
会删除以=
字符开头的所有内容。自动变量$_
表示手头的输入行。