バッチ ファイルで複数の (Python) スクリプトをそれぞれ独自のウィンドウで順番に実行し、完了時にすべてのウィンドウを開いたままにしておくにはどうすればよいですか? 今、私のバッチは次のようなものです:
python script1
start python script2
pause/cmd
ただし、親ウィンドウのみが開いたままになります。
ありがとう。
環境: Windows XP/Vista
バッチ ファイルで複数の (Python) スクリプトをそれぞれ独自のウィンドウで順番に実行し、完了時にすべてのウィンドウを開いたままにしておくにはどうすればよいですか? 今、私のバッチは次のようなものです:
python script1
start python script2
pause/cmd
ただし、親ウィンドウのみが開いたままになります。
ありがとう。
環境: Windows XP/Vista
[to] 複数の (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
注:--
スクリプト間ではありません。この場合、コードを変更する必要があります。
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"
3 つ以上のスクリプトがある場合は、よりトリッキーなものに頼る必要があります。次の .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
また、これは、任意の数のスクリプトまたはコマンドに拡張可能で、スクリプトなどに任意のパラメーターを使用できます。コマンド ウィンドウを一時停止して、キーを押すと消えるようにする場合は、次のようにします。
@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
最終ウィンドウで 1 つのキーを押すだけですべてを即座に終了させたい場合は、次のようにします。
@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
したがって、スクリプトの動作には多くのオプションがあります。
コマンドを使用しstart
て新しいウィンドウを開き (バックグラウンドで/min
)、コマンドを実行できます。
start "window1" /min cmd.exe /c "pause"
最後のコマンドである一時停止は何でもかまいませんが、必ずすべて引用符で囲んでください
ウィンドウを開いたままにするには、最後のステートメントとして一時停止して、コンテンツをバッチ スクリプトに配置する必要があります。