Dateien umbenennen klappt nicht richtig
Hallo Leute,
habe folgende Batch geschrieben:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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...
Dankbar
Biber
</OT>
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
21 Kommentare
Neuester Kommentar
guten Morgen @watchdogg
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!!!"
Gruß Phil
Feedback please
... 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
Möglichkeit1:
oder umgekehrt:
Möglichkeit2:
oder umgekehrt:
Möglichkeit3:
Das was Miyamoto geschrieben hat auf alle anwenden ;)
echo %dateiname% |find "xx" >NUL 2>NUL || echo Dateiname enthält kein "xx"
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"
if "%dateiname%" neq "%dateiname:xx=%" echo Dateiname enthält "xx"
Möglichkeit3:
Das was Miyamoto geschrieben hat auf alle anwenden ;)
@ @miniversum
Das habe ich ja extra so geschrieben damit:
egal ob dieses Verzeichnis noch ein Unterverzeichnis mit weiteren Umzubennenenden (hach schweres Wort - jedenfalls zum schreiben! gruß an Biber) Dateien enthält.
oder meintest Du
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
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.
oder meintest Du
Zeile 05. if defined ORDNER if not "ORDNER:~-1"=="\" set "ORDNER=%ORDNER%\"
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
@pieh-ejdsch
[OT]
[/OT]
Grüße
bastla
[OT]
Umzubennenenden (hach schweres Wort - jedenfalls zum schreiben! gruß an Biber)
Damit solltest Du seine Sammlung tatsächlich noch vergrößert haben ... [/OT]
Grüße
bastla
@ @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.
äää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
schreiben
xx im PreName werden auch durch # ersetzt.
war ja ohnehin bei Dir so.
Gruß Phil
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=#%
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
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
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.
[/edit]
*.* 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=#%"
%~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.
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.
Ich habe ja lediglich das
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.
%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.
@ @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!
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!
@miniversum
Grüße
bastla
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 ...Das stört aber nicht, da Windows, bzw. die cmd das trotzdem richtig macht.
Grüße
bastla