在 Tortoise SVN 中删除带有 VBA 的文件

remove files with VBA in Tortoise SVN

我需要在 Tortoise SVN 环境中通过 Excel VBA 删除(删除)文件(可能还有文件夹)。但是我改变了我的命令,它总是删除文件所在的文件夹。

调用 obj.Run("TortoiseProc.exe /command:remove /pathfile:""C:\someSVNpath3.txt"" /closeonend:1 ")

调用 obj.Run("TortoiseProc.exe /command:remove /pathfile:""C:\someSVNpath\Folder"" /closeonend:1 ")

我也试图在循环中列出文件并删除,但随后出现错误:Subversion reported an error: Previous operation has not finished; 运行 'cleanup' 如果被打断了。请执行'Cleanup'命令。

此外,即使我设法列出循环中的文件并删除,提交操作也找不到任何要提交的文件。

Dim obj, FSO, folder, file As Object
Dim b, c, p(1 To 2) As String

Set obj = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

b = "C:\someSVNlocation\folder\"

With ThisWorkbook.Sheets("Equity")
    p(1) = "loc1"
    p(2) = "loc2"
    
    For i = 1 To 2
        If p(i) <> "" Then
            c = b & "\" & p(i) & "\"
            Set folder = FSO.GetFolder(c)
            For Each file In folder.Files
                d = c & file.Name
                Call obj.Run("TortoiseProc.exe /command:remove /path:""" & d & """ /closeonend:1 ")
                d = ""
            Next file
        End If
    Next
    
    Call obj.Run("TortoiseProc.exe /command:commit /path:""" & p(1) & """ * """ & p(2) & """ ")

End With

我认为你的主要问题是你没有在等待 shell 到 return。这些操作可能 运行 异步并且 运行 相互重叠。这是一种竞争条件。

我通过在 .Run 命令末尾添加 , 1, True 来解决这个问题。 1是一个intWindowStyle,“激活并显示一个window。如果window被最小化或最大化,系统会将其恢复到原来的大小和位置。一个应用程序第一次显示 window 时应指定此标志。"

末尾的 TruebWaitOnReturn 指示脚本是否应等待程序完成执行后再继续执行脚本中的下一条语句。

您声明变量的方式都是变体。 Dim 每个变量都需要一个类型。 Call 也已弃用。

尝试以此为基础:

Public Sub CallTortoise()
    Dim wShell As Object
    Set wShell = CreateObject("WScript.Shell")
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    Dim svnPath As String
    svnPath = "C:\someSVNlocation\folder\"
    
    With ThisWorkbook.Sheets("Equity")
        Dim p(1 To 2) As String
        p(1) = "loc1"
        p(2) = "loc2"
        
        Dim i As Long
        For i = 1 To 2
            If p(i) <> "" Then
                Dim thisPath As String
                thisPath = FSO.BuildPath(svnPath, p(i))
                Dim folder As Object
                Set folder = FSO.GetFolder(thisPath)
                Dim file As Object
                For Each file In folder.Files
                    Dim deletePath As String
                    deletePath = FSO.BuildPath(thisPath, file.Name)
                    wShell.Run "TortoiseProc.exe /command:remove /path:""" & deletePath & """ /closeonend:1 ", 1, True
                    deletePath = ""
                Next file
            End If
        Next i
        
        wShell.Run "TortoiseProc.exe /command:commit /path:""" & svnPath & p(1) & "*" & svnPath & p(2) & """ ", 1, True
    End With
End Sub