用隐藏窗口运行龟SVN命令行命令

我已经安装了一个命令行界面的龟SVN。 安装path是C:\Program Files\TortoiseSVN\bin ,在我使用任何SVN命令时使用svn.exe

我开发了一个作为后台进程运行的Ruby Windows应用程序。 这个应用程序像运行命令一样

 svn info "#{path_to_repository}" 

svn.exe ,该命令调用svn.exe

问题是, svn.exe闪烁命令提示符一秒钟,并终止,因此,如果我运行svn info 10次​​十个不同的存储库,然后屏幕闪烁十次,因为这个命令是及时开发运行,屏幕闪烁十次定期。

我需要的是一种通过龟SVN运行SVN命令的方式,而无需svn.exepopup屏幕并closures。

Ruby有很多在shell中执行命令的方法 ,但是,在GUI应用程序中使用时,所有的选项都会弹出一个命令行窗口。

根据你在svn info什么细节,你可以使用一些选项,比如WebSVN ,看看你是否想要刮取 GUI或从RSS feed中获取数据。 看看这个产品的演示网站 。

如果你有非常具体和最小的需求,那么你也可以选择构建一个小的REST API,它可以使用命令行查询Subversion服务器。 在这种情况下,可以调用REST API来获取数据,避免弹出command窗口。

如果您确实时间不够或者没有服务器基础架构来托管REST API,那么您可以考虑创建运行套接字服务器的Ruby应用程序,并可以在接收来自客户端的命令时运行shell命令。 然后,你可以使你的GUI应用程序使用套接字客户端连接到套接字服务器,并要求服务器应用程序执行svn info并返回结果。 阅读构建这种交互式应用程序的教程 。 然后,您可以选择在同一台PC上并排运行它们。

另一种选择是使用Ruby SVN绑定 。 这可能需要一些挖掘才能得到这个工作。

以下是快速入门代码:

server.rb – 接受命令并在shell中执行它们的ruby TCP服务器

 require 'socket' server = TCPserver.open(2000) # Socket to listen on port 2000 puts "listning now #{server.addr}" loop { Thread.start(server.accept) do |client| cmd = client.gets puts "Processing #{cmd} from #{client.peeraddr}" IO.popen(cmd) { |s| result = []; while (line = s.gets) do client.puts line.chop end; } client.close end } 

app.rb一个Shoes GUI应用程序 ,它向server.rb运行的TCP服务器发出svn info命令

要求'套接字'

 Shoes.app { stack do @push = button "Get SVN Info" @note = para "" end @push.click { hostname = 'localhost' port = 2000 result = [] s = TCPSocket.open(hostname, port) s.puts "svn info trunk/backend" while line = s.gets result << line.chop end s.close @note.replace result.join("\n") } } 

app.rb应该使用shoes app.rb命令启动。

在这里输入图像说明

在这里输入图像说明

这种行为不是特定于Ruby,而是Windows命令行解释器。 有几种方法可以解决这个问题。

  • 尝试运行以cmd.exe /C为前缀的svn命令,该命令不应该闪烁命令提示符窗口。 改变是用start /min作为前缀。 这在任何情况下都不起作用,我没有在Windows上方便检查的Ruby。
  • 为您的命令创建一个.vbs包装器。 由于.vbs不是由命令行解释器处理的,因此它的窗口将不会被创建。 有关详细信息,请参阅“ 如何在不启动”命令窗口“的情况下运行批处理文件?
  • 最好的选择是使用WinAPI包装gem来访问ShellExecute函数,这非常灵活:

     require 'win32ole' # Create an instance of the Windows Shell object... shell = WIN32OLE.new('Shell.Application') # The shell object's ShellExecute method performs a specified operation on a specified file. The syntax is... shell.ShellExecute(FILE, ARGUMENTS, DIRECTORY, OPERATION, SHOW) 

    此示例取自“ 使用Windows Shell启动应用程序和打印文档 ”,您可以在其中找到更多详细信息。

    为了你的目的,这将是类似的东西

     shell.ShellExecute('svn.exe', 'info', path_to_repository, 'open', 0) 

了解有关ShellExecute用法的更多信息。