在 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 时应指定此标志。"
末尾的 True
是 bWaitOnReturn
指示脚本是否应等待程序完成执行后再继续执行脚本中的下一条语句。
您声明变量的方式都是变体。 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
我需要在 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 时应指定此标志。"
末尾的 True
是 bWaitOnReturn
指示脚本是否应等待程序完成执行后再继续执行脚本中的下一条语句。
您声明变量的方式都是变体。 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