Wie verkette ich Zeichenfolgen in einer Windows-Batchdatei?

73

Ich habe ein Verzeichnis, für das ich alle .docDateien mit einem auflisten möchte ;.

Ich weiß, dass der folgende Stapelbefehl alle Dateien wiedergibt:

for /r %%i In (*.doc) DO echo %%i

Aber jetzt möchte ich sie alle in eine Variable einfügen, eine ;dazwischen hinzufügen und sie alle auf einmal wiedergeben.
Wie kann ich das machen?

set myvar="the list: "
for /r %%i In (*.doc) DO <what?>
echo %myvar%
Fortega
quelle

Antworten:

62

Wie wäre es mit:

@echo off
set myvar="the list: "
for /r %%i in (*.doc) DO call :concat %%i
echo %myvar%
goto :eof

:concat
set myvar=%myvar% %1;
goto :eof
Rubens Farias
quelle
2
Vielen Dank für diese Antwort! Es hat gerade ein Problem gelöst, bei dem dynamisch ein Klassenpfad in eine Batch-Datei erstellt wurde :) Hinzufügen der erforderlichen Änderungen, aber mein Problem war das Concat und dies hat es behoben!
Charliemops
45

Basierend auf der Rubens-Lösung müssen Sie die verzögerte Erweiterung von env-Variablen aktivieren (Typ "help setlocal" oder "help cmd"), damit die Variable in der Schleife korrekt ausgewertet wird:

@echo off
setlocal enabledelayedexpansion
set myvar=the list: 
for /r %%i In (*.sql) DO set myvar=!myvar! %%i,
echo %myvar%

Beachten Sie auch die folgende Einschränkung ( MSDN ):

Die maximale Größe der einzelnen Umgebungsvariablen beträgt 8192 Byte.

devio
quelle
1
Die Einschränkung ist falsch. Die maximale Größe der Umgebungsvariablen in Windows beträgt ca. 64 KB, also ca. 32.000 Zeichen. In Batch-Dateien besteht jedoch das Problem, dass die maximale Befehlszeilenlänge 8190 Zeichen beträgt. Daher muss jede Umgebungsvariable, die Sie dort festlegen, kürzer sein. Auch die Gesamtumweltbeschränkung von 65 KiB ist falsch. Ich habe gerade Umgebungsvariablen mit einigen MiB ohne Probleme erstellt.
Joey
2
Der Link sagt 65 Tausend KB, was 64 MB entsprechen würde. Ich werde jedoch nicht streiten, da ich mich nie damit befasst habe.
Devio
1
Damit die Leute nicht den gleichen Neuling-Fehler machen, den ich gemacht habe, entfernen Sie "die Liste:", wenn Sie das nicht in Ihrem haben wollen myvar.
0

Beachten Sie, dass die Variablen @fnameoder @exteinfach verkettet werden können. Dies:

forfiles /S /M *.pdf /C "CMD /C REN @path @fname_old.@ext"

benennt alle PDF-Dateien in "filename_old.pdf" um

Pierre
quelle