![cmd para recorrer un directorio y eliminar caracteres especiales de los nombres de archivos](https://rvso.com/image/1452258/cmd%20para%20recorrer%20un%20directorio%20y%20eliminar%20caracteres%20especiales%20de%20los%20nombres%20de%20archivos.png)
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 .bat
guión podría ayudar. Comentado con líneas ::
o rem
para una mejor comprensión.
No conozco un regexp
soporte en cmd
; por lo tanto, una cadena particular se analiza en unpersonaje por personajebase en la :convrt
subrutina (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):
- (referencia de comando)Un índice AZ de la línea de comando CMD de Windows
- (particularidades adicionales)Sintaxis de la línea de comandos de Windows CMD Shell
- (
%~G
,%~1
etc. página especial)Argumentos de la línea de comando (parámetros) - (
set "_REPLWITH=%_ALLOWED:~-1%"
etc.)Extraer parte de una variable (subcadena) - (
%variable:StrToFind=NewStr%
etc.)Editar/reemplazar variables