我试图通过VBA递归重命名文件夹中的所有文件。
Sub FileNameCleaner()
'***************************************************************************
'Purpose: Update the filename to the latest valuation date.
'Author: Justin Sun
'Date: July 12th, 2018
'Inputs: nil
'Outputs: nil
'***************************************************************************
Dim valdate, prvdate, myline As String
valdate = "1811"
prvdate = "1810"
myline = "&& for /r %i in (*" & prvdate & "*) do ren ""%i"" ""*" & valdate & "*"" "
mydate = "C:\Users\j1sunx\Desktop\test\"
Call Shell("cmd /k cd " & mydate & myline, vbNormalNoFocus)
End Sub
逻辑很简单,使用通配符将上个月替换为当前月份。该方法可以在其他月份正常工作,但在第11个月失败。上面显示的代码尝试将日期从1810更新为1811。但是在我的测试用例中。它将我的文件名201810.txt
更改为20181811.txt
。
预先感谢您的帮助。
答案 0 :(得分:3)
为什么不起作用:
我们分解一下命令:
您的命令翻译为ren "C:\Users\j1sunx\Desktop\test\201810.txt" "*1811*"
。
This page说明如何评估*1811*
:
* c匹配从当前位置到最后出现c的所有源字符(区分大小写的贪婪匹配),并附加 将字符集与目标名称匹配。如果找不到c,则 源中所有剩余的字符都被追加,然后是c 我知道的唯一情况是Windows文件模式 匹配区分大小写
带有1的第一个*将匹配字符串的最后1个字符:所以C:\Users\j1sunx\Desktop\test\20181
。
然后我们添加810
,它们是没有特殊含义的简单字符。
*在sourceMask的末尾-将所有剩余的字符从源追加到目标。如果已经在源代码的末尾,则什么也不做。
然后文件名的末尾
总计:C:\Users\j1sunx\Desktop\test\20181810.txt
关键是第一个*
非常贪婪。
替换解决方案:
由于您已经在使用VBA,因此建议您使用Dir和Name之类的vba语句/函数,或FileSystemObject
解决方案示例(可能需要改进)
ChDir mydate
myline = Dir("*" & prvdate & "*")
While myline <> vbNullString
Name myline As Replace(myline, prvdate, valdate)
myline = Dir()
Wend