Batch file 批处理脚本-重命名文件,删除变量前缀和后缀
我在一个文件夹中有几个文件,名称如下Batch file 批处理脚本-重命名文件,删除变量前缀和后缀,batch-file,Batch File,我在一个文件夹中有几个文件,名称如下 "prefix (S-N 12RE3123) suffix.pdf" 我想将它们重命名为just“12RE3123.pdf”,删除前缀和后缀。问题是前缀和后缀的长度/字符都不同,因此我不能仅仅通过删除第一个/最后一个xx字符来重命名,而必须使用唯一的通用性,即只有“S-N”后面的括号内的字符才是要保留的字符 有一种特殊情况,其中一些序列号被命名为WD-12RE3123,我还需要删除WD-。如果我必须手工操作,没有很多这样的操作,所以这不会是世界末日,但是让
"prefix (S-N 12RE3123) suffix.pdf"
我想将它们重命名为just“12RE3123.pdf”
,删除前缀和后缀。问题是前缀和后缀的长度/字符都不同,因此我不能仅仅通过删除第一个/最后一个xx字符来重命名,而必须使用唯一的通用性,即只有“S-N”
后面的括号内的字符才是要保留的字符
有一种特殊情况,其中一些序列号被命名为WD-12RE3123
,我还需要删除WD-
。如果我必须手工操作,没有很多这样的操作,所以这不会是世界末日,但是让它自动化会很好。我想在删除前缀/后缀后执行一个if语句,检查前3个字符是否匹配WD-
,然后删除那些if true,但我不确定实现是否正确
我还是批处理或vbscript方面的新手,所以我想知道这两种方法是否都可以实现。Batch使用“REN
”方法重命名文件,但由于最终名称取决于当前名称,因此我不确定如何设置分隔符或如何实现此目的
非常感谢您的帮助。@ECHO Off
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/a-d”%sourcedir%\*(*)*)**。'
)做(
对于/f“tokens=1,2delims=()”%%c IN(“%%a”)DO(
对于/f“令牌=1-3delims=-”%%m IN(“%%d”)DO(
如果“%%o”==”(ECHO(REN”%sourcedir%%\%%a“%%n%%~xa)
)否则(
ECHO(REN“%sourcedir%\%%a”“%%o%%~xa”
)
)
)
)
后藤:EOF
您需要更改sourcedir
的设置以适应您的环境
所需的REN命令仅用于测试目的。ECHO
ed。验证命令正确后,将ECHO(REN
更改为REN
以实际重命名文件
将与掩码“()”匹配的每个文件名应用于%%a
使用(
和)
作为分隔符进行标记,以便括号中的部分位于%%d
使用-
和
作为分隔符重新标记,以便S-N
模式的所需数字为%%o
,而WD-
模式的所需数字为%%N
显示重命名行
注意:如果前缀
部分不包含括号,且括号中的部分与描述完全相同,则此操作应有效。@ECHO Off
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/f“delims=”%%a IN(
'dir/b/a-d”%sourcedir%\*(*)*)**。'
)做(
对于/f“tokens=1,2delims=()”%%c IN(“%%a”)DO(
对于/f“令牌=1-3delims=-”%%m IN(“%%d”)DO(
如果“%%o”==”(ECHO(REN”%sourcedir%%\%%a“%%n%%~xa)
)否则(
ECHO(REN“%sourcedir%\%%a”“%%o%%~xa”
)
)
)
)
后藤:EOF
您需要更改sourcedir
的设置以适应您的环境
所需的REN命令仅用于测试目的。ECHO
ed。验证命令正确后,将ECHO(REN
更改为REN
以实际重命名文件
将与掩码“()”匹配的每个文件名应用于%%a
使用(
和)
作为分隔符进行标记,以便括号中的部分位于%%d
使用-
和
作为分隔符重新标记,以便S-N
模式的所需数字为%%o
,而WD-
模式的所需数字为%%N
显示重命名行
注意:如果
前缀
部分不包含括号,且括号中的部分与描述完全相同,则此操作应有效。以下是您请求的简单解决方案。它依赖于以下事实:
部分本身不包含任何括号前缀
或(
()
可能)后缀
- 序列号本身不包含任何括号
或(
)
- 没有重复的序列号,也与删除潜在的
字符串有关WD-
ECHO
命令以实际重命名文件):
工作原理:
- 第一部分指定文件夹位置、文件模式和要删除的字符串(在提取了
中的部分后);根据需要调整值()
- 有几个嵌套的
循环;最外层的循环只是迭代与给定模式匹配的所有文件(它基本上读取和解析应用于给定文件的for
命令的输出,并通过返回的项目循环;与标准dir
循环相反,此for
方法确保在循环开始迭代之前读取整个文件夹,这在修改枚举文件夹内容时是必需的t不喜欢我们在这里重命名文件;另请参见关于该问题的内容);for/F
- 下一个
循环提取感兴趣的文件名部分,即第一对括号之间的所有内容,并将其存储在变量for/F
中;此循环仅对每个文件迭代一次;name
- 是另一个
循环,它遍历for
变量;字符串中的所有项
- <代码>如果子句检查当前代码“<代码>字符串< /COD> >是否发生在
No.<代码>值的最开始处;如果是,则将其删除,否则,这只是一个安全查询,因为序列号可能也包含一个给定的<代码>字符串项在中间或A中。 @echo off setlocal EnableExtensions DisableDelayedExpansion rem Set constants here: set "LOCATION=.\test" set "PATTERN=*.pdf" set STRINGS="S-N " "WD-" cd /D "%LOCATION%" for /F "eol=| delims=" %%K in ('dir /B "%PATTERN%"') do ( for /F "eol=| tokens=2 delims=()" %%L in ("%%~nK") do ( set "NAME=%%L" setlocal EnableDelayedExpansion for %%J in (%STRINGS%) do ( if "!NAME!"=="%%~J!NAME:*%%~J=!" ( set "NAME=!NAME:*%%~J=!" ) ) ECHO ren "%%~fK" "!NAME!%%~xK" endlocal ) ) endlocal exit /B
@echo off setlocal EnableExtensions DisableDelayedExpansion rem Set constants here: set "LOCATION=.\test" set "PATTERN=*.pdf" set "FILTER=(S-N [^()][^()]*)" set "IDENTIFYER=S-N " set STRINGS="WD-" cd /D "%LOCATION%" for /F "eol=| delims=" %%K in (' dir /B "%PATTERN%" ^| findstr /I /R /C:"%FILTER%" ') do ( set "NAME=%%K" setlocal EnableDelayedExpansion set "NAME=!NAME:*(%IDENTIFYER%=!" for /F "eol=| tokens=1 delims=)" %%L in ("!NAME!") do ( setlocal DisableDelayedExpansion set "NAME=%%L" setlocal EnableDelayedExpansion for %%J in (%STRINGS%) do ( if "!NAME!"=="%%~J!NAME:*%%~J=!" ( set "NAME=!NAME:*%%~J=!" ) ) ECHO ren "%%~fK" "!NAME!%%~xK" endlocal endlocal ) endlocal ) endlocal exit /B
jren "^.*\((?:S-N (?:WD-)?)(.+?)\).*" "$1.jpg" /fm *.jpg
- <代码>如果子句检查当前代码“<代码>字符串< /COD> >是否发生在
- 是另一个
- 下一个