VBS脚本重命名文件时如何实现同名文件自动覆盖
VBS批量移除文件名前导空格时自动覆盖同名文件的实现方案
问题原因
原脚本调用Scripting.FileSystemObject的MoveFile方法实现重命名,该方法默认不允许覆盖已存在的目标文件,一旦去前导空格后的目标文件名在目录下已存在,就会直接抛出运行时错误。另外原脚本使用+拼接字符串路径,在VBS语法中+遇到非字符串类型时会触发隐式类型转换,存在路径拼接错误的隐患。
调整逻辑
- 遍历文件时先判断文件名是否存在前导空格,无前置空格的文件直接跳过,避免无意义的文件操作
- 用
BuildPath方法拼接文件路径,替代手动拼接\的写法,规避路径斜杠缺失/重复的问题 - 执行重命名前先校验目标路径是否存在同名文件,若存在则先删除已有同名文件(支持强制删除只读文件),再执行重命名操作,实现覆盖效果
修改后完整代码
Set objFSO = CreateObject("Scripting.FileSystemObject") strFolderName = "\\CORP***\***Share\Common\RFI Validation Outputs" Set objFolder = objFSO.GetFolder(strFolderName) Set colFiles = objFolder.Files For Each objFile in colFiles strOldName = objFile.Name strNewName = LTrim(strOldName) ' 无前置空格的文件跳过处理 If strOldName <> strNewName Then strOldPath = objFSO.BuildPath(strFolderName, strOldName) strNewPath = objFSO.BuildPath(strFolderName, strNewName) ' 目标同名文件存在时先删除 If objFSO.FileExists(strNewPath) Then ' 第二个参数True表示强制删除只读属性文件,不需要可改为False objFSO.DeleteFile strNewPath, True End If ' 执行重命名 objFSO.MoveFile strOldPath, strNewPath End If Next
注意事项
- 脚本运行前请先备份目标文件夹内的文件,避免误操作导致数据丢失
- 运行脚本的账号需要对目标共享文件夹拥有读取、写入、删除权限,否则会触发权限不足错误
- 若不需要覆盖只读文件,可将
DeleteFile方法的第二个参数改为False
内容的提问来源于stack exchange,提问作者Rob_4142
相关产品推荐
相关产品推荐

