perseus21
Goto Top

Powershell - Substring(), split()

Hallo,
ich habe ein Problem in der Powershell, bei dem ich Hilfe benötige. Bisher konnte mir Google und Konsorten nicht helfen.
Was meine Fähigkeiten in Powershell anbelangt, so stufe ich mich als Anfänger ein.

Hier mein Problem:
ich hab in einer Variable die Werte:

worstationId=B11A
worstationName=ANTON_AUTO_TEST_B11A

Nun möchte ich die Werte hinter dem "=" extrahieren/weiterverwenden

Ich habe es mit split() und mit substring() probiert, aber ohne Erfolg.


Kann mir jemand weiterhelfen?


mfg
Dirk

Content-ID: 623863

Url: https://administrator.de/contentid/623863

Ausgedruckt am: 22.11.2024 um 08:11 Uhr

emeriks
emeriks 19.11.2020 um 11:42:43 Uhr
Goto Top
Zitat von @perseus21:
worstationId=B11A
worstationName=ANTON_AUTO_TEST_B11A
PS ist kein Batch!
Also richtig so
$worstationId = "B11A"  
$worstationName = "ANTON_AUTO_TEST_B11A"  
Jetzt kannst Du z.B. $worstationName splitten nach "_"
$x = $worstationName.Split("_")  
$x

E.
TsukiSan
TsukiSan 19.11.2020 um 11:51:31 Uhr
Goto Top
Hallo Dirk,

mal was zum Üben:
$temp0A = 'worstationId=B11A'  
$Temp1A = $temp0A -split '(=)'  
echo $Temp1A[2]
$temp0B = 'worstationName=ANTON_AUTO_TEST_B11A'  
$Temp1B = $temp0B -split '(=)'  
echo $Temp1B[2]

Grüße

Tsuki
perseus21
perseus21 19.11.2020 um 13:54:50 Uhr
Goto Top
emeriks...
wie oben schon beschrieben liegen mir die Werte in einer Variable in Form

worstationId=B11A
worstationName=ANTON_AUTO_TEST_B11A

vor und benötige die Werte nach dem Komma. D.h. ich möchte nachher nur die folgenden Werte in einer Variablen haben:

B11A
ANTON_AUTO_TEST_B11A

Sehe ich das richtig, dass ich die Daten wie in deinem Beispiel erst in zwei Variablen aufteilen muss?
Und was bedeutet "_"? Meinst du damit den Unterstrich?

Gruß
Dirk

P.S.: Zur Auswahl des Themas blieb mir unter Entwicklung nur die Wahl Allgemein oder Bash & Shell, wobei ich Shell mit Powershell assoziiert habe. Sorry für den Fehler. Einen Menüpunkt für Powershell hatte ich leider nicht gefunden.
Printe
Lösung Printe 19.11.2020 aktualisiert um 14:03:36 Uhr
Goto Top
Oder wenn die Daten aus einer Textdatei kommen und du Zeilenweise mehrere Werte verarbeiten willst dann
$lines = Import-CSV 'D:\datei.txt' -delimiter "=" -header "Key","Value"  
$lines | %{
    "Key: " + $_.Key  
    "Value: " + $_.Value  
}
Mittels der Properties "$_.Key" und "$_.Value" innerhalb der For-each Schleife greifst du dann auf die Werte der jeweilige Zeile zu und kannst sie so weiterverarbeiten.

Alternativ bietet die Powershell für solch formatierte Dateien bereits einpassendes CMDLet an welches das ganze automatisch macht face-wink
Und schon sind die Daten schön in ne HashTable eingelesen face-smile.
$data = gc 'D:\datei.txt' -raw | ConvertFrom-StringData  
# Zugreifen auf die Values dann mittels des Keys so:
$data.worstationId
Oder wenn du bei diesem Konstrukt nur die reinen "Values" haben willst auch kein Thema
$data = gc 'D:\datei.txt' -raw | ConvertFrom-StringData  
$data.Values


Gruß P.
emeriks
emeriks 19.11.2020 um 14:03:41 Uhr
Goto Top
Ach so, du hast

$A = "worstationId=B11A"  
$B = "worstationName=ANTON_AUTO_TEST_B11A"  
Na dann eben
$A1 = $A.Split("=")[1]  
$B1 = $B.Split("=")[1]  
mayho33
mayho33 19.11.2020 aktualisiert um 15:56:17 Uhr
Goto Top
Zitat von @perseus21:

Hallo,
ich habe ein Problem in der Powershell, bei dem ich Hilfe benötige. Bisher konnte mir Google und Konsorten nicht helfen.
Was meine Fähigkeiten in Powershell anbelangt, so stufe ich mich als Anfänger ein.

Hier mein Problem:
ich hab in einer Variable die Werte:

worstationId=B11A
worstationName=ANTON_AUTO_TEST_B11A

Nun möchte ich die Werte hinter dem "=" extrahieren/weiterverwenden

Ich habe es mit split() und mit substring() probiert, aber ohne Erfolg.


Kann mir jemand weiterhelfen?


mfg
Dirk

Wenn die Variable in Powershell so lauten würde:
$a = "worstationId=B11A"  
$b = "worstationName=ANTON_AUTO_TEST_B11A"  

Dann kannst du die Werte hinter dem "=" so extrahieren:
$a = "worstationId=B11A"  
$b = "worstationName=ANTON_AUTO_TEST_B11A"  

$a1 = $a.Split('=')[1]  
$b1 = $b.Split('=')[1]  

Ist es das was du brauchst?


EDIT:

UUUUUPS! Da war einer schneller! face-smile Aber lustig, dass wir den gleichen Ansatz verfolgt haben :D
SlainteMhath
SlainteMhath 19.11.2020 um 16:01:23 Uhr
Goto Top
Moin,

geht noch kürzer:
$a = "worstationId=B11A".Split('=')[1]  
$b = "worstationName=ANTON_AUTO_TEST_B11A".Split('=')[1]  
:D

lg,
Slainte
perseus21
perseus21 19.11.2020 um 16:12:43 Uhr
Goto Top
Nein.
Ich habe die Varaiable $var und in ihr steht der Text

worstationId=B11A
worstationName=ANTON_AUTO_TEST_B11A

Ich brauche:
B11A
ANTON_AUTO_TEST_B11A

Diese beiden Werte möchte ich nachher in irgendeiner Weise weiterverwenden.

Das Beispiel von Printe hat mir geholfen:

$x = (get-content '$var' -raw | ConvertFrom-StringData)
$x.values

Gruß
Dirk
perseus21
perseus21 19.11.2020 um 16:18:09 Uhr
Goto Top
Jetzt muss ich nur noch verstehen, was in den zwei Zeilen genau geschieht.
was macht der Schalter -raw und das ConvertFrom-StringData?

Gruß
Dirk
Printe
Lösung Printe 19.11.2020 aktualisiert um 16:27:51 Uhr
Goto Top
Zitat von @perseus21:

Jetzt muss ich nur noch verstehen, was in den zwei Zeilen genau geschieht.
was macht der Schalter -raw und das ConvertFrom-StringData?
Der Schalter -raw sagt das die Textdatei beim Einlesen als ganzes und nicht als Array eingelesen werden soll. Bei Verwendung von ConvertFrom-StringData ist das angeraten da man sonst ein Array aus Hashtables bekommen würde und das wäre doppelt gemoppelt und wäre verwirrend.

ConvertFrom-StringData macht aus einer oder mehreren Zeilen die so aufgebaut sind wie deine also

Key = Value

eine sogenannte "Hashtable" mit dem ersten Wert vor dem Gleichheitszeichen als Key und dem dahinter als zugehörigem Value.

Was eine Hashtable ist kannst du hier nachschlagen
https://www.windowspro.de/script/hash-table-powershell-erzeugen-elemente ...

$x = (get-content '$var' -raw | ConvertFrom-StringData)
$x.values
Eine Anwendung ist übrigens falsch wenn $var schon den Text enthält brauchst du natürlich die Textdatei nicht mehr einlesen, außerdem werden Variablen innerhalb von Hochkommata nicht aufgelöst!
$x = $var | ConvertFrom-StringData)
$x.values
perseus21
perseus21 19.11.2020 um 16:27:05 Uhr
Goto Top
Prima, Vielen Dank an alle. Jetzt bin ich wieder etwas schlauer face-smile

LG
Dirk
perseus21
perseus21 19.11.2020 um 16:49:02 Uhr
Goto Top
Ja, P. Du hast recht.
Ich würde gerne mal mein Scriptcode einstellen. Wie bekomme das hin, dass er Zeilennummern voranstellt?
Printe
Printe 19.11.2020 aktualisiert um 16:50:58 Uhr
Goto Top
<code> Quellcode </code>

screenshot
perseus21
perseus21 19.11.2020 um 16:51:12 Uhr
Goto Top
Clear
Set-ExecutionPolicy Unrestricted -force
$PcName = $env:COMPUTERNAME
$Data = ".\Scripte\computer.prefs"  
$x = (get-content $Data -raw | ConvertFrom-StringData)
$x.Values
perseus21
perseus21 19.11.2020 um 16:51:53 Uhr
Goto Top
So funktioniert's
mayho33
mayho33 19.11.2020 um 19:17:20 Uhr
Goto Top
Zitat von @perseus21:

$x = (get-content '$var' -raw | ConvertFrom-StringData)
$x.values

Da hast du dir das komplizierteste Beispiel ausgesucht. Und eigentlich ließt du so eher Content aus Files ein als bestehende Variablen.

Aber jeder wie er es am liebsten hat. Die Geschmäcker sind ja verschieden face-wink

> Clear
> Set-ExecutionPolicy Unrestricted -force
> $PcName = $env:COMPUTERNAME
> $Data = ".\Scripte\computer.prefs"  
> $x = (get-content $Data -raw | ConvertFrom-StringData)
> $x.Values
> 

Der Code in Zeile 2 funktioniert aber nur, weil du schon die Policy in deiner Session aktualisiert hast.

Powershell kann sich nicht selbst vom Script aus unrestricten, weil PS normaler schon "vor" dessen Ausführung verhindert wird.

Willst du ein PS-Script ausführen und temporär die ExecutionPolicy aussetzen machst du das so:

von der Console aus:
Poeershell.exe -Executionpolicy bypass -file "deine ps1-Datei"  
perseus21
perseus21 19.11.2020 um 21:40:06 Uhr
Goto Top
Danke für die Info.
perseus21
perseus21 19.11.2020 aktualisiert um 21:55:16 Uhr
Goto Top
Zitat von @mayho33:
Aber jeder wie er es am liebsten hat. Die Geschmäcker sind ja verschieden face-wink


Da ich Anfänger bin, mach ich es nicht wie es mir gefällt. Wenn ich das Wissen hätte, würde ich es richtig machen.
Die Lösung hat halt funktioniert.
Hast du noch einen anderen Weg nach Rom?
Ich bin immer bereit was Neues zu lernen oder anders gesagt, wie es richtig gemacht wird... face-smile

Gruß
Dirk
mayho33
mayho33 19.11.2020 um 23:57:27 Uhr
Goto Top
Zitat von @perseus21:

Zitat von @mayho33:
Aber jeder wie er es am liebsten hat. Die Geschmäcker sind ja verschieden face-wink

Die Lösung hat halt funktioniert.
Hast du noch einen anderen Weg nach Rom?

Wie von mir und einigen anderen schon beschrieben. Das wäre meiner Ansicht nach der eigentliche Weg, weil leicht verständlich und, was nicht zu verachten ist, stabil und schnell.

Aber wie mein Lehrer immer sagte: "Nicht wie man etwas umsetzt, sondern, dass man es umsetzt ist wichtig."


Ich bin immer bereit was Neues zu lernen oder anders gesagt, wie es richtig gemacht wird... face-smile

Du kannst ja mal hier rein schauen:

https://docs.microsoft.com/en-us/powershell/scripting/learn/more-powersh ...

Hier eine Sammlung aller PS keywords:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Grüße!