daffman

Batch datei spuckt nach for f in der for l schleife nicht die varbiablen aus!

Ich wende mich wieder an die community, weil ich weiß, dass ich hier sicher eine antowort bekommen! Diesmal habe ich schon einen Quelltext nur irgendwas funktioniert nicht wie immer...

Hallo! Also ich versuche alle dateien in einem verzeichnis umzubenennen und zwar indem ich die " " (leerschritte) in den dateinamen durch "_" ersetze.

ich dachte mir, zuerst einmal die liste in eine datei schreiben, die namen als variable festlegen und den leerschirtt durch einen unterstrich ersetzen und in eine zweite datei schreiben. das funktioniert noch super. wenn ich die datei anschaue ist alles super.
so dann will ich mit einer for /f die zweite liste wieder in variable speichern. geht auch noch. doch der letzte schritt ist irgendwo fehlerhaft.

dir /b *.txt>>list.tmp
for /f "delims=: tokens=1,2*" %%a in ('findstr /n . "list.tmp"') do (set znt=%%a  
set list%%a=%%b
setlocal enabledelayedexpansion
echo !list2%%a: =^_!>>list2.tmp
endlocal
)

for /f "delims=: tokens=1,2*" %%a in ('findstr /n . "list.tmp"') do (set list2%%a=%%b)  

for /l %%a in (1, 1, %znt%) do (ren %%list%%a%% %%list2%%a%%)

hier ist, was ausgespuckt wird:

C:\Users\grandits\Desktop\Batch>2

C:\Users\grandits\Desktop\Batch>dir /b *.txt 1>>list.tmp

C:\Users\grandits\Desktop\Batch>for /F "delims=: tokens=1,2*" %a in ('findstr /n  
 . "list.tmp"') do (  
set znt=%a
 set list%a=%b
 setlocal enabledelayedexpansion
 echo !list2%a: =_! 1>>list2.tmp
 endlocal
)

C:\Users\grandits\Desktop\Batch>(
set znt=1
 set list1=Merle Haggard.txt
 setlocal enabledelayedexpansion
 echo !list21: =_! 1>>list2.tmp
 endlocal
)

C:\Users\grandits\Desktop\Batch>for /F "delims=: tokens=1,2*" %a in ('findstr /n  
 . "list2.tmp"') do (set list2%a=%b )  

C:\Users\grandits\Desktop\Batch>(set list21=Merle_Haggard.txt)

C:\Users\grandits\Desktop\Batch>for /L %a in (1 1 1) do (ren %list%a% %list2%a%
)

C:\Users\grandits\Desktop\Batch>(ren %list1% %list21% )
Das System kann die angegebene Datei nicht finden.

wie kann ich das problem beheben??

MFG alexander
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen
Kommentar vom Moderator Biber am 17.08.2010 um 16:53:23 Uhr
Zitat von @Daffman: am 17.08.2010, 13:00:31 Uhr
das mit dem umbenennten funktioniert in die eine richtung, aber ...
Set /a rgc+=1
#698

Content-ID: 149042

Url: https://administrator.de/forum/batch-datei-spuckt-nach-for-f-in-der-for-l-schleife-nicht-die-varbiablen-aus-149042.html

Ausgedruckt am: 13.05.2025 um 03:05 Uhr

bastla
bastla 16.08.2010 um 09:21:57 Uhr
Goto Top
Hallo Daffman!

Sollte einfacher gehen:
@echo off & setlocal
pushd "D:\Verzeichnis mit den umzubenennenden Dateien"  
for /f "delims=" %%i in ('dir /b /a-d "* *.*" 2^>nul') do set "Datei=%%i" & call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
echo ren %1 "%Datei: =_%"  
goto :eof
Wenn's passt, das "echo" vor dem "ren" entfernen.

Falls es tatsächlich keine "!" in den Dateinamen gibt, sollte auch
@echo off & setlocal enabledelayedexpansion
pushd "D:\Verzeichnis mit den umzubenennenden Dateien"  
for /f "delims=" %%i in ('dir /b /a-d "* *.*" 2^>nul') do set "Datei=%%i" & echo ren "%%i" "!Datei: =_!"  
popd
genügen (beides ungetestet) ...

Und wenn Du eine Liste der umbenannten Dateien brauchst, dann eben an passender Stelle ein
>>D:\Umbenannt.txt echo %%i
einbauen.

Grüße
bastla
Daffman
Daffman 16.08.2010 um 10:29:53 Uhr
Goto Top
Hallo!

Ich danke Dir für Deine schnelle antwort, ich habe das erste verwendet, weil es sicherer ist und ich nicht garantrieren kann, dass keine "!" vorhanden sind.

SUPER danke!

MFG alexander
Daffman
Daffman 16.08.2010 um 12:46:52 Uhr
Goto Top
eine frage habe ich noch, wenn ich das in die andere richtrung mchen will, was empfiehlst Du da??

ich habe es mit:

setlocal
set weg=%CD%
set weg=%weg:~0,-12%
pushd %weg%
for /f "delims=" %%i in ('dir /b /a-d "* *.*" 2^>nul') do set "Datei=%%i" & call :ProcessFile2 "%%i"  
popd
goto :FERTIG

:ProcessFile2
ren %1 "%Datei:_= %"  
goto :eof
:FERTIG

oder muss ich es mit ^_ machen??

nochmals mit SFG Alexander
bastla
bastla 16.08.2010 um 17:47:18 Uhr
Goto Top
Hallo Daffman!

Das "ren" müsste schon passen; die Zeilen 2 und 3 sind mir etwas suspekt - was sollen die denn bewirken (was nicht ev auch ein "pushd .." könnte)?

Grüße
bastla
Daffman
Daffman 17.08.2010 um 11:20:27 Uhr
Goto Top
Hallo bastla!

naja ich dachte mir, dass ich das Verzeichnis nicht auschreiben muss, in dem alle umbenannt wird, verwende ich einfach eine Variable! Damit ist es auch leichter, wenn ich es auf einem anderen Computer ausführen will!

wenn ich jetzt dieses Script ausführe, kommt dann für die 2, 3, 4. zeile das:

C:\Users\Desktop\Batch\musikfinden>set weg=C:\Users\Desktop\Batch\musikfinden

C:\Users\Desktop\Batch\musikfinden>set weg=C:\Users\Desktop\Batch

C:\Users\Desktop\Batch\musikfinden>pushd "C:\Users\Desktop\Batch"  

MFG alexander

PS: noch eine frage habe ich: wenn ich jetzt mehrere Zeichen ersetzen wollen würde, muss ich das dann einfach dranhängen? so:

ren %1 "%Datei: =_%"&ren %1 "%datei:'ve= have%&ren %1 %Datei:ü=³%  

nochmals MFG alexander
bastla
bastla 17.08.2010 um 12:20:51 Uhr
Goto Top
Hallo Daffman!

Variablen sind zumeist sinnvoll - Deine Zeile 3 macht den Vorteil aber wieder zunichte, da Du eine Konstante (12) verwendest; deshalb die Frage, "wohin" Du damit willst.

Da in diesem Fall die Variable nur ein einziges Mal (für den Verzeichniswechsel mit "pushd") verwendet wird, könntest Du allerdings den Pfad auch einfach in Zeile 4 angeben. Für den Spezialfall, dass Du das "Eltern-Verzeichnis" ansteuern willst, genügt dann tatsächlich ein "pushd .." ...
Wenn Du mehrere Ersetzungen benötigst könnte das so aussehen:
set "Datei=%Datei: =_%"  
set "Datei=%Datei:'ve= have%"  
set "Datei=%Datei:ü=³%"  
ren %1 "%Datei%"  
Grüße
bastla
Daffman
Daffman 17.08.2010 um 13:00:31 Uhr
Goto Top
Zitat von @bastla:
Da in diesem Fall die Variable nur ein einziges Mal (für den Verzeichniswechsel mit "pushd") verwendet wird,
könntest Du allerdings den Pfad auch einfach in Zeile 4 angeben. Für den Spezialfall, dass Du das
"Eltern-Verzeichnis" ansteuern willst, genügt dann tatsächlich ein "pushd .." ...

jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - vielen dank das brauche ich!

das mit dem umbenennten funktioniert in die eine richtung, aber in die andere nicht mehr
die dateien mit "_" im Elternverzeichnis sollen wieder auf ein " " gebracht werden:

@echo off & setlocal
pushd..
for /f "delims=" %%i in ('dir /b /a-d "* *.*" 2^>nul') do set "Datei=%%i" & call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set datei=%datei:_= %"  
echo ren %1 "%Datei%"  
goto :eof

was ist daran falsch???

LG alexander
bastla
bastla 17.08.2010 um 13:09:41 Uhr
Goto Top
Hallo Daffman!

Abgesehen vom fehlenden Anführungszeichen in der Zeile 8 sorgt das "optimierte" (hatte ich oben nicht erwähnt)
dir "* *.*"
dafür, dass nur Dateien mit Leerzeichen im Namen gesucht werden - solche gibt's aber nicht mehr ...

... daher sollte es mit dieser Zeile 3 dann klappen:
for /f "delims=" %%i in ('dir /b /a-d 2^>nul') do set "Datei=%%i" & call :ProcessFile "%%i"
Grüße
bastla
Daffman
Daffman 17.08.2010 um 13:38:25 Uhr
Goto Top
SUPER danke, das war genau das richtige!

MFG alexander

PS: ich danke dir soooo sehr für deine vielen Hilfen!!! und ich hoffe ich darff mich nocheinmal melden, wenn ich frageb hätte?