Ich suche nach einem Befehlszeilenskript, das alle Dateien in einem gewünschten Verzeichnis durchläuft und alle Sonderzeichen in den Dateinamen durch Leerzeichen ersetzt. Ich komme mit der Ersetzungslogik für die Sonderzeichen nicht weiter. Ich möchte alles ersetzen, was nicht in (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789) steht.
for /r C:\yourdirectorypath %F in (*) do replace(filename, regexp, ' ')
Antwort1
Das nächste .bat
Skript könnte helfen. Zum besseren Verständnis mit ::
oder Zeilen kommentieren.rem
Ich kenne keine regexp
Unterstützung in cmd
; daher wird eine bestimmte Zeichenfolge auf einemZeichen für ZeichenBasis in der :convrt
Subroutine (beachten Sie das falsche Ergebnis, wenn %
in einer zur Analyse bereitgestellten Zeichenfolge ein Prozentzeichen vorhanden ist).
@ECHO OFF >NUL
@SETLOCAL enableextensions
:: all `echo` lines for debugging purposes only (remove no sooner than debugged)
:::: set "_ALLOWED=abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789"
:::: set "_REPLWITH=-"
:: next setting suffice as '%variable:StrToFind=NewStr%' is case insensitive
set "_ALLOWED=ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789-"
:: note a blank space in the above line (with no full stop)
:: note last character of %_ALLOWED% value used to be the replace one as follows
set "_REPLWITH=%_ALLOWED:~-1%"
:: a filename sample (no extension) to be converted
:: containing some batch-exceptional characters
SET "_sample=AÄaá^ cč^DĎ(1!)&°~!.foo~bar"
call :convrt _ELPAMS _sample
:: next lines show an intentional usage (with no subfolder recursion)
pushd "D:\bat\Unusual Names"
:: create a particular file of an unusual name: echo _sample "%_sample%">"%_sample%.txt"
for /F "delims=" %%G in ('dir /B "A*.txt"') do (
echo(
set "_sample=%%~nG"
call :convrt _ELPAMS _sample
call :output "for debugging purposes only"
)
popd
ENDLOCAL
goto :eof
Next :convrt subroutine accepts two parameters (passed by reference):
%1 (output) variable name
%2 (input) variable name
The subroutine will return
- any `~` tilde character unchanged "it's not a bug, it's a feature";
- wrong result for any `%` percent sign present in a file name.
:convrt
SETLOCAL enableextensions disabledelayedexpansion
set "__auxAll=%~2"
call set "__auxAll=%%%~2%%"
echo sub %~2 "%__auxAll%"
set "__result="
:loop
if "%__auxAll%"=="" goto :endconvrt
set "__auxOne=%__auxAll:~0,1%"
set "__auxAll=%__auxAll:~1%"
call set "__changed=%%_ALLOWED:%__auxOne%=%%"
if not "%__changed%"=="%_ALLOWED%" (
set "__result=%__result%%__auxOne%"
) else (
set "__result=%__result%%_REPLWITH%"
)
goto :loop
:endconvrt
echo sub %~1 "%__result%"
ENDLOCAL&call set "%~1=%__result%"
goto :eof
:output
rem echo for _sample "%_sample%"
echo for _ELPAMS "%_ELPAMS%"
goto :eof
AusgabeBeispiel. Beachten Sie den %
Fall (ein durchdachtes Patchwork):
==>D:\bat\SU\921338.bat
sub _sample "AÄaá^ cč^DĎ(1!)&°~!.foo~bar"
sub _ELPAMS "A-a-- c--D--1----~--foo~bar"
sub _sample "AÄaá^ cč^DĎ(1!)&°~!.foo~bar"
sub _ELPAMS "A-a-- c--D--1----~--foo~bar"
for _ELPAMS "A-a-- c--D--1----~--foo~bar"
sub _sample "AÄzž^ yýS%OS%Š%%OS%%(%1!)&°~%%G!^%~2.foo~bar"
sub _ELPAMS "A-z-- y-S%OS%-%%OS%%-%1----~%%G--%~2-foo~bar"
for _ELPAMS "A-z-- y-SWindows_NT-%OS%-_ELPAMS----~%G--_sample-foo~bar"
Ressourcen(Pflichtlektüre, unvollständig):
- (Befehlsreferenz)Ein AZ-Index der Windows CMD-Befehlszeile
- (weitere Besonderheiten)Befehlszeilensyntax der Windows CMD-Shell
- (
%~G
,%~1
usw. Spezialseite)Befehlszeilenargumente (Parameter) - (
set "_REPLWITH=%_ALLOWED:~-1%"
usw.)Einen Teil einer Variablen extrahieren (Teilzeichenfolge) - (
%variable:StrToFind=NewStr%
usw.)Variable bearbeiten/ersetzen