Сохранить несколько окон консоли из пакета

Как я могу сделать пакетный файл выполнить несколько сценариев (Python) последовательно, каждый в своем окне, и оставить все эти окна открытыми после завершения? Прямо сейчас моя партия выглядит примерно так:

python script1
start python script2
pause/cmd

Но только родительское окно остается открытым.

спасибо.

Окружающая среда: Windows XP/Vista​​p >

Ответы

Ответ 1

[чтобы] выполнять несколько (Python) скриптов последовательно, каждый в своем собственном окне, и держать все эти окна открытыми после завершения

#!/usr/bin/env python
"""Continuation-passing style (CPS) script.

Usage:

   $ python cps.py script1.py arg1 arg2 -- script2.py a b c -- script3.py ...
"""
import platform
import sys
from subprocess import call

if len(sys.argv) < 2:
    sys.exit() # nothing to do

# define a command that starts new terminal
if platform.system() == "Windows":
    new_window_command = "cmd.exe /c start cmd.exe /c".split()
else:  #XXX this can be made more portable
    new_window_command = "x-terminal-emulator -e".split()

# find where script args end
end = sys.argv.index('--') if '--' in sys.argv else len(sys.argv)

# call script; wait while it ends; ignore errors
call([sys.executable] + sys.argv[1:end])

# start new window; call itself; pass the rest; ignore errors
rest = sys.argv[end+1:]
if rest:
    call(new_window_command + [sys.executable, sys.argv[0]] + rest)

print("Press Enter to exit") #NOTE: to avoid raw_input/input py3k shenanigans
sys.stdin.readline()

Он поддерживает столько скриптов с их аргументами, сколько вы можете предоставить в командной строке.

Если вы не используете аргументы для скриптов; вы можете упростить использование:

$ python cps.py script1.py script2.py script3.py

Примечание: нет -- между сценариями. В этом случае вам необходимо изменить код:

  • set end = 2
  • и rest = sys.argv[end:] (Примечание: нет +1)

Ответ 2

Если у вас есть только два сценария, у вас была правильная идея, просто ваш синтаксис был неправильным:

start cmd.exe /k "python script1.py & start cmd.exe /k python script2.py"

Если вам нужны заголовки окон:

start "Window1" cmd.exe /K "python script1.py & start "window2" cmd.exe /K python script2.py"

Не более двух скриптов, и вам придется прибегать к более сложным вещам. Следующий файл .cmd выполнит трюк:

@echo off
if "%~1" == "recurse" goto runScript%~2

start "Window1" cmd /k "%~f0 recurse 1"
exit /b 0

:runScript1
python script1.py
start "Window2" cmd /k "%~f0 recurse 2"
exit /b 0

:runScript2
python script2.py
start "Window3" cmd /k "%~f0 recurse 3"
exit /b 0

:runScript3
python script3.py
exit /b 0

И это масштабируемо для любого количества скриптов или команд, с произвольными параметрами для скриптов и т.д. Если вы хотите, чтобы окна cmd просто приостанавливались и исчезали при нажатии клавиши:

@echo off
if "%~1" == "recurse" goto runScript%~2

start "Window1" cmd /c "%~f0 recurse 1"
exit /b 0

:runScript1
python script1.py
start "Window2" cmd /c "%~f0 recurse 2"
pause
exit /b 0

:runScript2
python script2.py
start "Window3" cmd /c "%~f0 recurse 3"
pause
exit /b 0

:runScript3
python script3.py
pause
exit /b 0

Если вы хотите, чтобы все они мгновенно завершили нажатие одной клавиши в последнем окне:

@echo off
if "%~1" == "recurse" goto runScript%~2

start "Window1" cmd /c "%~f0 recurse 1"
exit /b 0

:runScript1
python script1.py
start "Window2" /wait cmd /c "%~f0 recurse 2"
exit /b 0

:runScript2
python script2.py
start "Window3" /wait cmd /c "%~f0 recurse 3"
exit /b 0

:runScript3
python script3.py
pause
exit /b 0

Итак, у вас есть много вариантов поведения script.

Ответ 3

Вы можете использовать команду start, чтобы открыть новое окно (в фоновом режиме с помощью /min) и запустить команду

start "window1" /min cmd.exe /c "pause"

Последняя команда, пауза может быть чем угодно, просто обязательно поместите ее в кавычки

Чтобы открыть окно, вы должны разместить содержимое в пакете script с паузой в качестве последнего оператора