2017-09-19 28 views
0

プログラムを実行する前に、さまざまな設定ファイルに基づいてWindows環境を定義する洗練された方法を設定しようとしています。私は自分自身でプログラムの実行を呼び出すのではなく(既存のものを簡単にする)、正しい環境を既存の自動プロセスに挿入するだけです。Pythonスクリプトの出力をWindowsスクリプトコマンドとして実行する

可能な設定ごとにsetenv.batファイルを書き込むことができましたが、他のシナリオでも使用されるconfig.ymlを解析する方が好きです。

Pytonスクリプトは、行く方法のように感じました。しかし、Pythonで設定された環境変数は、Pythonプロセスから戻った後に失われます。

私は現在、configからバッチコマンドを作成するコンバータ/ジェネレータとしてPythonを使用しています。

SET "ENV_VAR_A=config-value" 
SET "ENV_VAR_B=config-value" 
CALL "path-from-config.bat" 

これは、ファイルにリダイレクトして実行することができます:

python cmd_from_cfg.py config.yml > setenv.bat 
setenv.bat 
program.exe 

しかし、帽子、私が本当にやりたい(と簡単だろう期待していた)の作成を省略しているpython cmd_from_cfg.py config.yml出力このようなものをしてみましょうsetenv.batとすぐには、WindowsコマンドとしてPythonスクリプトの結果を実行します。これは可能ですか?

私はこれを試してみましたが、それは、すぐ空白に到達するよう、各ラインを停止します。お時間を

FOR %%i IN ('python cmd_from_cfg.py config.yml') ECHO %%i 

感謝を!

答えて

2

forループを実行して、外部コマンドのすべての出力を取得するだけです。

@echo off 
for /f "delims=" %%A in ('python cmd_from_cfg.py config.yml') do echo %%A 

実際にコマンドを実行するには、echoを削除する必要があります。

+1

PythonはデフォルトでパイプにANSIを書き込むため、CMDの 'for/f'ループはデフォルトで現在のコンソールコードページ(デフォルトはOEM)を使用して行ごとにデコードされるため、これは潜在的にmojibakeのソースです。 Pythonスクリプトとバッチスクリプトは、エンコーディングに同意する必要があります。これは、Unicode文字を処理できるように、UTF-8でなければなりません(たとえば、CMDでは 'chcp.com 65001'、Pythonでは' PYTHONIOENCODING = utf-8'を設定し、 'unicode'文字列を出力するのが望ましい)。 – eryksun

1

エコーなしで展開された環境変数を一括して実行します。たとえば:

set "CMD=echo hi" 
%CMD% 

が印刷されます:あなたは、あなたのPythonスクリプトの出力をキャプチャし、それがあるとして、各変数を展開する必要がある

hi 

。あなたのスクリプトが出力に3行を持っているとします:

More about DelayedExpansion

+1

delimitersをマークするために 'delims'が使用されます。上記の場合、デリミタは改行のみを意味しません。私はあなたの要求についてはわからなかったので、 'for'ループの外にエクスポートしました。 – sohaib

関連する問題