forseti2003
Goto Top

Powershell String to Int

Hallo in die Runde,

ich versuche aus einem Array einen Textstring zu zerlegen, solange das ganze als String bleibt, ist das alles in Ordnung. Einige Werte möchte ich aber auch gerne gleich als [Int] oder [Decimal] deklarieren um damit in Powershell rechnen zu können.

Mit folgendem Code bekommen ich den passenden String zu fassen:

$array.Where({$_.Name -eq $AUN}) | foreach { $_.Group.Substring(152,10).Trim().Replace(',',''))}  

Ausgabe ist dann:
1130400
1099000
2590500

ohne Trim und Replace sieht das so aus:
" 1130,400"
" 1099,000"
" 2590,500"

ergänze ich nun bei

 | foreach { [int]($_.Group.Substring(152,10).Trim().Replace(',','')) }  

erhalte ich die Fehlermeldung:

Der Wert "System.Object[]" vom Typ "System.Object[]" kann nicht in den Typ "System.Int32" konvertiert werden.

Bemühe ich Tante Google, stoße ich auf einige Beiträge, die sich darauf beziehen, das ein Array ein Systemobjekt darstellt, soweit klar. Aber ich bin ja im Textfeld, also innerhalb des Systemobjekts und versuche eine Zeichenfolge umzuwandeln - oder sehe ich gerade den Wald vor lauter Bäumen nicht?

Die Daten selbst bekomme ich aus einer Textdatei die ich zur Laufzeit in mehrere Arrays aufteile, daher auch der Substring-Befehl, da ich nur anhand fester Längen und Positionen die Daten ermitteln kann.

Eventuell hat jemand eine Idee, wo mein Problem liegt.

Grüße
Forseti

Content-ID: 672585

Url: https://administrator.de/forum/powershell-string-to-int-672585.html

Ausgedruckt am: 22.04.2025 um 20:04 Uhr

BiberMan
BiberMan 22.04.2025 aktualisiert um 17:55:42 Uhr
Goto Top
Die Property "Group" ist wohl ansich selbst auch ein Array (vermutlich das Ergebnis von group-object), deswegen die Meldung, also expandieren oder ebenfalls per foreach durchlaufen und umwandeln:
$array | ? Name -eq $AUN | select -ExpandProperty Group | %{[int64]($_.Substring(152,10) -replace '[^\d]')}  
manuel-r
manuel-r 22.04.2025 um 17:43:45 Uhr
Goto Top
Du hast also einen String in einer Variable vom Typ String und willst daraus einen Wert in einer Variable vom Typ Int32 machen?! Der einfachste Trick den ich dazu kenne ist
[string]$zahlalsstring = "2147483647"  
[int32]$stringalsint32 = $zahlalsstring * 1
$stringalsint32
2147483647
Manuel
Forseti2003
Forseti2003 22.04.2025 um 18:03:13 Uhr
Goto Top
Zitat von @manuel-r:

Du hast also einen String in einer Variable vom Typ String und willst daraus einen Wert in einer Variable vom Typ Int32 machen?! Der einfachste Trick den ich dazu kenne ist
[string]$zahlalsstring = "2147483647"  
[int32]$stringalsint32 = $zahlalsstring * 1
$stringalsint32
2147483647
Manuel

Wie oben schon geschrieben mit [int] aber auch mit[int32] probiert und lauf damit in die Fehlermeldung.

Zitat von @BiberMan:

Die Property "Group" ist wohl ansich selbst auch ein Array (vermutlich das Ergebnis von group-object), deswegen die Meldung, also expandieren oder ebenfalls per foreach durchlaufen und umwandeln:
$array | ? Name -eq $AUN | select -ExpandProperty Group | %{[int64]($_.Substring(152,10) -replace '[^\d]')}  

Das sieht gut aus, zumindest im Einzeltest läuft es damit gut - aber das Skript selbst über F5 ausgeführt, läuft dann komplett in einen Fehler. Muss mal weiter feilen, eventuell werde ich gleich beim Array erstellen, die Felder mit aufbauen.

Aber danke für den Ansatz, das ich mich trotz Group.Substring weiterhin im Systemobjekt befinde war mir jetzt nicht bewusst.

Grüße
Forseti
manuel-r
manuel-r 22.04.2025 um 18:44:02 Uhr
Goto Top
Zitat von @Forseti2003:

Zitat von @manuel-r:

Du hast also einen String in einer Variable vom Typ String und willst daraus einen Wert in einer Variable vom Typ Int32 machen?! Der einfachste Trick den ich dazu kenne ist
[string]$zahlalsstring = "2147483647"  
[int32]$stringalsint32 = $zahlalsstring * 1
$stringalsint32
2147483647
Manuel

Wie oben schon geschrieben mit [int] aber auch mit[int32] probiert und lauf damit in die Fehlermeldung.

Ich glaube, du hast den Trick nicht verstanden.
Einen String der einen Zahlenwert enthält einfach mit 1 multiplizieren. Schon ist der Variablentyp "Zahl" (allgemein ausgedrückt).

Manuel
BiberMan
BiberMan 22.04.2025 aktualisiert um 21:01:38 Uhr
Goto Top
Zitat von @manuel-r:
Ich glaube, du hast den Trick nicht verstanden.
Einen String der einen Zahlenwert enthält einfach mit 1 multiplizieren. Schon ist der Variablentyp "Zahl" (allgemein ausgedrückt).

Manuel

Achtung NEIN, das klappt hier nur weil du den Typ der Variablen auf [int32] setzt, denn das Multiplizieren von Strings mit Integern bewirkt nicht die Umwandlung sondern das der String x mal wiederholt hintereinander gehängt wird.
Das Multiplizieren bewirkt hier nicht das Umwandeln in einen Integer!!

Kannst du hiermit
("1234" * 1).gettype()  

# Ergebnis:
# IsPublic IsSerial Name                                     # BaseType
# -------- -------- ----                                     --------
# True     True     String                                   System.Object
und hiermit
"1234" * 3  
# Ergebnis: 123412341234
nachvollziehen.

Ergebnis ist weiterhin ein Objekt vom Typ String aber so oft wiederholt wie die Zahl dahinter,
Ein Integer wird es erst durch die Typangabe der Variablen. Also ist das Multiplizieren Blödsinn, es reicht die Angabe des neuen Typs vor dem String zur Unwandlung
[Int32]"1234"  
mbehrens
mbehrens 22.04.2025 um 21:43:40 Uhr
Goto Top
Zitat von @Forseti2003:

Eventuell hat jemand eine Idee, wo mein Problem liegt.

Sicher, dass Group für alle Elemente vom Typ String ist?