watchdogg
Goto Top

Dateien umbenennen klappt nicht richtig

Hallo Leute,

habe folgende Batch geschrieben:

set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:

for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%\*.*') do rename %%i "%ORDNER%_%%~nxi"  

Klappt soweit auch, der Großteil wird umbenannt, aber bei genau 38 Dateien kommt Syntaxfehler und er benennt sie nicht um.
Die Dateien unterscheiden sich aber nicht von den anderen, seltsam?!?
Kann mir bitte jemand sagen, wo das Problem liegt?

Zusätzlich:

Wie könnte ich jetzt, falls die Batch mehrmals ausgeführt wird, eine Prüfung einbauen die bereits umbenannte Dateien nicht verändert an die Anderen aber wie bisher den "Ordnernamen" + "_" als Präfix setzt.

Kann mir bitte jemand mal grob die richtige Syntax erklären für:

Alle Dateinamen auf spezielle Zeichenkette z.b.: xx prüfen und falls gefunden diese Zeichenkette in ein anderes Zeichen z.B.: # umbenennen.

Vielen Dank,

MfG watchdogg
Kommentar vom Moderator Biber am 27.06.2009 um 23:59:33 Uhr
<OT> Habe den Beitrag erst heute gefunden.
Deshalb etwas verspätet danke an pieh-edsch und bastla und...
>set /a rgc+=1
406

Dankbar
Biber
</OT>

Content-ID: 118900

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

bstefan82
bstefan82 24.06.2009 um 09:37:23 Uhr
Goto Top
Hi,

schon mal

rename "%%i" "%ORDNER%_%%~nxi" probiert? (Eventuell Leerzeichen im Dateinamen?)
Miyamoto
Miyamoto 24.06.2009 um 09:46:06 Uhr
Goto Top
Hi,
für deine Zusatzaufgabe kannst du mal folgendes Probieren

set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:

for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%\*.*') do (  

if not exist "%ORDNER%_%%~nxi"(  
	rename "%%i" "%ORDNER%_%%~nxi"  
	)
)
watchdogg
watchdogg 24.06.2009 um 09:46:29 Uhr
Goto Top
Vielen Dank erstmal bstefan82,

funktioniert super, manchmal ist man richtig beschränkt.

Hast du noch Tipps für meine anderen Fragen?

MfG watchdogg
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 10:03:51 Uhr
Goto Top
guten Morgen @watchdogg

... kommt Syntaxfehler und er benennt sie nicht um.
da sind wie immer die Gänsefüschen Schuld.
Es wurde grad eine Suchmeldung danach ausgegeben.
Am besten schreibe ich mal eine Deklaration über Gänsefüschen...
...mal sehen.

Immer wenn zu Übergebende Variablen spezielle Sonderzeichen oder Leerzeichen enthalten muss die Weiterverarbeitung mit Umgebenden Gänsefüschen erfolgen.
Im Zweifelsfall diese immer "Drumherumbasteln".

So diese Batch bennnt dir Deine Files um egal ob da noch weitere Files in tieferen Ordnern auch umbennant werden müssen.
Und überspringt alle Files welche am Anfang mit
Unterordnername_
beginnen heraus.

"Ungetestet!!!"
echo off & setlocal enabledelayedexpansion
set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:
::Falls bei der Eingabe vom Unterverzeichnis der Backslash fehlt wird dieser angefügt.
if defined ORDNER if not "ORDNER:~-1"=="\" set "ORDNER=%ORDNER%\"  
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%*.*') do call :lastDir "%%i"  
echo Fertig! & pause
goto :eof
:: Herausfiltern des letzten Unterordners!
:lastDir
set "DirNr=1" & set "lastDir=%~p1" & set "file=%~ni1" & set "lastDir=%~p1"  
:filter
if not "%lastDir:~-%DirNr%,1"=="\" (set /a DirNr + = 1 & goto :filter )  
set /a FileNr = 1 + %DirNr%

if "!lastDir:~-%DirNr%,-1!_"=="!file:~%FileNr%!" rename "%%~1" "%ORDNER%_%%~nx1"  
goto :eof

Gruß Phil

Feedback please
watchdogg
watchdogg 24.06.2009 um 10:16:29 Uhr
Goto Top
Vielen Dank an euch alle,

werde es umgehend testen.


Habt ihr dafür auch noch ne Lösung?

Alle Dateinamen auf spezielle Zeichenkette z.b.: xx prüfen und falls gefunden diese Zeichenkette in ein anderes Zeichen z.B.: # umbenennen.

MfG watchdogg
Miyamoto
Miyamoto 24.06.2009 um 11:16:58 Uhr
Goto Top
hi,
wenn du den Dateinamen schon in einer Variable hast kannst du folgendes machen
%Dateinamen:xx=#%

gruß Miyamoto
miniversum
miniversum 24.06.2009 um 11:35:37 Uhr
Goto Top
Kleiner Verbesserungsvorschlag:
Wenn du die Zeile 6 so abänderst kannst Du dir die Prüfung nach den \ am ende vom %PFAD% spaaren:
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%\%ORDNER%\*.*') do call :lastDir "%%i"
miniversum
miniversum 24.06.2009 um 11:41:59 Uhr
Goto Top
Möglichkeit1:
echo %dateiname% |find "xx" >NUL 2>NUL || echo Dateiname enthält kein "xx"
oder umgekehrt:
echo %dateiname% |find "xx" >NUL 2>NUL && echo Dateiname enthält "xx"

Möglichkeit2:
if "%dateiname%" equ "%dateiname:xx=%" echo Dateiname enthält kein "xx"
oder umgekehrt:
if "%dateiname%" neq "%dateiname:xx=%" echo Dateiname enthält "xx"

Möglichkeit3:
Das was Miyamoto geschrieben hat auf alle anwenden ;)
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 12:30:57 Uhr
Goto Top
@ @miniversum
Kleiner Verbesserungsvorschlag:

Das habe ich ja extra so geschrieben damit:
Wie könnte ich jetzt, falls die Batch mehrmals ausgeführt wird, eine Prüfung einbauen die bereits umbenannte Dateien nicht verändert an die Anderen aber wie bisher den "Ordnernamen" + "_" als Präfix setzt.
eben diese schon Umbenannten Dateien nicht nochmal umbenannt werden,
egal ob dieses Verzeichnis noch ein Unterverzeichnis mit weiteren Umzubennenenden (hach schweres Wort - jedenfalls zum schreiben! gruß an Biber) Dateien enthält.
face-wink

oder meintest Du
Zeile 05. if defined ORDNER if not "ORDNER:~-1"=="\" set "ORDNER=%ORDNER%\"
was ist wenn dann am ende vom Ordner der Backslash eingegeben wird ohne Prüfung

Datei umbenennen nach Ordner Unterstrich Dateiname und schon einmal umbenannte Dateien auslassen
echo off & setlocal enabledelayedexpansion
set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:
set /p forsign=Welche(s) Zeichen soll entfernt werden:
if not defined forsign set /p inputsign=Welches Zeichen soll dafür eingesetzt werden:
::Falls bei der Eingabe vom Unterverzeichnis der Backslash fehlt wird dieser angefügt.
if defined ORDNER if not "ORDNER:~-1"=="\" set "ORDNER=%ORDNER%\"  
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%*.*') do call :lastDir "%%i"  
echo Fertig! & pause
goto :eof
:: Herausfiltern des letzten Unterordners!
:lastDir
set "DirNr=1" & set "lastDir=%~p1" & set "file=%~n1" & set "lastDir=%~p1"  
:filter
if not "%lastDir:~-%DirNr%,1"=="\" (set /a DirNr + = 1 & goto :filter )  
set /a FileNr = 1 + %DirNr%
if "!lastDir:~-%DirNr%,-1!_"=="!file:~%FileNr%!" rename "%%~1" "%ORDNER%_!file:%forsign%=%inputsign%!%~x1"  
goto :eof
bastla
bastla 24.06.2009 um 12:46:10 Uhr
Goto Top
@pieh-ejdsch
[OT]
Umzubennenenden (hach schweres Wort - jedenfalls zum schreiben! gruß an Biber)
Damit solltest Du seine Sammlung tatsächlich noch vergrößert haben ... face-wink
[/OT]

Grüße
bastla
watchdogg
watchdogg 24.06.2009 um 13:02:00 Uhr
Goto Top
Also ich hab das jetzt so gebastelt:

@echo off & setlocal
echo  -----------------------------------------------------------------
echo.                                                                    
echo   np.bat - Umbenennen von CAD-Dateien in c:\plan.assyst auf PC011   
echo.                                                                  
echo  -----------------------------------------------------------------
echo.
echo.

set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:

rem 1.Schleife
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%\*.*') do (  
    if "%%~nxi"=="%ORDNER%*.*" (  
     rename "%%i" "%ORDNER%_%%~nxi" ))  

rem 2.Schleife
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%\*.*') do (  
    find "xx" >NUL 2>NUL | rename %%~nxi %%~nxi:xx=#% )  

pause	

...und es funktioniert nichts.
Ich krieg das irgendwie nicht hin, weil ich die Logik vom Syntax nicht verstehe.

Das ist so abstrakt - bei PHP, C++, JAVA, Delphi usw. habe ich keine Probleme, aber hier tu ich mich richtig schwer.

Gibts gute Websites mit verständlichen Tutorials? In der Windows oder DOS Hilfe fehlts mir an konkreten Beispielen.

Achso, könntet ihr mein kleines Programm mal überarbeiten, oder weitere Tipps geben?

MfG watchdogg
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 13:52:14 Uhr
Goto Top
@ @watchdogg

tja so ist das wenn man die Backslashes vergisst und die Tips zur Prüfung darauf ins Nirwana verbannt.
mit der integrierten Backslashprüfung brauchst Du deinen Backslash im weiteren Code nicht mehr einfügen.
oder gar darauf achten.
Zeile 15.    if "%%~nxi"=="%ORDNER% \ *.*" (

Zeile 20.    find "xx" >NUL 2>NUL | rename %%~nxi %%~nxi:xx=#%
ääähmmm Du willst in ForschleifenVariablen Zeichenfolgen ersetzen!
Das geht nicht. Das geht nur bei Variablen die Zur Darstellung Umgebende % oder ! benutzen!
Dazu must Du erst die FOR- oder BATCHerweiterungs-Variablen in eine UMGEBUNGSVariable setzen.
Warum das so ist weis nur der gute Bill allein.


ich find ja die komplette 2. Schleife Überflüssig und würde wenn du auf verzögerte Variablenerweiterung Verzichtest

@echo off & setlocal
echo  -----------------------------------------------------------------
echo.                                                                    
echo   np.bat - Umbenennen von CAD-Dateien in c:\plan.assyst auf PC011   
echo.                                                                  
echo  -----------------------------------------------------------------
echo.
echo.
set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%\*.*') do call :rename "%%i"  
pause
goto :eof
:rename
set FILE=%~n1
if "%%~nxi"=="%ORDNER%*.*" rename "%~1" "%ORDNER:xx=#%_%FILE:xx=#%%~x1"  
goto :eof

schreiben
xx im PreName werden auch durch # ersetzt.
war ja ohnehin bei Dir so.

Gruß Phil
watchdogg
watchdogg 24.06.2009 um 14:13:20 Uhr
Goto Top
Danke Phil,

aber das tut so nicht.
Es werden keine Ordnernamen vor den Dateinamen gesetzt und auch keine xx durch # ersetzt !?!

Ich verzweifel noch.

MfG watchdogg
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 15:13:32 Uhr
Goto Top
ach das kommt davon wenn ichs nur kopiere und net neu schreibe!

*.* ist die Ursache in Zeile 16. und wie solles auch sein genau der fehlende Backslash.
und vllt noch etwas mehr.

ich schreib jetzt nicht nochmal eine andere Variante! es führen ja viele Wege nach Rom...
oder zur richtig umbenannten Datei.

So hier Die

Datei umbenennen zu Ordnername Unterstrich Dateiname mit Unterstrich und entfernen / ersetzen von Zeichen im Dateiname und auslassen schon Umbenannter Dateien.bat


@echo off & setlocal enabledelayedexpansion
echo  -----------------------------------------------------------------
echo.                                                                    
echo   np.bat - Umbenennen von CAD-Dateien in c:\plan.assyst auf PC011   
echo.                                                                  
echo  -----------------------------------------------------------------
echo.
echo.
set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:
if defined ORDNER if not "ORDNER:~-1"=="\" set "ORDNER=%ORDNER%\"  
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%*.*') do call :lastDir "%%i"  
pause
goto :eof
:lastDir
set "DirNr=1" & set "lastDir=%~p1" & set "file=%~n1" & set "lastDir=%~p1"  
:filter
if not "%lastDir:~-%DirNr%,1"=="\" (set /a DirNr + = 1 & goto :filter )  
set /a FileNr = 1 + %DirNr%
if "!lastDir:~-%DirNr%,-1!_"=="!file:~%FileNr%!" rename "%%~1" "%ORDNER%_!file:xx=#!%~x1"  
goto :eof

Ich hoffe mal das die so geht.

[OT]
@bastla
gibt es denn schon eine Offizielle Liste von Biber von den verschiedenen Varianten?
[/OT]

Gruß Phil

[edit]
hier nochmal die modifizierte Von @Miyamoto ohne delayedexpansion und ohne Schnörkel und nur umbenennung im Angegebenen Unterverzeichnis und ersetzen von xx mit # im Dateiname.

set "PFAD=c:\np\"  
set /p ORDNER=Bitte das Unterverzeichnis eingeben:
for /f "delims=" %%i in ('dir /s /b /a-d %PFAD%%ORDNER%\*.*') do call :rename "%%i"  
pause
goto :eof
:rename
set "FILE=%~nx1"  
if not exist "%ORDNER%_%~nx1" rename "%~1" "%ORDNER%_%FILE:xx=#%"  
[/edit]
bastla
bastla 24.06.2009 um 15:29:18 Uhr
Goto Top
@phil
[OT]
Bibers Zählung stand jedenfalls zuletzt etwa bei 403 ... face-smile
[/OT]

Grüße
bastla
watchdogg
watchdogg 24.06.2009 um 15:52:55 Uhr
Goto Top
Ich will ja nicht nerven, aber Phils Lösung ergibt:

Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~ni1" & set "lastDir=%~p1" .
Geben Sie call /? oder for /? ein um herauszufinden welche Formate gültig sind.
":lastDir
"ist syntaktisch an dieser Stelle nicht verarbeitbar.

Sorry ABER:

call /? oder for /? == momentan noch sowas von "BAHNHOF"....

Mfg watchdogg
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 16:10:30 Uhr
Goto Top
%~ni1" & set "lastDir=%~p1"
wenn die Variable nicht mit ! oder % abschliesst wird diese als BatchparameterVariable oder FORschleifen Variable erkannt die zahlen 0 -9 kommen da am ende der Variable nur für Batchparameter in Frage.
mit dem i wird eine Erweiterung eingestellt die es aber so nicht gibt. Nur p n f x und so weiter steht im Help für FOR.

ja das ist beim umschreiben nicht richtig rausgegeangen mein Radiergummi hat net richtig funkioniert.

guck mal oben im vorletzten Thread habs gefixt.
watchdogg
watchdogg 24.06.2009 um 16:12:11 Uhr
Goto Top
Vielen Dank für eure Mühen,

funktioniert jetzt.

MfG watchdogg
miniversum
miniversum 24.06.2009 um 18:15:29 Uhr
Goto Top
Ich habe ja lediglich das
%PFAD%%ORDNER%
in
%PFAD%\%ORDNER%
verändert.
Für den Fall das %PFAD% keine \ am Ende hat wird das ja durch das zwischen den Variabeln gesetzt, z.b. so: C:\Pfad\Ordner
Für den Fall das %PFAD% bereits ein \ am Ende hat wird das ja durch das zwischen den Variabeln gesetzte quasi Verdoppelt, z.b. so: C:\Pfad\\Ordner
Das stört aber nicht, da Windows, bzw. die cmd das trotzdem richtig macht. Drum ist hier auch keine Prüfung notwendig dann.
pieh-ejdsch
pieh-ejdsch 24.06.2009 um 18:46:50 Uhr
Goto Top
@ @miniversum

echt?
Hab ich gar net gewusst das mit dem backslash - dass sich mehrere zu einem machen.
nur das Dateien und Ordner NICHT mit
/ \ : * ? " < > und |
erstellt werden bzw es wird eine Fehlermeldung ausgeben.

danke für den Tipp.... bin ja auch nicht allwissend

@ @watchdogg
Bitte setze den Beitrag auf gelöst!
Danke!
bastla
bastla 24.06.2009 um 21:21:24 Uhr
Goto Top
@miniversum
Für den Fall das %PFAD% bereits ein \ am Ende hat wird das ja durch das zwischen den Variabeln gesetzte quasi Verdoppelt, z.b. so: C:\Pfad\\Ordner
Das stört aber nicht, da Windows, bzw. die cmd das trotzdem richtig macht.
Allerdings sollte dann in %PFAD% kein Root-Verzeichnis (also zB "C:\") stehen ...

Grüße
bastla