cmd para recorrer un directorio y eliminar caracteres especiales de los nombres de archivos

cmd para recorrer un directorio y eliminar caracteres especiales de los nombres de archivos

Estoy buscando una secuencia de comandos de línea de comando que pueda recorrer todos los archivos en un directorio deseado y reemplazar los caracteres especiales en los nombres de los archivos con espacios. Estoy atascado en la lógica de reemplazo de los caracteres especiales. Buscando reemplazar cualquier cosa que no esté en (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789).

for /r C:\yourdirectorypath %F in (*) do replace(filename, regexp, ' ') 

Respuesta1

El siguiente .batguión podría ayudar. Comentado con líneas ::o rempara una mejor comprensión.

No conozco un regexpsoporte en cmd; por lo tanto, una cadena particular se analiza en unpersonaje por personajebase en la :convrtsubrutina (tenga en cuenta el resultado falso si hay algún %signo de porcentaje presente en una cadena proporcionada para analizar).

@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

Producciónmuestra. Tenga en cuenta el %caso (un mosaico reflexivo):

==>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"

Recursos(lectura obligatoria, incompleta):

información relacionada