Archivo BAT: abra una nueva ventana de cmd y ejecute un comando allí

163

Estoy tratando de abrir una nueva ventana de comandos en un archivo BAT:

start %windir%\system32\cmd.exe

Después de que se abra, me gustaría ejecutar un comando BAT en la nueva ventana:

echo "test in new window"

¿Cómo puedo hacer esto?

Tjekkles
fuente

Respuestas:

263

Es posible que ya encuentre su respuesta porque fue hace algún tiempo que la solicitó. Pero intenté hacer algo similar al codificar ror. Quería ejecutar "rails server" en una nueva ventana de cmd para no tener que abrir un nuevo cmd y luego encontrar mi ruta nuevamente.

Lo que descubrí fue usar el interruptor K de esta manera:

start cmd /k echo Hello, World!

comience antes de que "cmd" abra la aplicación en una nueva ventana y "/ K" ejecute "echo Hello, World!" después de que el nuevo cmd esté activo.

También puede usar el modificador / C para algo similar.

start cmd /C pause

Esto ejecutará "pausa" pero cerrará la ventana cuando termine el comando. En este caso después de presionar un botón. Encontré esto útil para el "servidor de rieles", luego cuando apago mi servidor dev no tengo que cerrar la ventana después.

aross
fuente
2
Si está usando esto para ejecutar un servidor rails, en realidad no necesita escribir cmd. Solo puedes escribir start rails s.
fbonetti
86

Use lo siguiente en su archivo por lotes:

start cmd.exe /k "more-batch-commands-here"

o

start cmd.exe /c "more-batch-commands-here"

/ c Ejecuta el comando especificado por cadena y luego termina
/ k Ejecuta el comando especificado por cadena pero permanece

Consulte la documentación de cmd.exe utilizando cmd /?para obtener más detalles.

El formateo adecuado de la cadena de comandos se vuelve un poco más complicado con espacios en los argumentos. Vea los ejemplos a continuación. Tenga en cuenta el uso de comillas dobles anidadas en algunos ejemplos.

Ejemplos:

Ejecute un programa y pase un parámetro de nombre de archivo:
CMD /c write.exe c:\docs\sample.txt

Ejecute un programa y pase un nombre de archivo largo:
CMD /c write.exe "c:\sample documents\sample.txt"

Espacios en la ruta del programa:
CMD /c ""c:\Program Files\Microsoft Office\Office\Winword.exe""

Espacios en la ruta del programa + parámetros:
CMD /c ""c:\Program Files\demo.cmd"" Parameter1 Param2
CMD /k ""c:\batch files\demo.cmd" "Parameter 1 with space" "Parameter2 with space""

Inicie demo1 y demo2:
CMD /c ""c:\Program Files\demo1.cmd" & "c:\Program Files\demo2.cmd""

Fuente: http://ss64.com/nt/cmd.html

Shannon Matthews
fuente
13

Esto no es muy fácil.

El mejor enfoque es tener la parte de su script que desea que se ejecute en una "nueva ventana" para que esté en un archivo .bat separado. Esto podría no ser práctico si, por ejemplo, necesita mucho estado del resto de su script (variables, etc.). Una opción es pasar cualquier valor que necesite (por ejemplo, dir para operar) al archivo por lotes:

start cmd.exe stuff.bat %this_dir%

Si tiene una gran cantidad de estado para transmitir, puede considerar generar un archivo por lotes en tiempo de ejecución:

set foo=Hello, World
set list_me=%userprofile%

set tmpdir=c:\windows\temp
set tmp=%tmpdir%\tmp.foo

del /q /f "%tmp%"

echo.echo %foo%>>"%tmp%"
echo.dir "%list_me%">>>"%tmp"

start cmd.exe "%tmp%"

del /q /f "%tmp%"

Obviamente este es un ejemplo trivial.

sorigal
fuente
11

Las respuestas anteriores me ayudaron. Pero todavía requería un poco de comprensión. Aquí hay un script de ejemplo que uso para iniciar 3 procesos para el desarrollo web. Resulta en 3 ventanas que permanecen abiertas, ya que necesitan ejecutarse continuamente.

Mongo se ha agregado globalmente a mi camino, por lo que no necesito hacer un CD como lo hago para los otros dos programas. Por supuesto, la ruta a sus archivos variará, pero espero que esto ayude.

:: Start MongoDB
start cmd.exe /k "mongod"

:: cd app directory, and start it
cd my-app
start cmd.exe /k "npm run dev"

:: cd to api server, and start that
cd ../my-app-api
start cmd.exe /k "npm run dev"
Dan Zuzevich
fuente
7

Gracias a todos aquí en Stack Overflow; Esta solución resuelve la pregunta anterior, pero se extiende para ejecutar automáticamente estas tareas:

  1. Quiero ejecutar mi servidor rails
  2. Ejecutar trabajos de rastrillo: trabajador para mi gema delayed_job también
  3. y abrir el navegador de Internet predeterminado para mostrar mi página
  4. finalmente, dejar una ventana de cmd abierta para cualquier comando adicional durante mi sesión.

Supongo que mi proyecto se llama "anticuario".

Cree un archivo "init.bat" en su directorio % USERPROFILE% (abra una ventana de cmd y eche un vistazo a la ruta a la izquierda del cursor para saber qué es% USERPROFILE%)

@echo off
cd C:/projects/rails3/antiquorum
if "%1" == "antiquorum" GOTO start
if "%1" == "worker" GOTO worker
if "%1" == "server" GOTO server
if "%1" == "" GOTO end
:start
    start cmd /k %USERPROFILE%\init.bat worker
    start cmd /k %USERPROFILE%\init.bat server
    TIMEOUT 30
    start "" "http://localhost:3000/"
    GOTO end
:server
    rails s
    GOTO end
:worker
    rake jobs:work
:end

En una nueva ventana de línea de comando, escriba: C:> init antiquorum

El código abre dos ventanas cmd más y un navegador. TIMEOUT evita errores en el navegador.

La sección : inicio hace el trabajo. Puede ejecutar las tareas 1,2 o 4 por separado escribiendo parámetros como: servidor , trabajador o ninguno para dejar un cmd abierto en la raíz del proyecto "anticuario" .

Disfrutar.

Fer Padron
fuente
2

Si entiendo que está haciendo esto correctamente, su archivo bat abrirá el símbolo del sistema e imprimirá su mensaje en la pantalla.

cmd.exe hello world

espero que esto ayude.

Chris Derry
fuente
2

para ejecutar un archivo de Python en una nueva ventana de cmd con espacios en el nombre del archivo:

start cmd.exe /k python "C:\Program Files\HelloWorld.py"
bracoo
fuente
0

Agregar entre dos comandos ejecuta ambos comandos ./k in order

Ejemplo:

cmd /k echo "hello"

este comando se abrirá primero y command promptluego ejecutará el echo "hello"comando

Vicky Salunkhe
fuente