DOS пакетный файл titlecase и удалить специальные символы - PullRequest
1 голос
/ 02 февраля 2012
@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 строк внизу кода), если имя файла, например, файл!2 игнорируется

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

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Невозможно включить отложенное расширение при расширении переменной FOR, например %% A, если переменная содержит ! или ^. Задержанное расширение повредит значение, потому что один ! будет удален, два ! будут интерпретировать символы между ними как переменную и расширят его (вероятно, до нуля), а ^ будет удален, потому что он используется для экранирования !.

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

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

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

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

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

0 голосов
/ 06 февраля 2012

Спасибо Удалось отсортировать это добавить это в начало файла

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%"
...