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

@Echo Off
SetLocal EnableDelayedExpansion
Set _ScrFldr=%~dp0
PushD %_ScrFldr%
:: You can add other extensions to do multiple file types
For /F "Delims=" %%A In ('Dir /A-D /B *.txt') Do (
:: The space after the = is needed so we can Proper Case the first word
Set _FileName= %%A
:: Remove (, replace ( with _, replace - with _-_ , 
:: replace _ with space, and a first pass at removing multiple spaces
For %%I In ("%%~xA=" ".= " ")=" "(=_" "-=_-_" "_= " " = " **"!="**) Do Call Set 
"_FileName=%%_FileName:%%~I%%"
:: Now make it all lower case, and another pass at removing multiple spaces
For %%I In ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" " = ") Do Call Set "_FileName=%%_FileName:%%~I%%"
:: Proper Case and again remove multiple spaces
For %%I In (" a= A" " b= B" " c= C" " d= D" " e= E" " f= F" " g= G" " h= H" " i= I" " j= J" " k= K" " l= L" " m= M" " n= N" " o= O" " p= P" " q= Q" " r= R" " s= S" " t= T" " u= U" " v= V" " w= W" " x= X" " y= Y" " z= Z" " = ") Do Call Set "_FileName=%%_FileName:%%~I%%"
:: Last check for multiple spaces
Call :RmLoop
Set _FileName=!_FileName: = !
:: Remove any trailing underscore
Set _FileName=!_FileName:_%%~xA=%%~xA!
Ren "%%A" "!_FileName:~1!%%~xA"
)
PopD
Goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::
:RmLoop
Call Set "_FileName=%%_FileName: = %%"
Echo !_FileName!|Findstr /C:" ">Nul
If !ErrorLevel!==0 Goto RmLoop

Что это должно сделать, так это удалить определенные символы из имен файлов и заголовков файлов, т.е.

some_filename = Some Filename
filename number 2 = Filename Number 2

Большинство из них прекрасно работают, например, смены случая и удаления лишних пробелов и подчеркиваний

Но у меня возникают проблемы со специальными символами, такими как ! (10 строк в коде) если имя файла называется ie file! 2 он игнорируется

попробовал использовать "^!=" ^"!=", но безрезультатно

2 ответа

Вы не можете включить Delayed Expansion при расширении переменной FOR, как %% A, если переменная содержит ! или ^. Отсроченное расширение испортит значение, потому что один ! лишен, два ! интерпретируют символы между ними как переменную и расширяют ее (вероятно, до нуля), а ^ будет лишен, потому что он используется для выхода !.

Самое простое решение - изменить верхнюю часть на SETLOCAL DisableDelayedExpansion и заменить все замедленное расширение трюком CALL command %%VAR%%, который вы уже используете в другом месте. Трюк CALL намного медленнее, чем замедленное расширение, поэтому обычно я бы рекомендовал отложить замедленное расширение. Но я думаю, что переключение может осложниться в вашем случае.

Я также предлагаю вам изменить ваше: определение RmLoop

:RmLoop
Call Set "_FileName2=%%_FileName: = %%"
If "%_FileName2%" neq "%_FileName%" (
 set "_FileName=%_FileName2%"
 goto :RmLoop
)

Также я не понимаю, почему вы заменяете пространство собой после вызова: RmLoop?

Я не уверен, что пытается заменить **"!="**. Возможно, это можно удалить?


Спасибо Чтобы отсортировать его, добавьте это в начало файла.

ps "!=" должен был просто отметить, где это происходит.

@Echo Off
SetLocal DisableDelayedExpansion
 For /F "Tokens=*" %%J In ('Dir /B *.txt^|Findstr "!"') Do Call :Renamee "%%J"
..
..
..
..
..
::This at the very bottom
:Renamee
Set _FileTemp=%~1
Set _FileTemp=%_FileTemp:!=%
Ren "%~1" "%_FileTemp%"

licensed under cc by-sa 3.0 with attribution.