Ejecuta los commands de la línea de command de Tortoise SVN con una window oculta

Tengo Tortoise SVN con una interfaz de command-line instalada. La ruta de installation es C:\Program Files\TortoiseSVN\bin donde se usa svn.exe cada vez que uso un command SVN.

Desarrollé una aplicación de Ruby Windows que se ejecuta como un process en segundo plano. Esta aplicación ejecuta el command como

 svn info "#{path_to_repository}" 

Este command invoca svn.exe como mencioné.

El problema es que svn.exe parpadea un símbolo del sistema por un segundo y termina, por lo tanto, si ejecuto svn info diez veces para diez repositorys diferentes, la pantalla parpadea diez veces a medida que este command se desarrolla para funcionar a time, la pantalla parpadea. diez veces regularmente.

Lo que necesito es una forma de ejecutar commands SVN a través de Tortoise SVN sin que svn.exe aparezca en la pantalla y se cierre.

Ruby tiene numerosas forms de ejecutar commands en shell , sin embargo, con todas las opciones parece que aparece una window emergente de línea de command cuando se usa en la aplicación GUI.

Dependiendo de los detalles que esté buscando en svn info , una opción puede usar algo como WebSVN y ver si puede raspar la GUI u get datos de su fuente RSS. Echa un vistazo al sitio de demostración de este producto .

Si tiene necesidades muy específicas y mínimas, entonces, también puede optar por build una pequeña API REST que pueda consultar el server de subversión utilizando la command-line. En ese caso, puede llamar a esa API REST para recuperar los datos y evitar que aparezcan las windows de command .

Si tiene poco time o no tiene una infraestructura de server para alojar la API REST, entonces puede pensar en crear una aplicación Ruby que ejecute un server de socket y pueda ejecutar el command de shell al recibir commands del cliente. Luego, puede hacer que su aplicación GUI se conecte al server de socket utilizando el cliente de socket y solicite a la aplicación del server que ejecute svn info y devuelva el resultado. Consulte el tutorial sobre la creación de dichas aplicaciones interactivas . A continuación, puede optar por ejecutarlos uno al lado del otro en la misma PC.

Otra alternativa es usar enlaces Ruby SVN . Puede requerir un poco de excavación para que esto funcione.

Aquí está el código de inicio rápido:

server.rb – un server TCP de ruby ​​que acepta commands y los ejecuta en 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 Una aplicación GUI Shoes que emite el command svn info al server TCP que está ejecutando server.rb

requiere 'socket'

 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 debe iniciar utilizando el command shoes app.rb

enter image description here

enter image description here

Este comportamiento no es específico de Ruby, sino del intérprete de command-line de Windows. Hay varias forms de evitarlo.

  • Intente ejecutar el command svn prefijo cmd.exe /C que no debe parpadear en la window del símbolo del sistema. Una variación de eso es usar start /min como un prefijo en su lugar. Esto no funciona en todas las circunstancias y no tengo un Ruby en Windows útil para verificar.
  • Crea un contenedor .vbs para tu command. Como .vbs no es manejado por el intérprete de command-line, no se creará su window. Consulte " Cómo ejecutar un file por lotes sin abrir una 'window de commands'? " Para get más información.
  • La mejor opción es usar una gem envoltura WinAPI para acceder a la function ShellExecute , que es bastante flexible:

     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) 

    Este ejemplo está tomado de " Inicio de aplicaciones e printing de documentos con el shell de Windows " donde puede encontrar más detalles.

    Para su propósito sería algo así como

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

Obtenga más información sobre el uso de ShellExecute .