Jump to content

Powershell - String auslesen, Zeichenkette zwischen zwei Buchstaben in Variable schreiben


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben (bearbeitet)

Hallo,

 

ich hoffe die Frage erklärt sich anhand der Überschrift.

 

Ein wenig detaillierter anhand eines simplen Beispiels:

Ich habe eine text-datei erstellt mit dem Inhalt {OwnerGroup=T400S891;OwnerNode=S400G257}

Mein Ziel ist es, aus "T400S891" und aus "S400G257" jeweils eine Variablen zu definieren.

 

Mein Ansatz:

Lies mir die Text-Datei aus und schreibe mir alles, was zwischen "=" und ";" steht, in eine Variable. Das wäre dann T400S891.

Für die zweite Variable: Lies mir die Text-Datei aus und schreibe mir alles, was zwischen "=" und "}" steht, in eine Variable. Das wäre dann S400G257.

 

Wie könnte ich das umsetzen?

Vielen Dank im Voraus!

 

Grüße

bearbeitet von Christoph_A4
Geschrieben

Für Text lesen schaut die get-content an. Für Text schreiben Add-Content, Set-Content und Out-File.

Für Strings parsen bietet sich Split oder Substring in Verbindung mit IndexOf an.

 

Fang einfach mal an und wenn du nicht weiter kommst dann melde dich nochmal.

Geschrieben

Hi

 

hier mal ein Beispiel anhand deines Ansatzes

 

$text = '{OwnerGroup=T400S891;OwnerNode=S400G257}'
$muster1 = 'OwnerGroup=(.+?);'
$muster2 = 'OwnerNode=(.+?)}'
if ($text -match $muster1)
{
    $matches[0]
}
if ($text -match $muster2)
{
    $matches[0]
}

Vielleicht hilft dir das ja schon

 

gruß

 

Martin

Geschrieben (bearbeitet)

Hi,

so funktioniert es:

 

Function GetGroupNode{
  Param([Parameter(ValueFromPipeline = $true)] $myString)
  $myString = $myString.Split("=")
  $Var1 = $(($myString[1].split(";"))[0])
  $Var2= $myString[2].Replace("}","")
  $Var1,$Var2
 
  }
 
$Input = "{OwnerGroup=T400S891;OwnerNode=S400G257}"
$Output = $Input | GetGroupNode
$Output[0]
$Output[1]

 

#Ausgabe

T400S891
S400G257

bearbeitet von carnivore
Geschrieben

Super. Danke schonmal an alle, die hier geantwortet haben.

 

Carnivore, das passt soweit sehr gut, es kommt allerdings erschwerend dazu, dass der $Input ({OwnerGroup=T400S891;OwnerNode=S400G257}) aus einer txt-Datei entstammt und dort mehrere dieser Zeilen vorhanden sind, sprich bspw.:

 

{OwnerGroup=T400S891;OwnerNode=S400G257}

{OwnerGroup=T400S394;OwnerNode=S400G256}

{OwnerGroup=T400S542;OwnerNode=S400G255}

 

Ich bräuchte für diesen Fall quasi alle 6 Variablen. Wie kann man das lösen, wüßtest du einen Ansatz?

Geschrieben (bearbeitet)

Arraylist, Eigenes PsObject

 

Der Skript ist nur ein logisches Beispiel. Du initialisierst einmalig die Arrayliste. Anschließend befüllst du die Liste mit den einzelnen Zeilen in einer Foreach Schleife.
Dafür wird in jedem Schleifendurchlauf ein Objekt initialisiert  und der Liste hinzugefügt.
Der Code ist unvollständig und mehr ein logisches Biespiel - aber das kriegst du ja hin :)

 

#initialisiert die Arrayliste
$txt_lines=New-Object System.Collections.ArrayList

foreach($line in $txt)
{
    #initialisiert ein PS Object
    $line= New-Object PSObject -Property @{
            OwnerGroup=$line.ownergroup
            OwnerNode=$line.ownernode
            }
     #fügt die Zeile zur Liste hinzu
     $txt_lines+=$line
}
bearbeitet von PowerShellAdmin
Geschrieben (bearbeitet)
Function GetGroupNode{
  Param([Parameter(ValueFromPipeline = $true)] $myString)
  $myString = $myString.Split("=")
  $Var1 = $(($myString[1].split(";"))[0])
  $Var2= $myString[2].Replace("}","")
  $Var1,$Var2
 }#End Function GetGroupNode

$Path = "c:\temp\myInputFile.txt"
Get-Content -Path $Path | Foreach{
  $Output = $_ | GetGroupNode
  }
"$($Output[0])  $($Output[1])"

So in etwa würde ichs umsetzen:

bearbeitet von carnivore
  • 2 Wochen später...
Geschrieben

carnivore:

 

Die Ansätze sind schon sehr vielversprechend. Ich muss gestehen, ich bin hiermit an einem Punkt angelangt, wo ich nicht mehr weiterkomme.

 

Mein Problem mit diesem Ansatz ist, dass ich jeweils nur zwei Variablen geliefert bekomme. Aus den schon o.g. txt-file-Inhalt...

 

{OwnerGroup=T400S891;OwnerNode=S400G257}

{OwnerGroup=T400S394;OwnerNode=S400G256}

{OwnerGroup=T400S542;OwnerNode=S400G255}

 

....müsste ich quasi auch 6 Variablen geliefert bekommen.

 

T400S891

S400G257

T400S394

S400G256

T400S542

S400G255

Geschrieben

Um dich weiter zu verwirren noch eine Methode via regex

$test = Get-Content C:\temp\ownertest.txt
#regex string
$regex = [regex]"[A-Z]\d{3}[A-Z]\d{3}"

#save regex results in variable
$result = $regex.Matches($test).value
#Create empty Array
$output = @()

$result | %{
#Create PSObject with owner Property
$ret = "" | select owner
#Save Pipeoutput in Custom Object
$ret.owner = $_
#Save in Array
$output += $ret
}
$output
Geschrieben

Sieht etwas kompliziert aus, macht aber was es soll. Das ganze dann natürlich nach dem Einlesen in eine foreach packen und weiterbearbeiten:

 

 

 

$VarOrigin="{OwnerGroup=T400S891;OwnerNode=S400G257}"
$FirstEqual=$VarOrigin.IndexOf("=")
$SecondEqual=$VarOrigin.IndexOf("=",$FirstEqual+1)
$FirstSemicolon=$VarOrigin.IndexOf(";")
$LastCurlyBracket=$VarOrigin.IndexOf("}")
$Var1=$VarOrigin.Substring($FirstEqual+1,$FirstSemicolon - ($FirstEqual + 1))
$Var2=$VarOrigin.Substring($SecondEqual+1,$LastCurlyBracket - ($SecondEqual +1))

Geschrieben

$VarOriginial=Get-Content -Path C:\Textdatei.txt

 

foreach($VarOrigin in $VarOriginal){

 

$FirstEqual=$VarOrigin.IndexOf("=")

$SecondEqual=$VarOrigin.IndexOf("=",$FirstEqual+1)

$FirstSemicolon=$VarOrigin.IndexOf(";")

$LastCurlyBracket=$VarOrigin.IndexOf("}")

$Var1=$VarOrigin.Substring($FirstEqual+1,$FirstSemicolon - ($FirstEqual + 1))

$Var2=$VarOrigin.Substring($SecondEqual+1,$LastCurlyBracket - ($SecondEqual +1))

 

}

 

Das nur als Beispiel. Du musst natürlich $Var1 und $Var2 entweder wieder irgendwo hinschreiben lassen oder direkt in der foreach Schleife weiter verarbeiten.

Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...