![cmd для циклического прохождения каталога и удаления специальных символов из имен файлов](https://rvso.com/image/1452258/cmd%20%D0%B4%D0%BB%D1%8F%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20%D0%B8%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2%20%D0%B8%D0%B7%20%D0%B8%D0%BC%D0%B5%D0%BD%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2.png)
Я ищу скрипт командной строки, который может перебрать все файлы в нужном каталоге и заменить все специальные символы в именах файлов на пробелы. Я застрял на логике замены для специальных символов. Хочу заменить все, чего нет в (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789 ).
for /r C:\yourdirectorypath %F in (*) do replace(filename, regexp, ' ')
решение1
Следующий .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"
Ресурсы(обязательно к прочтению, не полностью):
- (справочник команд)Индекс AZ командной строки Windows CMD
- (дополнительные особенности)Синтаксис командной строки оболочки Windows CMD
- (
%~G
и%~1
т.д. специальная страница)Аргументы командной строки (параметры) - (
set "_REPLWITH=%_ALLOWED:~-1%"
и т. д.)Извлечь часть переменной (подстроку) - (
%variable:StrToFind=NewStr%
и т. д.)Редактировать/Заменить переменную