skript als ersatz für "[P]_[N]" im multirename-too
Moderators: Hacker, Stefan2, white
skript als ersatz für "[P]_[N]" im multirename-too
folgendes problem:
ich möchte eine grosse anzahl von files in einem verzeichnis und in allen dazugehörenden unterverzeicnissen umbenennen. der neue name soll der name des aktuellen verzeichnisses sein + '_' + der alte name.
beispiel:
/parentdir/filenname.txt
->
/parentdir/parentdir_filename.txt
aktuell mache ich das mit TC:
- search *.*
- [feed to listbox]
- select all
- multi-rename tool mit [P]_[N]
ich möchte das aber mit einem einzigen knopfdruck erledigen können.
nun habe ich in TC einen button definiert, welcher eine .bat datei aufruft und dieser den pfadnamen des source verzeichnisses übergibt (%p)
im .bat file bestimme ich zunächst den namen des verzeichnisses:
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo %pathvar%
aber nachher weiss ich nicht weiter.
probiert habe ich:
for /R %I in (*) do ren I %pathvar%_I
aber das klappt so nicht.
irgendwelche vorschläge?
danke schon mal -
rudi
ich möchte eine grosse anzahl von files in einem verzeichnis und in allen dazugehörenden unterverzeicnissen umbenennen. der neue name soll der name des aktuellen verzeichnisses sein + '_' + der alte name.
beispiel:
/parentdir/filenname.txt
->
/parentdir/parentdir_filename.txt
aktuell mache ich das mit TC:
- search *.*
- [feed to listbox]
- select all
- multi-rename tool mit [P]_[N]
ich möchte das aber mit einem einzigen knopfdruck erledigen können.
nun habe ich in TC einen button definiert, welcher eine .bat datei aufruft und dieser den pfadnamen des source verzeichnisses übergibt (%p)
im .bat file bestimme ich zunächst den namen des verzeichnisses:
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo %pathvar%
aber nachher weiss ich nicht weiter.
probiert habe ich:
for /R %I in (*) do ren I %pathvar%_I
aber das klappt so nicht.
irgendwelche vorschläge?
danke schon mal -
rudi
Welches Betriebssystem??
Bei mir gehts prima nter Xp, wobei ich noch ein paar Anführungszeichen (wg. Leerzeichen in Pfad und Namen) sowie das x für die Dateiendung eingefügt habe.
for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
sheepdog
Bei mir gehts prima nter Xp, wobei ich noch ein paar Anführungszeichen (wg. Leerzeichen in Pfad und Namen) sowie das x für die Dateiendung eingefügt habe.
for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
> Welches Betriebssystem??
w2k
> for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
mein .bat file:
cd /d %1
echo %1
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo %pathvar%
for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
liefert bei mir:
The following usage of the path operator in batch-parameter
substitution is invalid: %~nxI"
For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.
w2k
> for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
mein .bat file:
cd /d %1
echo %1
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo %pathvar%
for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
liefert bei mir:
The following usage of the path operator in batch-parameter
substitution is invalid: %~nxI"
For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.
In der Batch musst Du natürlich die '%' für die Variable verdoppeln. Ich hate das auf der Kommandozeile eingegeben.Rudi wrote:> Welches Betriebssystem??
w2k
> for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
mein .bat file:
cd /d %1
echo %1
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo %pathvar%
for /R %I in (*) do ren "%I" "%pathvar%_%~nxI"
liefert bei mir:
The following usage of the path operator in batch-parameter
substitution is invalid: %~nxI"
For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.
Also mein Vorschlag:
Code: Select all
cd /d %1
echo %1
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo %pathvar%
for /R %%I in (*) do ren "%%I" "%pathvar%_%%~nxI"
Ansonsten musst Du evtl. mal die Hilfe von w2k bemühen, das habe ich leider nicht installiert.
sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Wenn Du nicht meine Bacth kopiert hast, dann ist das Leerzeichen wahrscheinlich aus Deiner Zeile:
Da steht es hinter dem '~xna'.
bei mir ist aber ein anderes Problem aufgetaucht:
K:\test\Lots of SubDirs.tcs
K:\test\Make Dir.tcs
K:\test\PC Speaker.tcs
K:\test\Pfad_name.cmd
K:\test\unter\PC Speaker.tcs
K:\test\unter\Lots of SubDirs.tcs
K:\test\unter\Make Dir.tcs
wird zu
K:\test\test_Lots of SubDirs.tcs
K:\test\test_PC Speaker.tcs
K:\test\test_test_Make Dir.tcs
K:\test\test_test_Pfad_name.cmd
K:\test\unter\test_PC Speaker.tcs
K:\test\unter\test_Lots of SubDirs.tcs
K:\test\unter\test_test_Make Dir.tcs
Das heisst, dass das (*) bereits umbenannte Dateien bei mir noch einmal findet und ihnen den Pfad noch mal vorn einfügt. Meine Liste ist eigentlich noch länger, und da gab es dann sogar dreimal den Pfad.
Insofern halte ich
für zweckmäßiger. Allerdings erhalten die Dateien in den Unterverzeichnissen auch nur den Verzeichnisnamen vorangesetzt.
Also c:\unter\eins\Name.txt wird, wenn aus unter aufgerufen nur zu C:\unter\eins\unter_Name.txt statt zu unter_eins_name.txt
sheepdog
Code: Select all
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
bei mir ist aber ein anderes Problem aufgetaucht:
K:\test\Lots of SubDirs.tcs
K:\test\Make Dir.tcs
K:\test\PC Speaker.tcs
K:\test\Pfad_name.cmd
K:\test\unter\PC Speaker.tcs
K:\test\unter\Lots of SubDirs.tcs
K:\test\unter\Make Dir.tcs
wird zu
K:\test\test_Lots of SubDirs.tcs
K:\test\test_PC Speaker.tcs
K:\test\test_test_Make Dir.tcs
K:\test\test_test_Pfad_name.cmd
K:\test\unter\test_PC Speaker.tcs
K:\test\unter\test_Lots of SubDirs.tcs
K:\test\unter\test_test_Make Dir.tcs
Das heisst, dass das (*) bereits umbenannte Dateien bei mir noch einmal findet und ihnen den Pfad noch mal vorn einfügt. Meine Liste ist eigentlich noch länger, und da gab es dann sogar dreimal den Pfad.
Insofern halte ich
Code: Select all
cd /d %1
echo %1
@echo off
for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa
echo pathvar=%pathvar%
for /f "delims=" %%I in ('dir /s /b /a-d') do ren "%%I" "%pathvar%_%%~nxI"
Also c:\unter\eins\Name.txt wird, wenn aus unter aufgerufen nur zu C:\unter\eins\unter_Name.txt statt zu unter_eins_name.txt
sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
war tatsächelich das problem. beim kopieren wurde da irgendwie ein space angehängt. läuft jetzt.Wenn Du nicht meine Bacth kopiert hast, dann ist das Leerzeichen wahrscheinlich aus Deiner Zeile:
ist mir auch aufgefallen. verstehe nicht wieso. trat nicht immer auf.bei mir ist aber ein anderes Problem aufgetaucht:
...
K:\test\unter\test_test_Make Dir.tcs
funktioniert perfekt! vielen dank!Insofern halte ich
...
for /f "delims=" %%I in ('dir /s /b /a-d') do ren "%%I" "%pathvar%_%%~nxI"
für zweckmäßiger.
oft will ich das sogar genau so!Allerdings erhalten die Dateien in den Unterverzeichnissen auch nur den Verzeichnisnamen vorangesetzt.
Also c:\unter\eins\Name.txt wird, wenn aus unter aufgerufen nur zu C:\unter\eins\unter_Name.txt statt zu unter_eins_name.txt
ab und zu hätt ich aber auch gerne:
unter_eins_name.txt (wie du schon erwähnt hast)
meistens aber möchte ich, dass nur der name des nächstoberen verzeichnisses vorangestellt wird ([P]_[N]) also:
eins_name.txt
siehst du eine möglichkeit dazu?
rudi
Also ich hab mal ein bisschen Probiert, und habe jetzt mit zwei Batches erreicht, dass man den gesamten Pfad and den Namen kopiert, also: c:\unter\eins\test.txt zu unter_eins_test.txt. Das geht jetzt rekursiv, soweit Du willst. Probiers einfach mal aus. Das ist Batch 1:
Die kannst Du nennen wie Du willst. Die zweite Bacth muß aber 'sub.cmd' heißen, da sie von der ersten unter diesem Namen aufgerufen wird:
Wenn Du beide batches in Dein Windows-Verzeichnis kopierst, dann sollte das Umbenennen problemlos klappen. Aber mache bitte vorher ein paar tests. Nicht ,dass Du nachher 12000 Dateien zurück umbenennen musst, weil irgendwas nicht wie gewünscht ist. 
Ach ja, die Zeilen, die mit 'rem' beginnen kannst Du im prinzip auch löschen - ist nur hilfreich, wenn man mal irgend etwas ändern will.
HTH
sheepdog
Code: Select all
@echo off
set add=
rem add wird der string, der vor dem Dateinamen angefügt wird. Hier wird er erst mal
rem gelöscht.
for /F "delims=" %%a in ('cd') do set start="%%~pnxa"
rem Hier wird das Startverzeichnis ermittelt und in die Variable %Start% gespeichert.
rem Damit man später dahin zurückkehren kann.
for /f "delims=" %%a in ('cd') do set pathvar=%%~na
rem Hier wird der Name des aktuellen unterverzeichnissses ermittelt
set add="%pathvar%_"
rem und mit dem Unterstrich fürs anfügen in %add% gespeichert
for /f "delims=" %%b in ('dir /b /a-d') do ren "%%b" "%add%%%~nxb"
rem hier werden alle Dateien im Startverzeichnis umbenannt
for /f "delims=" %%b in ('dir /b /ad') do call sub.cmd "%%b"
rem Und jetzt wird nachgesehen, ob Unterverzeichnisse existieren. Wenn ja, wird für
rem jedes Verzeichnis einmal die Datei 'sub.cmd' mit dem Unterverzeichnisnamen
rem aufgerufen. (Der steht in Anführungszeichen, falls Leerzeichen enthalten sind)
Code: Select all
rem Diese batch bitte unbedingt sub.cmd nennen
@echo off
set merken=%add%
rem Als erstes wird der bisherige String zum Anfügen gemerkt. Wenn es mehrere
rem Unterverzeichnisse gibt, muss man ja immer mit diesem String beginnen.
cd %1
rem jetzt ins übergebene Unterverzeichnis
for /f "delims=" %%a in ('cd') do set pathvar=%%~na
rem Hier wird der Name des aktuellen unterverzeichnissses ermittelt
set add=%add%%pathvar%_
rem und mit dem Unterstrich fürs anfügen in "add" gespeichert
rem set add=%pathvar%_
rem Hier wird nur der das aktuelle Verzeichnis im Anfügestring gespeichert
rem Also wenn das gewünscht ist, das rem einfach entfernen ACHTUNG dieser Befehl taucht 2 mal auf
for /f "delims=" %%b in ('dir /b /a-d') do ren "%%b" "%add%%%~nxb"
rem hier werden alle Dateien im Verzeichnis umbenannt
goto zwei
rem hier wird der erste Teil der Schleife übersprungen, weil dieser Teil
rem bereits ausgeführt wurde.
:loop
rem Hier fängt die Schleife an
set add=%add%%pathvar%_
rem Der bisherige Anfüge-String wird mit dem Verzeichnisnamen und mit dem Unterstrich
rem fürs anfügen in "add" gespeichert
rem set add=%pathvar%_
rem Hier wird nur der das aktuelle Verzeichnis im Anfügestring gespeichert
rem Also wenn das gewünscht ist, das rem einfach entfernen ACHTUNG dieser Befehl taucht 2 mal auf
for /f "delims=" %%b in ('dir /b /a-d') do ren "%%b" "%add%%%~nxb"
rem hier werden alle Dateien im aktuellen Verzeicnis umbenannt
:zwei
rem hier geht es im ersten Durchlauf weiter
for /f "delims=" %%b in ( 'dir /b /ad' ) do (
rem Und jetzt wird nachgesehen, ob Unterverzeichnisse existieren. Wenn ja, wird in
rem jedes Verzeichnis gewechselt und an den Anfang der Schleife gesprungen.
cd %%b
rem ins Unterverzeichnis wechseln
for /f "delims=" %%a in ('cd') do set pathvar=%%~na
rem und dessen Namen ermitteln und in "pathvar" speichern
goto loop
rem und an den Schleifenanfang
)
cd %start%
rem wieder ins Anfangsverzeichnis wechseln
set add=%merken%
rem Und den Anfüge-String für das nächste unterverzeichnis wiederherstellen.

Ach ja, die Zeilen, die mit 'rem' beginnen kannst Du im prinzip auch löschen - ist nur hilfreich, wenn man mal irgend etwas ändern will.
HTH
sheepdog
Last edited by Sheepdog on 2004-10-16, 00:56 UTC, edited 1 time in total.
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Nach der Inspiration von drei Bier kam mir die zündende Idee, wie das ganze in einer Batch zu realisieren ist:
Also ich habe das zwar getestet, aber guck bitte lieber selbst noch mal obs funktioniert, wie gesagt, drei Bier...

sheepdog
P.S.: Das ganze muss immer noch 'sub.cmd' heissen bzw. muss die Zeile "call sub.cmd %%b" entsprechend des neuen Namens angepasst werden.
Code: Select all
@echo off
if "%1"=="" set add=
rem beim ersten aufruf wird "add" gelöscht (jeder rekursive Aufruf erfolgt mit
rem Parameter
if not "%1"=="" set merken=%add%
rem bei jedem weiteren aufruf wird "add" in "merken" zwischengespeichert
for /F "delims=" %%a in ('cd') do set start="%%~pnxa"
rem aktuellen verzeichnisnamen (verzeichnistiefe) merken
for /f "delims=" %%a in ('cd') do set pathvar=%%~na
rem in "pathvar" wird der verzeichnisname des aktuellen verzeichnisses gespeichert
rem if not "add"=="" set add=%add%%pathvar%_
rem if "add"=="" set add=%pathvar%_
rem beim ersten Durchlauf wird nur der Verzeichnisname angehängt, bei jedem weiteren
rem wird das aktuelle Verzeichnis hinzugefügt
set add=%pathvar%_
rem hier wird nur der jeweilige aktuelle Verzeichnisname vorn hinzugefügt, nicht
rem jedoch dder gesamte Pfad
for /f "delims=" %%b in ('dir /b /a-d') do ren "%%b" "%add%%%~nxb"
rem hier werden die Dateien im verzeichnis umbenannt
for /f "delims=" %%b in ( 'dir /b /ad' ) do (
rem gucken ob es unterverzeichnisse gibt
cd %%b
rem wen ja, reinwechseln
call sub.cmd %%b
rem und diese batch rekursiv aufrufen
if not "%1"=="" set add=%merken%
rem wenn es nicht der erste Aufruf war, dann den gespeicherten
rem "add" string wieder herstellen
cd %start%)
rem und in das startverzeichnis wechseln


sheepdog
P.S.: Das ganze muss immer noch 'sub.cmd' heissen bzw. muss die Zeile "call sub.cmd %%b" entsprechend des neuen Namens angepasst werden.
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Update: In der folgenden Zeile muss man die Variable %%~pna in Anführungsziechen setzen, da man sonst Probleme bekommt, wenn der Pfad Leerzeichen enthält.
sheepdog
Ich habe das in beiden posts getan, aber falls jemand das ganze schon mal heruntergeladen hat, sollte er das ändern.for /F "delims=" %%a in ('cd') do set start="%%~pnxa"
sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Lass mich raten:Du startest die Batch mit einem Button und der Staqrtpfad ist nicht leer. Also: Startpfad ist leer und auch Parameter ist leer.
Ausserdem benennt die Batch nicht das ausgewählte Verzeichns, sondern das Verzeichnis in dem Du Dich befindest (und alle darunter liegenden).
Tut mir leid, dass ich das nicht gut genug dokumentiert habe, das lag wohl an der späten Stunde.
Ich hoffe Du hattest nicht zuviel Mühe, das ganze wieder rückgängig zu machen. Mit dem MUT geht das eigentlich recht flott, wenn man [strg]+ benutzt und dann jeweils die Verzeichnisnamen + '_' benutzt.
Ich hoffe, dass das ganze jetzt so arbeitet, wie Du Dir das vorstellst. Wenn Du die Batch übrigens anders nennen möchtest, dann musst Du nur auch den neuen Dateinamen in der Zeile
an Statt sub.cmd eintragen. Die Batch ruft sich wie gesagt selbst auf.
sheepdog
Ausserdem benennt die Batch nicht das ausgewählte Verzeichns, sondern das Verzeichnis in dem Du Dich befindest (und alle darunter liegenden).
Tut mir leid, dass ich das nicht gut genug dokumentiert habe, das lag wohl an der späten Stunde.

Ich hoffe Du hattest nicht zuviel Mühe, das ganze wieder rückgängig zu machen. Mit dem MUT geht das eigentlich recht flott, wenn man [strg]+ benutzt und dann jeweils die Verzeichnisnamen + '_' benutzt.
Ich hoffe, dass das ganze jetzt so arbeitet, wie Du Dir das vorstellst. Wenn Du die Batch übrigens anders nennen möchtest, dann musst Du nur auch den neuen Dateinamen in der Zeile
Code: Select all
call sub.cmd %%b
sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams