程序多次调用 system() 时,如何使被调用的某个 bat 文件中定义的若干临时变量仍然生效?

0

其实我是想单独使用 VC 的编译器进行编译,并在程序中完成对 cl.exe 的调用。其中一步就是在程序中用 system() 调用一个 bat 文件来设置临时环境变量,下面是这个 bat 文件的内容:

set path=%path%;%~dp0\vc14\bin\x86
set lo=%~dp0
set Lib=%lo%\winsdk\Lib\um\x86;%lo%\winsdk\Lib\um\x86;%lo%\vc14\lib\x86;%lo%\winsdk\Lib\ucrt\x86
set Include=%lo%\vc14\include;%lo%\winsdk\Include\um;%lo%\winsdk\Include\ucrt;%lo%\winsdk\Include\shared
cls

如果手动打开一个 cmd 窗口,调用这个 bat 文件,然后就可以输入命令,打开 cl.exe。

但如果在程序中使用 system() 调用完这个 bat 文件,再用 system() 启动 cl.exe,会显示找不到文件。

我猜测是因为每次调用 system() 都相当于单独启动了一次 cmd 并执行指定命令,所以在程序中执行的 bat 命令对后面执行的命令并无影响。

所以我得到了一种解决方案:直接在这个 bat 的末尾加上一行命令来启动我的程序,这样设置完环境变量之后,程序中就能成功使用设置好的环境变量了。

我的问题是:如果不采取这种在 bat 中启动程序的方式,还有什么办法可以在程序中调用 bat,并使得 bat 中设置的环境变量保持生效呢?(我目前知道可以将其设置为系统环境变量,但我并不想这么做。)

ava
huidong

2022-4-22

0

使用 API 函数 CreateProcess,默认使用当前进程的环境块。或者可以指定环境块。

ava
慢羊羊

2022-5-10

0

好像就只能设置环境变量了...不过我记得环境变量可以取消的

ava
383494

2022-4-25

技术讨论社区