【问题标题】:Run Tortoise SVN command line commands with a hidden window使用隐藏窗口运行 Tortoise SVN 命令行命令
【发布时间】:2015-08-12 10:18:43
【问题描述】:

我安装了带有命令行界面的 Tortoise SVN。安装路径是C:\Program Files\TortoiseSVN\bin,其中svn.exe 在我使用任何SVN 命令时都会使用。

我开发了一个作为后台进程运行的 Ruby Windows 应用程序。此应用程序运行类似的命令

svn info "#{path_to_repository}"

正如我提到的,这个命令调用svn.exe

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

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

【问题讨论】:

    标签: ruby windows svn command-line tortoisesvn


    【解决方案1】:

    Ruby has numerous way of executing command in shell,然而,在 GUI 应用程序中使用时,似乎会出现一个命令行弹出窗口,其中包含所有选项。

    根据您在svn info 中查找的详细信息,您可以使用WebSVN 之类的选项,看看您是否可以抓取GUI 或从其RSS 提要中获取数据。 Take a look at demo site of this product.

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

    如果你真的时间很紧或者没有服务器基础设施来托管 REST API,那么你可以考虑创建一个运行套接字服务器的 Ruby 应用程序,并且可以在接收来自客户端的命令时运行 shell 命令。然后,您可以让您的 GUI App 使用套接字客户端连接到套接字服务器,并要求服务器应用程序执行 svn info 并返回结果。 Go through the tutorial on building such interacting apps。然后,您可以选择在同一台 PC 上并排运行它们。

    另一种选择是使用Ruby SVN bindings。它可能需要一些 digging around 才能使其工作。

    这里是快速入门代码:

    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
    }
    

    app.rb 一个Shoes GUI appserver.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 命令启动。

    【讨论】:

      【解决方案2】:

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

      • 尝试运行以cmd.exe /C 为前缀的svn 命令,该命令不应闪烁命令提示符窗口。一种变体是使用start /min 作为前缀。这并非在所有情况下都有效,而且我没有方便检查的 Windows 上的 Ruby。
      • 为您的命令创建一个.vbs 包装器。由于.vbs 不由命令行解释器处理,因此不会创建其窗口。详情请参阅“How to run a batch file without launching a 'command window'?”。
      • 最好的选择是使用 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)
        

        此示例取自“Launching Apps and Printing Docs with the Windows Shell”,您可以在其中找到更多详细信息。

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

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

      详细了解ShellExecute 的用法。

      【讨论】:

      • 仅供参考:cmd.exe /C dir 仍然启动 cmd 窗口,它像 OP 所说的那样闪烁。 start /min 启动一个命令窗口,它仍然闪烁一次,但现在它以最小化形式保持打开状态,并且 GUI 应用程序变得无响应。
      • 我必须把它保存在某个地方 - 谢谢 :) 使用 Python 非常简单(3 行,文档非常详细),但 Ruby 没有任何选项可以从 spawn 操作 DW 标志。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2016-06-10
      相关资源
      最近更新 更多