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

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
Link zu diesem Kommentar

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
Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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
Link zu diesem Kommentar
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
Link zu diesem Kommentar
  • 2 Wochen später...

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

Link zu diesem Kommentar

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
Link zu diesem Kommentar

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))

Link zu diesem Kommentar

$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.

Link zu diesem Kommentar
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...