Batch file 运行两个vbs脚本进行备份的批处理文件
我有一个系统,它运行一个旧的FoxPro程序,生成8个字符长的DBF文件。我们每天备份程序文件夹,但在下午5点,程序生成了如此多的垃圾dbf,这是一个麻烦。我只想在备份脚本中设置一个del*.dbf,但是有几个dbf的名称中有字母是运行程序所必需的 文件位于F:\Clean This中\ 任何以数字命名的.dbf文件都需要删除 任何按字母顺序命名的.dbf文件都应该单独保存Batch file 运行两个vbs脚本进行备份的批处理文件,batch-file,vbscript,Batch File,Vbscript,我有一个系统,它运行一个旧的FoxPro程序,生成8个字符长的DBF文件。我们每天备份程序文件夹,但在下午5点,程序生成了如此多的垃圾dbf,这是一个麻烦。我只想在备份脚本中设置一个del*.dbf,但是有几个dbf的名称中有字母是运行程序所必需的 文件位于F:\Clean This中\ 任何以数字命名的.dbf文件都需要删除 任何按字母顺序命名的.dbf文件都应该单独保存 Set objFSO = CreateObject("Scripting.FileSystemObject") objSt
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,没有)
建议和改进将不胜感激 使用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
您的检查失败,因为您在应该使用Mid()的地方使用了Left():
即使这样,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
使用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
您的检查失败,因为您在应该使用Mid()的地方使用了Left():
即使这样,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
我终于让它工作了,下面是最终的结果。它工作得非常好,高层和其他人对它印象深刻,它比我们正在备份的程序的内置实用程序工作得更好。得分
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
我终于让它工作了,下面是最终的结果。它工作得非常好,高层和其他人对它印象深刻,它比我们正在备份的程序的内置实用程序工作得更好。得分
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
我尝试过IsNumeric(),但由于有.dbf扩展名,所以它会出错。Num被放置在移动到数组中的下一个字母中,而不是打印出n个字母。另外,delete带来了一个不匹配的错误:/if语句中没有称为数组的collide语句,我很抱歉。第2行字符1,错误:需要对象的“goFS”代码800A1A8来源:Microsoft VBScript运行时错误那又怎样?只需使用您自己的FSO。什么是一个好的删除方法?出于某种原因,Kill和Delete对我不起作用。我尝试了IsNumeric(),但由于扩展名为.dbf,所以它会出错。Num被放置在移动到数组中的下一个字母中,而不是打印出n个字母。另外,delete带来了一个不匹配的错误:/if语句中没有称为数组的collide语句,我很抱歉。第2行字符1,错误:需要对象的“goFS”代码800A1A8来源:Microsoft VBScript运行时错误那又怎样?只需使用您自己的FSO。什么是一个好的删除方法?出于某种原因,杀戮和删除对我不起作用。