使用PowerShell仅显示属性文件中的属性名称

时间:2018-03-05 17:03:41

标签: windows powershell

我有供应商属性文件,它有属性名称和值。现在我必须读取属性文件并仅显示属性名称。

以下是一些属性名称及其值。

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("#") } 

2 个答案:

答案 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 '=.*'会删除以=字符开头的所有内容。自动变量$_表示手头的输入行。