作为Windows脚本命令执行Python脚本的输出

时间:2017-09-19 12:56:15

标签: python windows batch-file

在尝试执行程序之前,我试图建立一种基于不同配置文件定义Windows环境的优雅方式。我不是自己调用程序执行(这会使事情变得更容易),而只是将正确的环境插入到现有的自动化过程中。

我可以为每个可能的配置编写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的创建,并立即以Windows命令执行Python脚本结果。这可能吗?

我试过这个,但是一旦到达空格就会停止每一行:

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

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

只需运行for循环即可获取外部命令的所有输出。

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

您需要删除echo才能实际执行命令。

答案 1 :(得分: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