Batch file 弱化模式匹配条件

Batch file 弱化模式匹配条件,batch-file,Batch File,对于我文件夹的名称,我有如下名称 Fringe.S04 Fringe S01 From.Dusk.Till.Dawn_S01.ITA Fear_The_Walking_Dead_S01 Fear_The.Walking_Dead_S01 Gossip Girl s2 Gossip.Girl_s2 Hawaii_Five_0_S05 Hawaii.Five_0.S01 Hawaii Five-0 S05 Cape_Wrath_Pack_2 Cape Wrath Pack 1 C Era Una

对于我文件夹的名称,我有如下名称

Fringe.S04
Fringe S01
From.Dusk.Till.Dawn_S01.ITA
Fear_The_Walking_Dead_S01
Fear_The.Walking_Dead_S01
Gossip Girl s2
Gossip.Girl_s2

Hawaii_Five_0_S05
Hawaii.Five_0.S01
Hawaii Five-0 S05
Cape_Wrath_Pack_2
Cape Wrath Pack 1
C Era Una Volta
C'Era Una Volta
C' Era Una Volta
我希望忽略名称之间的标点符号

.
_
'
因为我希望文件夹名称的模式匹配是这样工作的

夏威夷五号0=夏威夷五号0
夏威夷五号0.S01=夏威夷五号0
夏威夷五人组S05=夏威夷五人组0
害怕行尸走肉。害怕行尸走肉 害怕行尸走肉=害怕行尸走肉
刘海.S04=刘海
条纹S01=条纹

我实际使用的代码是

:: Q:\Test\2018\07\27\SO_51539948.cmd
@Echo off
Pushd %1
For /d %%A in (*) do For /f "delims=" %%B in (
  'Dir /B "*%%~nxA*" 2^>Nul '
) do If "%%~nxA" NEQ "%%~nxB" Move "%%~fB" "%%~fA\" 2>&1>>Nul
Popd

以下批处理尝试统一文件夹名称,
但是由于你的例子中的差异,它不能完美地工作

  • .ita扩展作为最后一个元素不适合该方案
  • 第二次运行时,
    Hawaii Five 0
    将减少为
    Hawaii Five
  • 编辑:重命名文件夹后效果稍好 样本输出:

    > tree
    Auflistung der Ordnerpfade für Volume RamDisk
    Volumeseriennummer : 5566-7788
    A:.
    └───Videos
        ├───C Era Una Volta
        │   ├───C' Era Una Volta
        │   └───C'Era Una Volta
        ├───Cape Wrath Pack
        │   ├───Cape Wrath Pack 1
        │   └───Cape_Wrath_Pack_2
        ├───Fear The Walking Dead
        │   ├───Fear_The.Walking_Dead_S01
        │   └───Fear_The_Walking_Dead_S01
        ├───Fringe
        │   ├───Fringe S01
        │   └───Fringe.S04
        ├───From.Dusk.Till.Dawn_S01.ITA
        ├───Gossip Girl
        │   ├───Gossip Girl s2
        │   └───Gossip.Girl_s2
        └───Hawaii Five 0
            ├───Hawaii Five-0 S05
            ├───Hawaii.Five_0.S01
            └───Hawaii_Five_0_S05
    

    在此方法中,插入其他分隔符非常简单:

    编辑:修改代码以满足注释中给出的新要求

    @echo off
    setlocal EnableDelayedExpansion
    
    pushd %1
    
    set "digits=0123456789"
    for /F "delims=" %%l in ('dir /B /AD') do for /F "tokens=1-9 delims='-._ " %%a in ("%%l") do (
       set "out="
       set "end="
       for %%t in (%%a %%b %%c %%d %%e %%f %%g %%h %%i) do (
          if "!digits:%%t=!" neq "%digits%" set "end=1"
          set "t=%%t"
          for /F %%n in ("!t:~1,1!") do (
             if /I "!t:~0,1!" equ "S" if "!digits:%%n=!" neq "%digits%" set "end=1"
          )
          if not defined end set "out=!out! %%t"
       )
       if /I "!out!" equ " Hawaii Five" set "out= Hawaii Five 0"
       move "%%l" "!out:~1!"
    )
    

    在这个新的代码中,“夏威夷五号”的名字被正确地作为特例管理。

    如果不统一不起作用的分隔符,将事情自动化到完美的开销将很快超过Maulal labour。一种方法是使用
    for/F
    和标点符号作为分隔符,如:
    for/F“tokens=1-10 delims=。'%%A In('dir/B/A:D')do@echo/%%A%%B%%C%%D%%E%%F%%G%%H%%I%%J
    (假设不超过10个单词);但这不会删除
    S###
    后缀…批处理似乎不会启动。我按了,但文件夹不会移动,请看原因:批处理希望通过基本文件夹作为参数1作为(我的)样本;-)我刚把它改成使用批处理父文件夹,在none is supplied.mm.。看起来非常好的LotPings!但是为什么从.dash.Till.Dawn\u S01.ITA中的
    未被移动到从dash.Till.Dawn文件夹中?可能是因为有两个不同的符号
    \uu
    ?啊..也许是为了.ITA?因为它与结尾的系列不匹配,如果你从.dash.Till.Dawn.itau S01重命名为
    ,它应该也能工作。也感谢你的回答mm…我按了这一批,但它会立即消失,而不会移动先前存在的文件夹中的文件夹,查看等价条件,我不需要重命名和合并文件夹名称,而是将它们移动到预先存在的文件夹名称。请帮助我理解你的建议。在你的问题中,你没有说有预先存在的文件夹。请参阅我的编辑。请注意,新代码要求您提供一个参数来指定工作文件夹,方法与原始示例代码相同…mm。。如果我不创建预先存在的文件夹,是否也可以处理?嗯..非常有趣..因为如果可能的话,我更喜欢没有预先存在的文件夹的脚本解决方案。@由您决定哪种解决方案最符合您的要求,但在这里,带有尾随0/1的系列将作为(子)文件夹消失。@LotPings:如果您谈论的是“Cape_Wrath_Pack_2”和“Cape Wrath Pack 1”转到同一子文件夹,然后这是编程行为(正如我理解的这个请求)。要取消此行为,只需删除
    if“!digits:%%t=!”neq“%digits%”设置“end=1”
    行即可。事实上,这样做也修复了“Hawaii Five 0”的特殊情况,因此最后一个相关的
    if
    也可以删除。。。
    @echo off
    setlocal EnableDelayedExpansion
    
    pushd %1
    
    set "digits=0123456789"
    for /F "delims=" %%l in ('dir /B /AD') do for /F "tokens=1-9 delims='-._ " %%a in ("%%l") do (
       set "out="
       set "end="
       for %%t in (%%a %%b %%c %%d %%e %%f %%g %%h %%i) do (
          if "!digits:%%t=!" neq "%digits%" set "end=1"
          set "t=%%t"
          for /F %%n in ("!t:~1,1!") do (
             if /I "!t:~0,1!" equ "S" if "!digits:%%n=!" neq "%digits%" set "end=1"
          )
          if not defined end set "out=!out! %%t"
       )
       if /I "!out!" equ " Hawaii Five" set "out= Hawaii Five 0"
       move "%%l" "!out:~1!"
    )