skript als ersatz für "[P]_[N]" im multirename-too

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
Rudi
Junior Member
Junior Member
Posts: 29
Joined: 2003-02-12, 14:41 UTC

skript als ersatz für "[P]_[N]" im multirename-too

Post by *Rudi »

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
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

Versuchs mal damit:

for /R %I in (*) do ren %I %pathvar%_%~nI

oder

for /R %I in (*) do ren %~nI %pathvar%_%~nI

hilft das?

sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Rudi
Junior Member
Junior Member
Posts: 29
Joined: 2003-02-12, 14:41 UTC

Post by *Rudi »

sheepdog: danke für den versuch - leider klappts nicht.

for /R %I in (*) do ren %I %pathvar%_%~nI
->
The following usage of the path substitution is invalid: %~nI

for /R %I in (*) do ren %~nI %pathvar%_%~nI
-->
The following usage of the path substitution is invalid: %~nI
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

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
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Rudi
Junior Member
Junior Member
Posts: 29
Joined: 2003-02-12, 14:41 UTC

Post by *Rudi »

> 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.
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

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.
In der Batch musst Du natürlich die '%' für die Variable verdoppeln. Ich hate das auf der Kommandozeile eingegeben.
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"
wobei %I den Filenamen mit komplettem Pfad ergibt, %%~nxI ist dann der Dateiname (n) und die Erweiterung (x) vom Namen %I .

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
Rudi
Junior Member
Junior Member
Posts: 29
Joined: 2003-02-12, 14:41 UTC

Post by *Rudi »

funktioniert im prinzip - danke!

kleines problem:
zwischen dem verzeichnisname und dem "_" wird ein space eingefügt...
also [P] _[N]
statt [P]_[N]

rudi
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

Wenn Du nicht meine Bacth kopiert hast, dann ist das Leerzeichen wahrscheinlich aus Deiner Zeile:

Code: Select all

for /f "delims=" %%a in ('cd') do set pathvar=%%~nxa 
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

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"
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
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Rudi
Junior Member
Junior Member
Posts: 29
Joined: 2003-02-12, 14:41 UTC

Post by *Rudi »

Wenn Du nicht meine Bacth kopiert hast, dann ist das Leerzeichen wahrscheinlich aus Deiner Zeile:
war tatsächelich das problem. beim kopieren wurde da irgendwie ein space angehängt. läuft jetzt.
bei mir ist aber ein anderes Problem aufgetaucht:
...
K:\test\unter\test_test_Make Dir.tcs
ist mir auch aufgefallen. verstehe nicht wieso. trat nicht immer auf.
Insofern halte ich
...
for /f "delims=" %%I in ('dir /s /b /a-d') do ren "%%I" "%pathvar%_%%~nxI"
für zweckmäßiger.
funktioniert perfekt! vielen dank!
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
oft will ich das sogar genau so!
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
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

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:

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)
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:

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.
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
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
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

Nach der Inspiration von drei Bier kam mir die zündende Idee, wie das ganze in einer Batch zu realisieren ist:

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
Also ich habe das zwar getestet, aber guck bitte lieber selbst noch mal obs funktioniert, wie gesagt, drei Bier... ;) :lol:

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
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

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.
for /F "delims=" %%a in ('cd') do set start="%%~pnxa"
Ich habe das in beiden posts getan, aber falls jemand das ganze schon mal heruntergeladen hat, sollte er das ändern.

sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Rudi
Junior Member
Junior Member
Posts: 29
Joined: 2003-02-12, 14:41 UTC

Post by *Rudi »

danke! nun hab ich sub.cmd laufen lassen.
problem: umbenennt wird bei mir nicht das im TC angewählte verzeichnis (und darunter), sondern das in dem sub.cmd liegt.

rudi
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

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. :oops:


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 
an Statt sub.cmd eintragen. Die Batch ruft sich wie gesagt selbst auf.

sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Post Reply