cmd для обхода каталога и удаления специальных символов из имен файлов

-1

Я ищу сценарий командной строки, который может перебрать все файлы в нужном каталоге и заменить любые специальные символы в именах файлов пробелами. Я застрял на логике замены для специальных символов. Нужно заменить что-либо, не входящее в (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789).

for /r C:\yourdirectorypath %F in (*) do replace(filename, regexp, ' ') 
Джаред
источник
1
Специальные символы? В чем особенное уважение ? Пожалуйста, отредактируйте свой вопрос и предоставьте полный список из них.
JosefZ
Я добавил список персонажей, которых хотел сохранить. Так что все, кроме тех, которые должны быть заменены.
Джаред

Ответы:

0

Следующий .batскрипт может помочь. Комментарии ::или remстроки для лучшего понимания.

Я не знаю regexpподдержки в cmd; следовательно, определенная строка анализируется на символьной основе в :convrtподпрограмме (обратите внимание на ложный результат, если %в строке, предоставленной для разбора, присутствует какой-либо знак процента).

@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

Выходной образец. Обратите внимание на %случай (вдумчивый пэчворк):

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

Ресурсы (требуется чтение, не полностью):

JosefZ
источник