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!

Recommended Posts

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

Edited by Christoph_A4
Link to comment

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

Link to comment

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

Edited by carnivore
Link to comment

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 to comment

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
}
Edited by PowerShellAdmin
Link to comment
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:

Edited by carnivore
Link to comment
  • 2 weeks later...

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 to comment

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 to comment

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 to comment

$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 to comment
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...