creatorx
Goto Top

String automatisch anpassen (erweitern oder kürzen)

Hallo an alle,

folgendes Problem: Ich lasse in meinem Batchscript eine Textdatei Zeile für Zeile auslesen.
Nun möchte ich einen String erstellen der wie folgt aussehen soll: "Zeile1" "Zeile2" "Zeile3"
und so weiter. Die Zeilenanzahl variiert dabei und die Variable soll natürlich immer die genaue Anzahl an Zeilen beinhalten Ich habe bereits die einzelnen Zeilen ausgelesen und jeweils in eine eigene Variable gepackt:
For /f "delims=" %%i IN (Strings.txt) DO (  
		SET /a zaehler=zaehler+1
		SET zeile[!zaehler!]=%%i
					
 )		
Das heißt, z.B. die zweite Zeile lässt sich so ausgeben: ECHO zeile[!2!]
Aber wie füge ich das Ganze nun zu einem einzigen String zusammen?

Content-ID: 330611

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

Ausgedruckt am: 26.11.2024 um 07:11 Uhr

rubberman
rubberman 26.02.2017 um 19:54:00 Uhr
Goto Top
Hallo CreatorX

Aber wie füge ich das Ganze nun zu einem einzigen String zusammen?
???
Gar nicht. Warum auch?

Grüße
rubberman
CreatorX
CreatorX 26.02.2017 um 20:08:00 Uhr
Goto Top
Hallo rubberman


Zitat von @rubberman:
Gar nicht. Warum auch?
Warum nicht? Die Zeichenkette muss an ein Programm so übergeben werden.
rubberman
rubberman 26.02.2017 aktualisiert um 20:28:44 Uhr
Goto Top
Was meinst du denn mit "so"? Ich versteh nur Bahnhof.

Nehmen wir an deine Datei enthält...
a
b
c
Wie soll denn das Resultat aussehen?
abc
oder
a b c
oder (Zeilenumbrüche inclusive)
a
b
c
CreatorX
CreatorX 26.02.2017 um 21:50:49 Uhr
Goto Top
Hallo rubberman,

Es muss so Aussehen:
"C:\Games\a" "C:\Games\b" "C:\Games\c"  
,
Also vor jedes Wort muss ein Pfad, es muss jeweils immer in Anführungstrichen stehen und es soll immer ein Leerzeichen dazwischen.
rubberman
Lösung rubberman 26.02.2017 um 22:27:32 Uhr
Goto Top
Joa, dafür brauchst du doch aber nicht vorher ein assoziatives Array zu erstellen. Kannst den String doch auch gleich in der Schleife zusammenbauen.
@echo off &setlocal
set "file=Strings.txt"  

setlocal EnableDelayedExpansion
set "paths="  
<"!file!" (  
  for /f %%i in ('type "!file!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "line=" &set /p "line="  
    if defined line set paths=!paths! "C:\Games\!line!"  
  )
)

echo !paths:~1!
pause
CreatorX
CreatorX 27.02.2017 aktualisiert um 10:01:17 Uhr
Goto Top
Hallo rubberman,

vielen lieben Dank für den Code, da wär ich glaube nie selbst drauf gekommen und hätte mir noch einige Wochenenden um die Ohren geschlagen!

Zwei Fragen hätte ich noch:
1. Wofür ist eigentlich das :~1 bei !paths:~1! ? Augenscheinlich funktioniert es auch ohne :~1...
2. Gibt es ne theoretische Maximalgröße für solche Strings?
rubberman
rubberman 27.02.2017 aktualisiert um 12:34:30 Uhr
Goto Top
Hallo CreatorX.

1) Beim Zusammenbauen des Strings entsteht ein vorangestelltes Leerzeichen. Das :~1 schneidet dieses weg (sieh dir dazu die Hilfe zu SET an mittels set /? ). Da das vor dem ersten Anführungszeichen steht, ist es für die Übergabe des Strings als Gruppe von Argumenten unerheblich, da hast du Recht.

2) Ja gibt es. Die Beschränkung ist 8191 Zeichen und gilt für die gesamte Kommandozeile (bei einem Klammernblock mit mehreren Zeilen, für den gesamten Block).
CreatorX
CreatorX 27.02.2017 um 16:37:06 Uhr
Goto Top
Hallo rubberman,

danke für die Erklärung.

Ich hätte da noch eine "kleine" Bitte. Ich bekomme nämlich bei deinem Code Probleme mit Einträgen die Umlaute enthalten. Ich hab jetzt betroffene Ordner einfach umbenannt. Aber ließe sich das im Code noch irgendwie soweit optimieren, dass Umlaute korrekt in den String gespeichert werden?
rubberman
rubberman 27.02.2017 um 18:20:43 Uhr
Goto Top
Probier's mal mit einem
>nul chcp 1252
am Anfang des Codes. Ob das funktioniert hängt aber letztlich davon ab, in welcher Zeichencodierung die Umlaute in deiner Textdatei vorliegen.

Die sichere Variante bleibt aber immer noch, lediglich Zeichen im Standard ASCII Bereich zu verwenden.