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-Key: 623863

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

Printed on: April 24, 2024 at 01:04 o'clock

Member: emeriks
emeriks Nov 19, 2020 at 10:42:43 (UTC)
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.
Member: TsukiSan
TsukiSan Nov 19, 2020 at 10:51:31 (UTC)
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
Member: perseus21
perseus21 Nov 19, 2020 at 12:54:50 (UTC)
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.
Member: Printe
Solution Printe Nov 19, 2020 updated at 13:03:36 (UTC)
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.
Member: emeriks
emeriks Nov 19, 2020 at 13:03:41 (UTC)
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]  
Member: mayho33
mayho33 Nov 19, 2020 updated at 14:56:17 (UTC)
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
Member: SlainteMhath
SlainteMhath Nov 19, 2020 at 15:01:23 (UTC)
Goto Top
Moin,

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

lg,
Slainte
Member: perseus21
perseus21 Nov 19, 2020 at 15:12:43 (UTC)
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
Member: perseus21
perseus21 Nov 19, 2020 at 15:18:09 (UTC)
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
Member: Printe
Solution Printe Nov 19, 2020 updated at 15:27:51 (UTC)
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
Member: perseus21
perseus21 Nov 19, 2020 at 15:27:05 (UTC)
Goto Top
Prima, Vielen Dank an alle. Jetzt bin ich wieder etwas schlauer face-smile

LG
Dirk
Member: perseus21
perseus21 Nov 19, 2020 at 15:49:02 (UTC)
Goto Top
Ja, P. Du hast recht.
Ich würde gerne mal mein Scriptcode einstellen. Wie bekomme das hin, dass er Zeilennummern voranstellt?
Member: Printe
Printe Nov 19, 2020 updated at 15:50:58 (UTC)
Goto Top
<code> Quellcode </code>

screenshot
Member: perseus21
perseus21 Nov 19, 2020 at 15:51:12 (UTC)
Goto Top
Clear
Set-ExecutionPolicy Unrestricted -force
$PcName = $env:COMPUTERNAME
$Data = ".\Scripte\computer.prefs"  
$x = (get-content $Data -raw | ConvertFrom-StringData)
$x.Values
Member: perseus21
perseus21 Nov 19, 2020 at 15:51:53 (UTC)
Goto Top
So funktioniert's
Member: mayho33
mayho33 Nov 19, 2020 at 18:17:20 (UTC)
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"  
Member: perseus21
perseus21 Nov 19, 2020 at 20:40:06 (UTC)
Goto Top
Danke für die Info.
Member: perseus21
perseus21 Nov 19, 2020 updated at 20:55:16 (UTC)
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
Member: mayho33
mayho33 Nov 19, 2020 at 22:57:27 (UTC)
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!