我有几百个以特定方式命名的文件需要通过替换第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是尝试它的最好方法吗?
答案 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!
)