簡體   English   中英

使用隱藏窗口運行Tortoise SVN命令行命令

[英]Run Tortoise SVN command line commands with a hidden window

我有安裝了命令行界面的Tortoise SVN。 安裝路徑是C:\\Program Files\\TortoiseSVN\\bin ,每當我使用任何SVN命令時,都會使用svn.exe

我開發了一個Ruby Windows應用程序,它作為后台進程運行。 此應用程序運行命令

svn info "#{path_to_repository}"

正如我所提到的,該命令調用svn.exe

問題是, svn.exe閃爍一個命令提示符並終止,因此如果我為十個不同的存儲庫運行svn info十次,那么當該命令被開發為及時運行時,屏幕會閃爍十次,屏幕閃爍十次定期。

我需要的是一種通過Tortoise SVN運行SVN命令的方法,而不會使svn.exe彈出屏幕並關閉。

Ruby有很多在shell中執行命令的方法 ,但是,在GUI App中使用時,所有選項都會出現命令行彈出窗口。

根據您在svn info中尋找的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
}

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作為前綴。 這在所有情況下都不起作用,我沒有方便的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) 

    此示例取自“ 使用Windows Shell啟動應用程序和打印文檔 ”,您可以在其中找到更多詳細信息。

    為了你的目的,它會是這樣的

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM