在尝试执行程序之前,我试图建立一种基于不同配置文件定义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
谢谢你的时间!
答案 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