Batch file 运行两个vbs脚本进行备份的批处理文件

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

我有一个系统,它运行一个旧的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,没有)

建议和改进将不胜感激

使用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。什么是一个好的删除方法?出于某种原因,杀戮和删除对我不起作用。