我有一个运行旧FoxPro程序的系统,它生成8个字符长的DBF文件。我们每天都会对程序文件夹进行备份,但是在下午5点,程序生成了很多这样的垃圾dbf,这是一个令人讨厌的问题。我只想在备份脚本中设置del * .dbf,但是有一些dbf在其名称中包含运行程序所需的字母。
文件位于F:\ Clean This \
任何带数字标题的.dbf文件都需要删除
任何按字母顺序标题的.dbf文件都应该单独存放
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "F:\Clean This\"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
collide = "ABCEDFGHIJKLMNOPQRSTUVWXYZ"
For Each objFile in colFiles
If UCase(objFSO.GetExtensionName(objFile.name)) = "DBF" Then
num = 1
For num = 1 to 26 'find files with names start with # 0-9
If Left(objFile.Name,1) = Left(collide,num) Then
Wscript.Echo "Save " & objFile.Name
Else If int(Left(objFile.Name,1)) > 0 Then
Wscript.Echo "Delete!"
End IF
End If
Next
End If
Next
正如你可以告诉If语句可以做得更好,我不确定如何更好地解决它。两个Wscript.Echo命令只是占位符,因为如果还有什么我找不到合适的删除函数,它可以在dos环境中工作(我已经尝试过kill,no)。
非常感谢建议和改进!
答案 0 :(得分:1)
使用IsNumeric()检查仅由数字组成的文件名:
>> For Each sN In Split("abc 123 1O1 101")
>> If IsNumeric(sN) Then
>> WScript.Echo "delete", sN
>> Else
>> WScript.Echo "keep", sN
>> End If
>> Next
>>
keep abc
delete 123
keep 1O1
delete 101
您的检查失败,因为您使用Left(),您应该使用Mid():
>> collide = "ABCEDFGHIJKLMNOPQRSTUVWXYZ"
>> num = 5
>> WScript.Echo Left(collide,num)
>> WScript.Echo Mid(collide,num,1)
>>
ABCED
D
即便如此,Left(objFile.Name,1)
也只会查看文件名的第一个字符。
更新(wrt评论):
将IsNumeric()应用于基本名称:
Dim oFile
For Each oFile In goFS.GetFolder("..\testdata\17817161").Files
WScript.Stdout.Write oFile.Name
If "dbf" = LCase(goFS.GetExtensionName(oFile.Name)) Then
If IsNumeric(goFS.GetBaseName(oFile.Name)) Then
WScript.Stdout.WriteLine " delete"
Else
WScript.Stdout.WriteLine " keep"
End If
Else
WScript.Stdout.WriteLine " ignore"
End If
Next
输出:
123.dbf delete
123.txt ignore
abc.dbf keep
答案 1 :(得分:0)
我终于让它运转了,这就是最终结果。它运行得非常好,高层建筑和其他设备相当令人印象深刻,它比我们备份的程序的内置实用程序更好。得分!
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "..\System Folder"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set DirFiles = objFolder.Files
Dim oFile
For Each objFile in DirFiles
If "dbf" = LCase(objFSO.GetExtensionName(objFile.Name)) Then
If IsNumeric(objFSO.GetBaseName(objFile.Name)) Then
objFSO.DeleteFile(objFile)
End If
End If
Next