2011-04-03 14 views
5

Tengo un archivo ubicado en el directorio "C: \ Documents and Settings \ test.exe" pero cuando escribo el comando `C:\Documents and Settings\test.exe en single qoutes (que no puedo mostrar en este cuadro), se usa para ejecutar los comandos en Ruby, no puedo hacerlo y el error que recibo es "No file or Directory". He intentado reemplazar "\" con "//" y "\" pero parece que nada funciona. También he usado los comandos system, IO.popen y exec, pero todos los esfuerzos son en vano. También los comandos de ejecución hacen que el programa haga una salida que no quiero que suceda.¿Cómo se ejecutan los comandos CLI de Windows en Ruby?

Gracias de antemano.

+0

te estoy asumiendo frijol "tilde" en lugar de "comillas simples", pero no voy a editar su pregunta a menos que lo confirman. – davetron5000

Respuesta

4
`"C:\Documents and Settings\test.exe"` 

o

`exec "C:\Documents and Settings\test.exe"` 

o lo que sea en qoutes

+0

idea principal es envolver el camino en citas. No estoy familiarizado con Windows, por lo que puede haber otras restricciones. – fl00r

+0

No sé si el archivo con el que estoy trabajando tiene algunas limitaciones para trabajar en un programa de Ruby o la forma en que estoy especificando la ruta del archivo es incorrecta, pero la cosa no me funciona ... Pero el método que usted he dicho es correcto! –

+0

Entonces ... ¿todo funciona? – fl00r

7

El entorno de acento grave es como comillas dobles, por lo que la barra invertida se utilizan para escapar. Además, Ruby interpretará los espacios como la separación de los argumentos de línea de comandos, por lo que necesita para citar a toda la cosa:

`"C:\\Documents and Settings\\test.exe"` 

Otra opción es utilizar system y forzar un segundo argumento. Si system obtiene más de un argumento, se trata el primer argumento como la ruta al comando a ejecutar y que no es necesario citar el comando:

system('C:\Documents and Settings\test.exe','') 

Nota el uso de individuales cotizaciones, por lo que no tienes escape de las barras invertidas.

Por supuesto, esto no le proporcionará la salida estándar/error, por lo que si está en Ruby 1.9.2, puede utilizar la asombrosamente útil biblioteca Open3, que funciona como system, pero le da más información sobre la proceso que se acaba de ejecutar:

require 'open3' 

stdout,stderr,status = Open3.capture3('C:\Documents and Settings\test.exe','') 

puts stdout # => string containing standard output of your command 
puts stderr # => string containing standard ERROR of your command 
if status.success? 
    puts "It worked!" 
else 
    puts "OH NOES! Got exit code #{status.exitstatus}" 
end 
+0

método indefinido 'capture3 'para Open3: Module (NoMethodError) con ruby ​​1.8.7 – stack1

Cuestiones relacionadas