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
    循环相反,此
    for/F
    方法确保在循环开始迭代之前读取整个文件夹,这在修改枚举文件夹内容时是必需的t不喜欢我们在这里重命名文件;另请参见关于该问题的内容);
    • 下一个
      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