【问题标题】:Dos batch file titlecase and remove special charactersDos批处理文件大写并删除特殊字符
【发布时间】:2012-02-25 01:43:15
【问题描述】:
@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 它被忽略了

尝试使用"^!=" ^"!=" 但无济于事

【问题讨论】:

    标签: batch-file dos rename replace


    【解决方案1】:

    谢谢 设法对其进行排序将其添加到文件的顶部

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

    【讨论】:

      【解决方案2】:

      如果变量包含!^,则在扩展诸如%%A 之类的FOR 变量时,您不能启用延迟扩展。延迟扩展将破坏该值,因为单个 ! 被剥离,两个 ! 将其间的字符解释为变量并展开它(可能没有),^ 将被剥离,因为它用于转义!.

      您最简单的解决方案是将顶部更改为SETLOCAL DisableDelayedExpansion,并将所有延迟扩展替换为您已经在其他地方使用的CALL command %%VAR%% 技巧。 CALL 技巧比延迟扩展慢得多,所以通常我会建议切换延迟扩展。但我认为在你的情况下切换可能会变得复杂。

      我还建议您更改 :RmLoop 定义

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

      另外我不明白为什么你在调用 :RmLoop 后用自己替换空格?

      我不确定**"!="** 替代品的目的是什么。也许可以删除?

      【讨论】:

      • 也许** 周围的"!=" 只是试图突出OP 遇到问题的特定部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多