REN方法的困惑

时间:2018-12-04 09:04:22

标签: excel vba cmd

我试图通过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

预先感谢您的帮助。

1 个答案:

答案 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,因此建议您使用DirName之类的vba语句/函数,或FileSystemObject

解决方案示例(可能需要改进)

ChDir mydate
myline = Dir("*" & prvdate & "*")
While myline <> vbNullString
    Name myline As Replace(myline, prvdate, valdate)
    myline = Dir()
Wend