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
以下批处理尝试统一文件夹名称,
但是由于你的例子中的差异,它不能完美地工作
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!"
)