使用隐藏窗口运行Tortoise SVN命令行命令

Sup*_*nic 3 ruby svn windows tortoisesvn command-line

我有安装了命令行界面的Tortoise SVN.安装路径是C:\Program Files\TortoiseSVN\bin在那里svn.exe,每当我使用任何SVN命令时使用.

我开发了一个Ruby Windows应用程序,它作为后台进程运行.此应用程序运行命令

svn info "#{path_to_repository}"
Run Code Online (Sandbox Code Playgroud)

这个命令svn.exe就像我提到的那样调用.

问题是,svn.exe一秒钟闪烁一个命令提示符并终止,因此如果我svn info为十个不同的存储库运行十次,那么当该命令被开发为及时运行时,屏幕会闪烁十次,屏幕会经常闪烁十次.

我需要的是一种通过Tortoise SVN运行SVN命令而无需svn.exe弹出屏幕和关闭的方法.

Wan*_*ker 6

Ruby有很多在shell中执行命令的方法,但是,在GUI App中使用时,所有选项都会出现命令行弹出窗口.

根据您要查找的详细信息svn info,您可以使用一个选项,例如WebSVN,并查看是否可以删除 GUI或从其RSS源获取数据. 看看这个产品的演示网站.

如果您有非常特定和最小的需求,那么您还可以选择构建一个可以使用命令行查询subversion服务器的小型REST API.在这种情况下,您可以调用REST API来获取数据并避免弹出command窗口.

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

另一种方法是使用Ruby SVN绑定.它可能需要一些挖掘才能使其工作.

这是快速入门代码:

server.rb - 一个ruby TCP服务器,它接受命令并在shell中执行它们

require 'socket'

server = TCPServer.open(2000)   # Socket to listen on port 2000
puts "Listening 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
}
Run Code Online (Sandbox Code Playgroud)

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

要求'插座'

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

在此输入图像描述


Nic*_*lov 5

此行为不是特定于Ruby,而是特定于Windows命令行解释器.有几种方法可以解决它.

  • 尝试运行svn前缀的命令,cmd.exe /C该命令不应该闪烁命令提示符窗口.其变体是start /min用作前缀.这在所有情况下都不起作用,我没有方便的Ruby on Windows检查.
  • .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)
    
    Run Code Online (Sandbox Code Playgroud)

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

    为了你的目的,它会是这样的

    shell.ShellExecute('svn.exe', 'info', path_to_repository, 'open', 0)
    
    Run Code Online (Sandbox Code Playgroud)

详细了解ShellExecute使用情况.