darkprodukt
Goto Top

BATCH In einer For-Schleife die Anzahl der durchlaufe und das Ende anzeigen lasse.

Guten Abend,

ich bin gerade dabei mir eine weitere Arbeitserleichterung zu Programmieren.
Bis jetzt hatte ich keine schwierigkeiten, bei den ersten 100 Zeilen, aber nun ist
ein Problem aufgetreten das ich nicht Lösen kan.

Hier die stelle die Probleme bereitet: (In einer beispiel Testdatei zu versuchs zwecken)
rem /---- Dem Programm erteilte oder errechnete Parameter ----/
set "Path=C:\Test"  
set /a "Count1=1001"  
set /a "Count2=1020"  
rem /---------------------------------------------------------/

for /F "delims=" %%r in ("%TEMP%\tempren.txt") do (  
						  set "ln=%%r" && call :Rename && timeout /T 1 >NUL  
						  )

pause

:Rename
ren %ln%
CLS 
echo Pfad: %Path% 
echo. 
echo. 
echo ------ %Count1:~-3% von %Count2:~-3% ------
echo.
set /a "Count1=%Count1%+1"  
exit /b 0

Leider benennt es die Dateien nicht nach der Reihe um.
Es erzeugt lediglich diese Ausgabe:
Pfad: C:\Test


------ 001 von 020 ------

Der Befehl "timeout" ist entweder falsch geschrieben oder  
konnte nicht gefunden werden.
Drücken Sie eine beliebige Taste . . .

In der Datei "tempren.txt" steht sowas wie: "C:\Test\Datei1.txt" "001 2013.02.15.txt"


Außerdem noch eine kleinigkeit die mir aufgefallen ist.

Früher hatte Windows ja diese bescheurte Dateien sortierung, die so war:
1.txt
10.txt
11.txt
...
2.txt
20.txt
21.txt
...

Neuerdings ist die Sortierung in dem Explorer richtig, also:
1.txt
2.txt
...
10.txt
11.txt
...
20.txt
21.txt
...

aber in CMD mit 'dir /a-s-d-h /b' bekomme ich immer noch die alte Sortierung.

Wann wurde das geändert und wiso nicht im CMD?
Wie kan ich in CMD die Liste so konvertieren, dass sie so wie im Explorer ist?

Content-ID: 201830

Url: https://administrator.de/forum/batch-in-einer-for-schleife-die-anzahl-der-durchlaufe-und-das-ende-anzeigen-lasse-201830.html

Ausgedruckt am: 26.12.2024 um 00:12 Uhr

bastla
bastla 15.02.2013 aktualisiert um 14:58:46 Uhr
Goto Top
Hallo Darkprodukt!

Es ist keine gute Idee, Systemvariablen mit eigenen Werten zu überschreiben - wenn Du also "%Path%" auf "C:\Test" setzt, ist es nicht verwunderlich, dass die "timeout.exe" nicht gefunden wird - daher eine andere Variable anstatt "%Path%" verwenden ...
Wie kan ich in CMD die Liste so konvertieren, dass sie so wie im Explorer ist?
Eigentlich nur, indem Du führende Nullen verwendest und die Dateien daher "0001.txt", "0002.txt" etc nennst.
Im Zweifelsfall würde ich übrigens eher
for /F "delims=" %%r in ("%TEMP%\tempren.txt") do call :Rename %%r & timeout /T 1 >NUL 
und im Unterprogramm
ren %1 %2
schreiben.
BTW:
set /a "Count1=%Count1%+1"
ließe sich auch so formulieren:
set /a Count1+=1
Damit funktioniert das Zählen (für das Ausgeben wäre trotzdem "delayedexpansion" erforderlich) auch innerhalb einer Schleife.

Grüße
bastla

P.S.:
Guten Abend,
In welcher Zeitzone bist Du denn gerade?
Darkprodukt
Darkprodukt 15.02.2013 aktualisiert um 15:30:18 Uhr
Goto Top
Hallo bastla,

das mit "Path" hab ich mir auch kurtz überlegt, habs aber nach einem anderen Gedankenblitz wieder vergessen. ^^

Nach der änderung schließt sich die Batch datei, aber diesmal ohne eine Rückmeldung.
Änderungen:
set "Bearbeitungspfad=C:\Test"  
set /a "Count1=1001"  
set /a "Count2=1020"  

for /F "delims=" %%r in ("%TEMP%\tempren.txt") do (  
						  call :Rename %%r && timeout /T 1 >NUL
						  )

pause

:Rename
echo %1 %2
CLS 
echo Pfad: %Bearbeitungspfad% 
echo. 
echo. 
setlocal enabledelayedexpansion 
echo ------ !Count1:~-3! von !Count2:~-3! ------
echo.
set /a Count1+=1
endlocal
exit /b 0

Es bleibt an der gleichen stelle stehen wie sonst auch.

Edit1: Ohne "Pause" beendet es sich nach einer weile. (5...10s oder so)

Grüße Darkprodukt
bastla
bastla 15.02.2013 um 16:09:48 Uhr
Goto Top
Hallo Darkprodukt!

So sollte das besser gehen:
@echo off & setlocal
set "Bearbeitungspfad=C:\Test"  
set /a "Count1=1001"  
set /a "Count2=1020"  

for /F "usebackq delims=" %%r in ("%TEMP%\tempren.txt") do (  
						    call :Rename %%r & REM timeout /T 1 >NUL
                                                    set /a Count1+=1
                                                    )

goto :eof

:Rename
echo ren %1 %2
echo Pfad: %Bearbeitungspfad% 
echo. 
echo. 
echo ------ %Count1:~-3% von %Count2:~-3% ------
echo.
goto :eof
Grüße
bastla
Darkprodukt
Darkprodukt 16.02.2013 um 00:11:13 Uhr
Goto Top
Hallo bastla,

funktioniert immernoch nicht.
Das Programm beendet sich einfach ca. 10s nach dem das ---- 001 von 020 ---- aufgetaucht ist.


Kannst du mir erklären welche ausgaben die %1 und %2 nach dem ren bringen?

Grüße Darkprodukt
bastla
bastla 16.02.2013 um 00:18:48 Uhr
Goto Top
Hallo Darkprodukt!

Eine Zeile der Art
"C:\Test\Datei1.txt" "001 2013.02.15.txt"
in der "tempren.txt" würde für %1 "C:\Test\Datei1.txt" und für %2 "001 2013.02.15.txt" liefern ...

Poste doch bitte einmal die gesamte Ausgabe Deines Batchlaufs ("echo off" verwendest Du ja ohnehin nicht).

Grüße
bastla
Darkprodukt
Darkprodukt 16.02.2013 aktualisiert um 12:59:19 Uhr
Goto Top
Hallo bastla,

Ok, das hab ich mir schon gedacht, aber wiso? In der for schleife verwende ich ja keine tokens und es wird ja die ganze zeile in %%r geschrieben, da in delims ja nichts angegeben wird.

Splittet die übergabe mit call %%r in tokens auf?

Der ganze ablauf meiner Test datei:
C:\Users\%USERNAME%\Desktop\Programme\Batch>set "Bearbeitungspfad=C:\Test"  

C:\Users\%USERNAME%\Desktop\Programme\Batch>set /a "Count1=1001"  

C:\Users\%USERNAME%\Desktop\Programme\Batch>set /a "Count2=1020"  

C:\Users\%USERNAME%\Desktop\Programme\Batch>for /F "delims=" %r in ("C:\Users\%USERNAME%\AppData\Local\Temp\tempren.txt")  
do (call :Rename %r   & timeout /T 1   1>NUL
 set /a Count1+=1  )

C:\Users\%USERNAME%\Desktop\Programme\Batch>(call :Rename C:\Users\%USERNAME%\AppData\Local\Temp\tempren.txt   & timeout /
T 1   1>NUL
 set /a Count1+=1  )

C:\Users\%USERNAME%\Desktop\Programme\Batch>ren C:\Users\%USERNAME%\AppData\Local\Temp\tempren.txt
Syntaxfehler.

C:\Users\%USERNAME%\Desktop\Programme\Batch>rem CLS

C:\Users\%USERNAME%\Desktop\Programme\Batch>echo Bitte gaben sie den Pfad eines Ordners an
Bitte gaben sie den Pfad eines Ordners an

C:\Users\%USERNAME%\Desktop\Programme\Batch>echo in dem die Datein nummeriert werden sollen.
in dem die Datein nummeriert werden sollen.

C:\Users\%USERNAME%\Desktop\Programme\Batch>echo Pfad: C:\Test
Pfad: C:\Test

C:\Users\%USERNAME%\Desktop\Programme\Batch>echo.


C:\Users\%USERNAME%\Desktop\Programme\Batch>echo.


C:\Users\%USERNAME%\Desktop\Programme\Batch>echo ------ 001 von 020 ------
------ 001 von 020 ------

C:\Users\%USERNAME%\Desktop\Programme\Batch>echo.


C:\Users\%USERNAME%\Desktop\Programme\Batch>exit /b 0

C:\Users\%USERNAME%\Desktop\Programme\Batch>pause
Drücken Sie eine beliebige Taste . . .

Edit1: Habs gelöst! Hab in der for schleife einfach: in ('type "%TEMP%\tempren.txt"') do ... verwendet.

Danke für deine hilfe.

Grüße Darkprodukt

Noch eine frage.
Das mit der falschen sortierung, würde ich gerne umgehen, aber wie?
bastla
bastla 16.02.2013 um 13:38:28 Uhr
Goto Top
Hallo Darkprodukt!
Hab in der for schleife einfach: in ('type "%TEMP%\tempren.txt"') do ... verwendet.
Auch eine Möglichkeit - meinen Vorschlag mit "usebackq" hattest Du ja offensichtlich ignoriert.
Das mit der falschen sortierung, würde ich gerne umgehen, aber wie?
Wenn auch hier mein Ansatz (von ganz oben) für Dich nicht passt, habe ich leider keine weitere Idee ...

Grüße
bastla
Darkprodukt
Darkprodukt 16.02.2013 um 15:03:08 Uhr
Goto Top
Hallo, bastla!

Ja das "usebackq" hab ich übersehen.


Da das mit den führenden Nullen weiß ich schon.
Aber das Programm soll eben auch dazu verwendet werden können.
Dateien zu Nummerieren, also deteien in einem Ordner die 1.txt; 2.txt etc. heßen,
in 001.txt; 002.txt; etc umzubenennen und genau da ist mein Problem, da die Dateien
eben Falsch nummeriert werden würden.

Grüße Darkprodukt
bastla
bastla 16.02.2013 um 19:10:18 Uhr
Goto Top
Hallo Darkprodukt!

Als Workaraound könntest Du mit
dir /b/on ?.txt
alle Dateien mit einstelligen Namen, mit
dir /b/on ??.txt
alle mit ein- oder zweistelligen Namen, usw getrennt verarbeiten.

Grüße
bastla
Darkprodukt
Darkprodukt 16.02.2013 um 20:33:48 Uhr
Goto Top
Hallo, bastla!

Super Idee, aber was mich ich mit den Dateien die z.b. Bild_1.jpg; Bild_2.jpg; etc. heißen?

Die würden ja auch Falsch benannt werden.


Grüße Darkprodukt
bastla
bastla 16.02.2013 um 21:06:10 Uhr
Goto Top
Hallo Darkprodukt!

Für die genannten Beispiele wäre das dann eben
<code type="plain>dir /b/on "Bild_?.jpg"

etc ...

Im übrigen wäre es sinnvoll, bereits bei der Entstehung der Dateien anzusetzen und dort für vernünftige Nummern zu sorgen.

Grüße
bastla
Darkprodukt
Darkprodukt 16.02.2013 um 23:36:49 Uhr
Goto Top
Hallo, bastla!

Leider ist es nicht möglich für mich die Dateinamen bei der enstehung so festzulegen, wie ich sie gerne hätte.

Die meisten Dateien sind aus .7z; .rar; .zip entpackt und enthalten z.b. eine vielzahl an Bildern, Videos, Dokumenten, aber leider eben mit einer meist sehr schlechten benennung.

Eine aufgabe dieses Programms soll es sein die Dateinamen fernünftig, um zu Benennen.

Deswegen ist würde Bild_?.jpg nicht funktionieren, da es auch ein anderer Dateiname sein kan.


Ich breuchte etwas, was liste der Dateinamen genauso ausgibt, wie es im "neuen" explorer angezeigt wird und nicht so wie in der Konsole.

Grüße Darkprodukt