derhoeppi
Goto Top

PowerShell Array ind String umwandeln und in Textdatei ausgeben

Hallo,

folgende Thematik habe ich heute vor mir. Ich habe ein Array mit Integer-Werten. Die Größe des Array ist unterschiedlich - mal sind 3 Werte mal 20 und im Extremfall auch mal 120 oder 200. Die Werte aus dem Array landen in einem String, der dann an eine Textdatei übergeben wird. Der Inhalt der Textdatei wird anschließend kontrolliert und via Copy&Paste in eine SSH Session übergeben. Das Problem dabei ist, dass die SSH Session nicht 120 Werte aus dem Array annimmt, weil die Hardware die den String erhält nur eine begrenzte Anzahl von Zeichen erlaubt. Aus diesem Grund möchte ich das Array für den String x mal teilen. Und genau darin besteht nun meine Frage.

Ich kann die Länge des Array mit .length oder .count zählen lassen. Nach meiner Vorstellung sollte nach 50 Werten ein neuer String entstehen. Anschließend würde ich eine Schleife erstellen, die dann die bis zum Wert 50 in den String schreibt, danach die nächsten 50 Werte usw. Was ist aber wenn ich nur 120 Werte habe.

Gibt es für dieses Problem vielleicht einen Ein Zeiler oder muss es wie von mir vermutet via Schleife realisiert werden?

Gruß
derhoeppi

Content-Key: 279156

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

Printed on: April 26, 2024 at 06:04 o'clock

Mitglied: 122990
122990 Aug 04, 2015 updated at 10:43:46 (UTC)
Goto Top
Moin,
ganz einfach, du teilst die Array Länge durch die gewünschte Teilmenge(50) und nimmst davon nur den ganzen Teil ohne den Rest nach dem Komma.
Dann ermittelst du mit dem MOD Operator (%) den übrig geblieben Rest. Dann läufst du mit einer Schleife über den "ganzen" Wert den du ermittelt hast und gibst die entsprechenden Array-Werte in die Dateien aus.
Zum Schluss dann noch den Rest in eine weitere Datei, fertig.
So wie nach diesem Muster:
3000 Dateien automatisch in 150 stückeln?

Gruß grexit
Member: colinardo
colinardo Aug 04, 2015 updated at 13:39:53 (UTC)
Goto Top
Hallo derhoeppi.
das sieht dann bspw. so aus:

#BeispielArray
$a = 1..120
$intCount  = 50
$full = [math]::Floor($a.length / $intCount)
0..($full) | %{$a[($intCount * $_)..(($intCount * $_)+$intCount-1)]  -join "`r`n" | set-content "C:\temp\test_$_.txt"}  
Pfad für Ausgabedateien am Ende anpassen.

Grüße Uwe
Member: derhoeppi
derhoeppi Aug 05, 2015 at 06:40:11 (UTC)
Goto Top
Hallo,

vielen Dank für die Antworten. Ich habe diese nun versucht an meine Gegebenheit anzupassen. Das Problem bei colinardo's Beispiel ist die Tatsache, dass er mir drei Dateien erstellt. Wenn ich es fix auf eine Datei einstelle, dann schreibt er alles in eine Datei. Dafür hab ich dann nicht set-content, sondern Out-File mit Append genutzt. Das Skript mit den 3000 Dateien ist gut, aber zu viel für mein Vorhaben.

Folgendes habe ich nun gemacht:
[array]$Output = @()
$resultadd = @()
$a = 1..120 
$intCount  = 50 
$full = [math]::Floor($a.length / $intCount) 

for ($i=0;$i -lt $full ; $i++){
         $resultadd = "Hiernach sollen die Teile des Array $a stehen: "+ $a (1-50, 51-100, 101-120)  
        $Output += $resultadd
}
$Output | Out-File C:\Temp\test.txt -Append

Gruß
derhoeppi
Member: colinardo
Solution colinardo Aug 05, 2015 updated at 07:49:00 (UTC)
Goto Top
Wenn man's weiß wie der Herr es haben will, ist's natürlich einfacher.face-wink Naja kleine Änderung meines Scripts, und alles landet in einer Datei die Blöcke getrennt mit einem Strich:
#BeispielArray
$a = 1..120
$intCount  = 50
$full = [math]::Floor($a.length / $intCount)
0..($full) | %{($a[($intCount * $_)..(($intCount * $_)+$intCount-1)]  -join "`r`n") + "`r`n-------------"} | add-content "C:\temp\output.txt"  
Grüße Uwe

Bitte dann noch ein gelöst hinten dran. Merci.
Member: derhoeppi
derhoeppi Aug 05, 2015 at 07:50:35 (UTC)
Goto Top
Hallo Uwe,

manchmal sieht man den Wald vor lauter Bäumen nicht. Ich habe es bereits so versucht wie du es nun gepostet hast. Mein Fehler daran war nur die fehlende zusätzliche Klammer. Ich bedanke mich für die schnelle und kompetente Hilfe.

Gruß
derhoeppi
Member: derhoeppi
derhoeppi Aug 18, 2015 at 08:15:19 (UTC)
Goto Top
Hallo,

ich muss das Thema noch einmal öffnen. Folgendes Problem habe ich nun mit der Mathematischen Berechnung festgestellt.

$a = 1
$intCount  = 50 
$full = [math]::Floor($a.length / $intCount) 
0..($full) | %{($a[($intCount * $_)..(($intCount * $_)+$intCount-1)]  -join "`r`n") + "`r`n-------------"} | add-content "C:\temp\output.txt"  

Mein Array $a hat nur einen Wert. Das Problem bei der Berechnung ist nun das der Wert von $full zu klein ist, so dass der Output null ist. Wenn $a zwei Werte enthält, funktioniert es einwandfrei. In meinem Skript habe ich nun durch den Count von $a abgefangen. Ich stelle mir jedoch die Frage, ob es auch anders zu lösen wäre?

Gruß
derhoeppi
Member: colinardo
Solution colinardo Aug 18, 2015, updated at Aug 19, 2015 at 06:29:21 (UTC)
Goto Top
Hallo derhoeppi,
Folgendes Problem habe ich nun mit der Mathematischen Berechnung festgestellt.
das ist so leider nicht richtig, du übersiehst hier ein kleines aber feines Detail !
Die Variable mit folgendem Inhalt
$a = 1 
Ist kein Array ! Sondern ein einzelner integer Wert. Deswegen erhältst du auch keine Ausgabe.
Wenn dann muss das schon ein Array sein:
$a = @(1)
Dann klappt das auch.

Also bei sowas immer vorher den Typ der Variablen checken:
$a.getType()
Bei $a = 1 sieht der Typ der Variablen so aus
IsPublic IsSerial Name  BaseType        
-------- -------- ----  --------        
True     True     Int32 System.ValueType
und bei $a = @(1):
IsPublic IsSerial Name     BaseType    
-------- -------- ----     --------    
True     True     Object System.Array
Man erkennt klar den Unterschied.Das ist der Grund warum du bei deiner Variante keine Ausgabe erhältst. Denn wenn der Datentyp stimmt geht obiger Code einwandfrei auch mit nur einem einzelnen Element.

Es wird immer wieder gerne vergessen das Powershell nicht Batch ist, sondern im Hintergrund eine objektorientierte Sprache mit expliziten Typen (.NET), nur vergisst man das leicht, weil einem die Powershell durch "Typ-Casting" sehr viel davon abnimmt, aber eben nicht alles. Deswegen ist es immer wichtig die Datentypen zu kennen, oder explizit anzugeben [string]/[bool] etc.. was man auch durch voranstellen des Typs erreichen kann

Z.B. macht das aus einer einzelnen Zahl ein Array:
[array]1
Die Variante von oben @(1,2,3) ist ein spezielles Powershell-Konstrukt für ein Array, ist aber im Hintergrund das selbe wie mit der expliziten Angabe von [array].

Hoffe das war soweit verständlich für dich.

Grüße Uwe
Member: derhoeppi
derhoeppi Aug 19, 2015 at 06:30:19 (UTC)
Goto Top
Hallo Uwe,

du hast recht. Ich habe aus irgendwelchen Gründen die Array-Initialisierung aus kommentiert.

Gruß
derhoeppi