daffman
Goto Top

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
Kommentar vom Moderator Biber am Aug 17, 2010 um 14: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-Key: 149042

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

Printed on: April 23, 2024 at 14:04 o'clock

Member: bastla
bastla Aug 16, 2010 at 07:21:57 (UTC)
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
Member: Daffman
Daffman Aug 16, 2010 at 08:29:53 (UTC)
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
Member: Daffman
Daffman Aug 16, 2010 at 10:46:52 (UTC)
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
Member: bastla
bastla Aug 16, 2010 at 15:47:18 (UTC)
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
Member: Daffman
Daffman Aug 17, 2010 at 09:20:27 (UTC)
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
Member: bastla
bastla Aug 17, 2010 at 10:20:51 (UTC)
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
Member: Daffman
Daffman Aug 17, 2010 at 11:00:31 (UTC)
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
Member: bastla
bastla Aug 17, 2010 at 11:09:41 (UTC)
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
Member: Daffman
Daffman Aug 17, 2010 at 11:38:25 (UTC)
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?