2017-09-19 501 views
0

我試圖在執行程序之前設置一種基於不同配置文件定義Windows環境的優雅方式。我不是自己調用程序執行(這會讓事情變得更簡單),而只是將正確的環境插入到現有的自動化過程中。作爲Windows腳本命令執行Python腳本的輸出

我可以爲每個可能的配置編寫setenv.bat文件,但是更願意解析將在其他場景中使用的config.yml

Pyton腳本感覺就像要走的路。但是Python中設置的環境變量在從Python進程返回後將會丟失。

我現在使用Python作爲轉換器/發生器從配置創建批處理命令。讓python cmd_from_cfg.py config.yml輸出是這樣的:

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 

但帽子我真的想這樣做(和曾希望會很容易)被跳過創建setenv.bat並立即執行Python腳本結果作爲Windows命令。這可能嗎?

我試過,但它一旦達到一個空白停止每一行:

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

這可能是mojibake的來源,因爲Python默認將ANSI寫入管道,而CMD的for/f循環默認使用當前控制檯代碼頁逐行解碼,默認爲OEM。 Python腳本和批處理腳本需要就編碼達成一致。最好這應該是UTF-8(例如CMD中的'chcp.com 65001',併爲Python設置'PYTHONIOENCODING = utf-8'並打印'unicode'字符串),以便能夠處理任何Unicode字符。 – eryksun

1

批處理執行擴展而沒有回聲的任何環境變量。例如:

set "CMD=echo hi" 
%CMD% 

會打印:

hi 

你需要捕捉到你的Python腳本的輸出,然後展開每個變量,因爲它是。考慮到你的劇本有三行輸出:

@echo off 
SETLOCAL EnableDelayedExpansion 
set "COUNTER=1" 
for /f "delims=" %%k in ('python generator.py config.yml') do (
set "VARIABLE!COUNTER!=%%k" 
set /A COUNTER+=1 
) 
!VARIABLE1! 
!VARIABLE2! 
!VARIABLE3! 
ENDLOCAL 

More about DelayedExpansion

+1

'delims'用於標記分隔符。在上面的例子中,沒有分隔符表示只有新行。我不確定你的需求,所以我將它們導出到'for'循環之外。 – sohaib