friend1a
Goto Top

Verzeichnisse und-oder Dateinamen umbenennen

Moin zusammen,
ich stehe vor einem Problem und verzweifle
Das Problem:
Ich habe den Inhalt eines Verzeichnisses in eine Datei eingelesen (dir /b >123.txt) und dann die Datei einen Ordner höher abgelegt, vorher noch den Eintrag 123.txt entfernt. In der Datei stehen jetzt Ordner oder Dateien mit -> Vorname Nachname Zusatzinformation
Beispiel: Hugo Balder - Dies ist der Rest
Nun möchte ich in einem Batchfile das der Nachname vor dem Vorname steht mit einem Komma nach dem Vornamen
Balder, Hugo - Dies ist der Rest

Soweit bin ich gekommen :
echo off
FOR /F "eol=; tokens=1,2* delims=, " %%i in (123.txt) do (

echo %%i
echo %%j
echo %%k
set "original=%%i %%j %%k"
set "modifiziert=%%j, %%i %%k"
echo %original%
echo %modifiziert%
rem bis hier sieht es gut aus
rem dies funktioniert nicht rename .\xxx\%original% .\xxx\%modifiziert%
)

kann mir jemand helfen?

Content-Key: 647081

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

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: NordicMike
NordicMike 02.02.2021 um 10:38:03 Uhr
Goto Top
Welchen Fehler bekommst du bei "rename"?

Versuche mal "ren" statt "rename" ...
Mitglied: Pjordorf
Pjordorf 02.02.2021 um 10:38:52 Uhr
Goto Top
Hallo,

Zitat von @friend1a:
kann mir jemand helfen?
EnableDelayedExpansion nutzen. https://ss64.com/nt/delayedexpansion.html

Gruß,
Peter
Mitglied: friend1a
friend1a 02.02.2021 um 11:25:04 Uhr
Goto Top
ren oder rename macht keinen Unterschied. Ich bekomme einen Syntaxfehler
Mitglied: NordicMike
NordicMike 02.02.2021 um 11:38:38 Uhr
Goto Top
Er mag den Punkt im Pfad nicht
Mitglied: friend1a
friend1a 02.02.2021 um 11:43:08 Uhr
Goto Top
EnableDelayedExpansion hat nicht weitergeholfen ich habe jetzt einmal rename "%original%" "%modifiziert%" ausprobiert, jetzt kann er die angegebene Datei nicht finden
Mitglied: NordicMike
NordicMike 02.02.2021 um 11:44:48 Uhr
Goto Top
Hast du die etwa mit " " (Anführungszeichen) eingetippt?
Mitglied: friend1a
friend1a 02.02.2021 um 12:15:01 Uhr
Goto Top
Ja, und ich habe ganz komische Effekte
- wenn ich das aus einem DOS Fenster starte werden die Variablen nicht neu eingelesen
- jetzt auf einmal bekomme ich keine Anzeige mehr auf mein Echo

Irgendwie verhält sich das Script immer unterschiedlich
Übrigens hat er einmal einen Dateinamen umbenannt, die anderen aber nicht.

Hier jetzt der aktuelle Stand der nicht funktioniert

@echo off
SETLOCAL EnableDelayedExpansion
FOR /F "eol=; tokens=1,2* delims=, " %%i in (123.txt) do (
echo %%i
echo %%j
echo %%k
set "original=%%i %%j %%k"
set "modifiziert=%%j, %%i %%k"
echo %original%
echo %modifiziert%
rename "%original%" "%modifiziert%"
)

Hier die Ausgabe:

Andreas
Brandhorst
- Das Artefakt_ Roman.epub
ECHO ist ausgeschaltet (OFF).
ECHO ist ausgeschaltet (OFF).
Das System kann die angegebene Datei nicht finden.
Mitglied: NordicMike
NordicMike 02.02.2021 um 13:13:52 Uhr
Goto Top
Google mal nach EnableDelayedExpansion

Stichwort: %variable% und !variable!

Aber was anderes, eigentlich solltest du es auch ohne EnableDelayedExpansion schaffen.

Nimm die " " mal raus:
rename %original% %modifiziert%
Mitglied: Pjordorf
Pjordorf 02.02.2021 aktualisiert um 13:33:44 Uhr
Goto Top
Hallo,

Zitat von @NordicMike:
Google mal nach EnableDelayedExpansion
Verwendet der TO ja schon, obwohl der ZO gesagt hat das dies nicht funktionieren würde.

rename %original% %modifiziert%
Und wenn seine %original& und/oder %modifiziert% leer sind, gibts es mindestens einen Syntaxfehler. Und auch das verwenden von doppelten % Zeichen (der TO macht ja eine Batch Datei) könnte hier helfen, sowie einige zusätzliche Textausgaben (nur zur unterstützung bei der Fehlersuche). Laut seiner Ausgabe sagt
echo %%i
echo %%j
echo %%k
echo %original%
echo %modifiziert%
mindestens eins davon Echo ist Augeschaltet (OFF).
Und sein
rename "%original%" "%modifiziert%"
bringt (da Vermutet) %original% leer ist eben sein Das System kann die angegebene Datei nicht finden.

Ein set beim Batch starten bzw. dessen rückgabe kann schon hilfreich sein. Debuggen ist oftmals weitaus aufwändiger als der eigentliche geschriebene Code. (hab grad nur keine HW/SW zum testen)

Gruß,
Peter
Mitglied: TK1987
TK1987 02.02.2021 aktualisiert um 14:13:52 Uhr
Goto Top
Moin,

Zitat von @friend1a:
Hier jetzt der aktuelle Stand der nicht funktioniert
@echo off
SETLOCAL EnableDelayedExpansion
FOR /F "eol=; tokens=1,2* delims=, " %%i in (123.txt) do (  
echo %%i
echo %%j
echo %%k
set "original=%%i %%j %%k"  
set "modifiziert=%%j, %%i %%k"  
echo %original%
echo %modifiziert%
rename "%original%" "%modifiziert%"  
)
Wenn du die Variablenverzögerung nach dem Einschalten auch noch nutzen würdest, sollte es dann auch funktionieren.
@echo off
SETLOCAL EnableDelayedExpansion
FOR /F "eol=; tokens=1,2* delims=, " %%i in (123.txt) do (  
echo %%i
echo %%j
echo %%k
set "original=%%i %%j %%k"  
set "modifiziert=%%j, %%i %%k"  
echo !original!
echo !modifiziert!
rename "!original!" "!modifiziert!"  
)

Gruß Thomas
Mitglied: Pjordorf
Pjordorf 02.02.2021 um 14:49:25 Uhr
Goto Top
Hallo,

Zitat von @TK1987:
Wenn du die Variablenverzögerung nach dem Einschalten auch noch nutzen würdest, sollte es dann auch funktionieren.
Der TO hat zwar gelesen, es aber nicht Verstanden face-smile

An @friend1a
Auch mal hier nachlesen und verstehen https://devblogs.microsoft.com/oldnewthing/?p=29993

Oder das Beispiel in SS64 genau abarbeiten und die Unterschiede verinnerlichen
Now repeating this with Delayed Expansion:
@echo off
SETLOCAL EnableDelayedExpansion
Set "_var=first"  
Set "_var=second" & Echo %_var% !_var!   
This will output: first second
The value of the !_var! variable is evaluated as late as possible while the %_var% variable works just as before.
There are some advantages - we can swap the value of two variables in one line:
Set "var1=%var2%" & set "var2=%var1%"  

Gruß,
Peter
Mitglied: friend1a
friend1a 03.02.2021 um 08:50:21 Uhr
Goto Top
moin, ich bin auch inzwischen auf eine Lösung gekommen
@echo off

SETLOCAL EnableDelayedExpansion

FOR /F "eol=; tokens=1,2* delims=, " %%i in (123.txt) do (
set eins=%%i
set zwei=%%j
set rest=%%k
set before=!eins! !zwei! !rest!
@echo !before!
set after=!zwei!, !eins! !rest!
@echo !after!

@echo rename "!before!" "!after!"
rename "!before!" "!after!"
)

Danke für die Unterstützung
Tschau
Uwe
Mitglied: bastla
bastla 03.02.2021 um 22:50:08 Uhr
Goto Top
Hallo friend1a!

Da Du ja eigentlich nix an den einzelnen Bestandteilen des Dateinamens änderst, könntest Du das Speichern in zusätzliche Variablen einfach weglassen:
FOR /F "eol=; tokens=1,2* delims=, " %%i in (123.txt) do echo ren "%%i %%j %%k" "%%j, %%i %%k"

Grüße
bastla
Mitglied: friend1a
friend1a 04.02.2021 um 05:43:14 Uhr
Goto Top
Ich werde es einmal ausprobieren. Jetzt habe ich noch das Problem mit den Umlauten äüö, da funktioniert das rename nicht. Ich werde hier wohl noch eine neue Anfrage stellen müssen face-wink
Tschau
Uwe
Mitglied: Pjordorf
Pjordorf 04.02.2021 um 22:09:14 Uhr
Goto Top
Hallo,

Zitat von @friend1a:
Ich werde es einmal ausprobieren. Jetzt habe ich noch das Problem mit den Umlauten äüö, da funktioniert das rename nicht. Ich werde hier wohl noch eine neue Anfrage stellen müssen face-wink
Umlaute und sonstige Sonderzeichen waren nie eine Gute Idee in Pfad/Dateinamen. Was für einige nach einen Grossen I aussieht, muss nicht für alle Menschen dieser Welt gelten. Sei froh das du keine Chinesche Niederlassungen hast. (2000 Buchstaben in deren Alphabet). Schau dir mal Codepage und deren verwendung an. Auch bedenken solltest du das dein Windows nicht alles so zeigt wie du es erwartest. (ANSI/Unicode) https://ss64.com/nt/chcp.html

Gruß,
Peter