Windows批处理文件执行条件重命名

时间:2016-07-31 23:29:45

标签: windows batch-file rename

我有几百个以特定方式命名的文件需要通过替换第13个字符来重命名,具体取决于第6个字符是什么。我已经无法创建能够读取第6个字符的内容,但不能单独使用并仅更改第13-15个字符。

文件格式如下。

<ul class='topnav'>
   <li><a href='index.php'><img class='menu' src='images/CMmenu.gif' height='19px'></a></li>
    <li class='dropdown'>
        <a href='#' class='dropbtn'>Certifications</a>
            <div class='dropdown-content'>
            <a href='index.php?id=all'>--View All Departments--</a>
            <other links here....using PHP>
            </div>
    </li>
    <li class='dropdown'>
        <a href='#' class='dropbtn'>Employees</a>
            <div class='dropdown-content'>
            <a href='view_employees.php'>View/Edit</a>
            <a href='add_employee.php'>Add</a>
            </div>
    </li>
    <li class='dropdown right'>
     <a href='#' class='dropbtn'>My Account</a>
    <div class='dropdown-content'>
    <a href='user_settings.php'>Account Settings</a>
    <a href='logout.php'>Logout</a>
  </div>
    </li>
    <li class='dropdown right'>
    <a href='#' class='active dropbtn'>Admin</a>
    <div class='dropdown-content'>
    <a href='view_cert_type.php'>View/Edit Certification Types</a>
    <a href='add_cert_type.php'>Add Certification Type</a>
    <a href='view_depts.php'>View/Edit Departments</a>
    <a href='add_dept.php'>Add Department</a>
    <a href='admin_users.php'>View/Edit Users</a>
    <a href='add_user.php'>Add User</a>
    <a href='org_settings.php'>Organization Settings</a>
      </div>
    </li>
</ul>

脚本需要读取第6个字符(A,B或C)并将 XYZ 替换为 AAA BBB CCC 取决于信件。文件名的其余部分需要显示相同的内容。

2016-A124578_XYZ_moretext.ext
2016-B345654_XYZ_morerandomtext.ext
2016-B235689_XYZ_moredifferenttext.ext
2016-A789945_XYZ_moretext.ext
2016-C547821_XYZ_moretext.ext

是否可以制作这种脚本? RegEx是尝试它的最好方法吗?

4 个答案:

答案 0 :(得分:1)

Set Str=2016-B345654_XYZ_morerandomtext.ext
Echo %str% %str:~0,13% %str:~5,1%%str:~5,1%%str:~5,1% %str:~16%

我已在其中放置空格以显示哪些部分可以执行操作,然后删除它们。

请参阅set /?寻求帮助。

答案 1 :(得分:1)

我找到了一种更简单的方法来实现这一目标,因为知道文件的格式总是如上所述。

只需在批处理文件中使用它......

REN 2016-A*.ext 2016-A??????_AAA_*.ext
REN 2016-B*.ext 2016-B??????_BBB_*.ext
REN 2016-C*.ext 2016-C??????_CCC_*.ext

答案 2 :(得分:0)

更简单: - )

for %A in (A B C) @do ren 2016-%A*.ext *_%A%A%A*

如果从批处理文件运行,则将百分比加倍:

@for %%A in (A B C) @do ren 2016-%%A*.ext *_%%A%%A%%A*

有关此RENAME工作原理的信息,请参阅How does the Windows RENAME command interpret wildcards?

但是,代码假定文件夹中的所有文件都遵循该模式。如果文件与不应重命名的模式不匹配怎么办?简化过滤器存在重命名不应重命名的文件的风险。

使用源掩码可能会更精确:

for %A in (A B C) @do ren 2016-%A??????_XYZ_*.ext *_%A%A%A*

但仍有两个潜在的问题:

  • ?匹配0或1个字符,因此它保证不会超过6个字符,但可能少于6个
  • ?匹配任何字符,而不仅仅是数字。

你可以使用与FINDSTR结合的DIR / B非常具体:

for %A in (A B C) @do for %F in (dir /b /a-d 2016-%A*.ext^|findstr /ric:"2016-%A[0-9][0-9][0-9][0-9][0-9][0-9]_XYZ_*\.ext"') do ren "%F" *_%A%A%A*

但还有另一种简单而精确的解决方案 - a regular expression rename utility called JREN.BAT。它是纯脚本(混合批处理/ JScript),可以在任何Windows机器上本机运行,而无需任何第三方exe文件。

jren "^(2016-([ABC])\d{6}_)XYZ(_.*\.ext)$" "$1$2$2$2$3" /i

答案 3 :(得分:0)

这个更冗长,但我觉得更容易阅读和修改:

@Echo off
setlocal enabledelayedexpansion
for /f %%f in ('dir *.ext /b') do (
  set fName=%%f
  set fTag=!fName:~5,1!
  set fPrefix=!fName:~0,13!
  set fSuffix=!fName:~16!
  set fReplace=!fName:~13,3!
  if /i "!fTag!" EQU "A" set fReplace=AAA
  if /i "!fTag!" EQU "B" set fReplace=BBB
  if /i "!fTag!" EQU "C" set fReplace=CCC

  ren !fName! !fPrefix!!fReplace!!fSuffix!
)