windows - Viser kun egenskabsnavn fra egenskabsfil ved hjælp af PowerShell

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en leverandøregenskabsfil, og den har ejendomsnavn og værdier. Nu skal jeg læse ejendomsfil og vise kun ejendomsnavne.


Nedenfor er nogle ejendomsnavne og dets værdier.


ipaddr=10.1.1.1,12.4.5.6
ports=2345
location=anywhere


Jeg vil have min output vist som nedenfor


ipaddr
ports
location


Jeg brugte følgende kommando til at læse filen:


Get-Content -Path "C:Test
un.properties" | 
    Where-Object {!$\_.StartsWith("#") } 

Bedste reference


Du kan bruge en regex for at fjerne værdierne:


Get-Content -Path "C:Test
un.properties" |
     Where-Object {!$\_.StartsWith("#") } | 
     ForEach-Object {
        $\_ -replace '=.*'
}

Andre referencer 1


For at supplere Martin Brandls hjælpsomme svar:


For små filer som egenskabsfiler kan du både forenkle og fremskynde behandling ved læsning af alle linjer op foran og derefter ved hjælp af PowerShell operatører , hvoraf mange kan fungere på array-valued LHS værdier:


@(Get-Content "C:Test
un.properties") -notmatch '^#' -replace '=.*'



  • @(Get-Content "C:Test un.properties") læser alle linjer i inputfilen i en matrix



    • @(...), array-sub-ekspressionsoperatøren sikrer, at resultatet faktisk er et array ; ellers vil filen dernæst kun indeholde en enkelt linje, så du får en streng tilbage, hvilket vil ændre opførelsen af ​​-notmatch.


  • -notmatch '^#' output kun de arrayelementer (linjer), der ikke starter (^) med en # char.

  • -replace '=.*' opererer på de resterende linjer og fjerner effektivt den del af linjen, der starter med =. (.* matcher enhver rækkefølge af tegn gennem enden af ​​linjen, og ved ikke at angive en erstatning streng, er den tilsvarende del effektivt fjernet ).



Det hurtigste alternativ er formodentlig brugen af ​​ switch -file -regex :


switch -file -regex "C:Test
un.properties" { '^#' {continue} default {$\_ -replace '=.*'} }



  • -file fortæller switch at behandle linjerne i de specificerede filer en efter én.

  • -regex fortæller det at fortolke grenbetingelserne ('^#', i dette tilfælde) som almindelige ekspresions .

  • Branchbetinget '^#' matcher igen linjer, der starter med #, og continue fortsætter til næste indtastningslinje, og ignorerer dem effektivt.

  • Branchbetinget default gælder for alle resterende linjer, og som ovenfor $\_ -replace '=.*' fjernes alt, der starter med = char. Automatisk variabel $\_ repræsenterer indgangslinjen ved hånden.