4 Stimmen

Skript zum Entfernen von Sonderzeichen aus Dateinamen

Ich habe einen Ordner mit einer großen Anzahl von Dateien. Viele der Dateinamen enthalten "%"- und/oder "&"-Zeichen.

e.g. Test&doc.pdf
e.g Test%doc.doc

Gibt es eine schnelle Möglichkeit, die Zeichen "%" und "&" mit einer Windows-Batch-Datei, einem VBScript oder etwas Ähnlichem zu entfernen?

Für jede Hilfe sind wir Ihnen sehr dankbar.

Danke.

3voto

indiv Punkte 16498

Hier erfahren Sie, wie Sie dies im Stapelverfahren tun können (falls Sie neugierig sind). Die große Einschränkung ist, dass es nicht funktioniert, wenn Sie Dateinamen mit mehr als einem Prozentzeichen haben, weil die Shell sie zu einer Variablen expandiert. Ich weiß nicht, wie man das sofort beheben kann.

Es beginnt in dem Verzeichnis, in dem sich das Skript befindet, und arbeitet rekursiv über alle Unterverzeichnisse.

@echo off

setlocal enabledelayedexpansion
for /f "usebackq delims=" %%N in (`dir /s /b`) do (
  set var=%%~nN
  set var=!var:^&= !
  set var=!var:%%= !

  if not "!var!"=="%%~nN" (
    if not exist "%%~dpN!var!%%~xN" (
      echo "%%N" --^> "!var!%%~xN"
      ren "%%N" "!var!%%~xN"
    ) else (
      echo File "!var!%%~xN" ^(from %%N^) already exists.
    )
  )
)

Gibt z.B. eine Ausgabe wie diese aus:

C:\batch\schar>schar
"C:\batch\schar\Test%doc.doc" --> "Test doc.doc"
"C:\batch\schar\Test%doc.pdf" --> "Test doc.pdf"
File "Test doc.pdf" (from C:\batch\schar\Test&doc.pdf) already exists.
"C:\batch\schar\subdir\FILE%here" --> "FILE here"

3voto

jeb Punkte 74279

@indiv

Wenn jemand eine Stapellösung ohne Zeichenbeschränkungen entwickeln kann, wäre ich sehr beeindruckt.

Okay, ich werde es versuchen.

@echo off

setlocal DisableDelayedExpansion
for /f "usebackq delims=" %%N in (`dir /s /b`) do (
  set var=%%~nxN
  setlocal EnableDelayedExpansion
  set "org=!var!"
  set "var=!var:&= !"
  set "var=!var:%%= !"

  if not "!var!"=="!org!" (
    if not exist "%%~dpN!var!" (
      echo "!org!" --^> "!var!"
      ren "!org!" "!var!"
    ) else (
      echo File "!var!" ^(from !org!^) already exists.
    )
  )
  endlocal
)

Der Trick besteht darin, die verzögerte Expansion umzuschalten, denn die Expansion von for-Schleifen-Vars (%%N) sollte ohne verzögerte Expansion erfolgen, sonst verliert man die Ausrufezeichen und bekommt Probleme mit Carets. Aber um die Strings zu bearbeiten und zu ändern, sollte man die verzögerte Expansion verwenden.

Aber warum? Die Antwort liegt im Verständnis der Phasen des Batch-Parsers.

Ich habe versucht, es hier zu erklären. wie-geht-der-Windows-Befehlsinterpreter-cmd-exe-parse-scripts

2voto

Jules Punkte 1372

Ich habe das schnell zusammengebastelt und nicht getestet, aber dieses VBScript sollte den Zweck erfüllen. Sagen Sie mir, wenn Sie ausgefallene Dinge wie rekursives Ersetzen von Ordnern usw. benötigen.

Set objFSO = CreateObject("Scripting.FileSystemObject")

'Your folder here
objStartFolder = "X:\MYFOLDER"

Set objFolder = objFSO.GetFolder(objStartFolder)
Set regEx = New RegExp

'Your pattern here
regEx.Pattern = "[&%]" 

Set colFiles = objFolder.Files
For Each objFile in colFiles
    objFile.Rename(regEx.Replace(objFile.Name, "")
Next

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X