调用带有make的batch file并进行更改

我使用makefile(GNU Make)在命令行上使用Visual C ++ Express进行编程。 为此,我必须调用Visual Studiobatch filevsvars32.bat来设置环境。 在使用make之前,每次打开一个新的cmd.exe都必须完成此操作。 当我尝试从我的makefile中调用batch file时,显然会将batch file作为自己的进程执行,因为之后的环境是一样的。

所以我的问题:是否有一种方法来执行cmd.exe中的脚本,如Linux / Unix bash的内置源代码命令? 当然,除了在Windows上安装bash之外。

张贴我自己的答案后编辑:

上面的问题不太对,应该是这样的:

是否有可能从一个生成文件中调用一个改变环境的batch file,这样改变后的环境对于在生成文件中调用的其他程序持续存在?

原来问题的答案是肯定的:你可以使用cmd.exe的内置调用命令。 但是由于调用是一个内置的命令,而不是一个真正的程序,所以只有从另一个batch file中调用一个batch file,它才能在makefile中工作。

从以前的答案编译回答:

我做了一个名为make.bat的批处理文件,其中包含以下内容:

调用“%VS90COMNTOOLS%vsvars32.bat”
调用make.exe%*

这样做的工作。 但是从一个makefile中调用一个改变环境的批处理文件,这样改变的环境对于在makefile中调用的其他程序依然存在,似乎是不可能的。

编辑:通过反复调用vsvars32.bat溢出我的PATH变量后,我做了以下更改:

如果不是“%VISUALCVARS%”==“TRUE”(
设置VISUALCVARS = TRUE
调用“%VS90COMNTOOLS%vsvars32.bat”

调用make.exe%*

使用“呼叫”:

@echo off pushd. call "C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars3235.bat" msbuild LinqSupportClassesSDKBuild.csproj /t:rebuild /p:Configuration=Release /nologo /v:q /clp:ErrorsOnly; popd 

这是我们用来构建我们的linq提供程序的cmd文件。

至少在安装Visual Studio(虽然有些古老的VS .NET 2003)时,VS开始菜单组中的一个链接是打开一个cmd.exe实例,其环境已经设置好了。 您可能会发现这些帮助:

  • 如何将Visual Studio命令提示符(VSCP)作为工具添加到IDE中?
  • 从Visual Studio工具菜单运行命令提示符
  • 快捷方式:从Visual Studio启动Visual Studio命令提示符

他们更倾向于从IDE启动命令提示符,但是它们确实包含了启动相应环境的信息,这些信息可能会对您的目的有所帮助。

你如何启动你的控制台? 如果你只是启动'cmd',那么改为创建一个快捷方式执行(%comspec%解析为c:\ windows \ cmd.exe或任何相关的系统)

 %comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86 

显然,改变路径指向正确的安装文件夹。 更一般地说,正如上面的海报所指出的那样,如果一个.cmd文件需要处理另一个.cmd文件,而不是作为一个单独的进程启动它,请使用'call'批处理命令。

将GNU make编译成脚本(mmake.bat)。 将脚本放在某处的路径中。

脚本本身应该运行vsvars32.bat然后像这样创建

 vsvars32.bat make %* 

据我所知,从这样的另一个脚本调用脚本是在同一个shell中完成的(类似于Bash“。”命令)。

我发现了这个问题的三个解决方案:

1)如果由批处理文件设置的环境变量是静态的(即它们始终是相同的值),请为整个用户配置文件设置这些值。 右键单击我的电脑,单击属性 – >高级 – >环境变量。 将批处理文件中的变量添加到“用户变量”或“系统变量”部分(用户变量只能由您显示,系统变量对于该计算机的所有用户都是可见的)。

2)编写一个调用环境设置脚本的包装器批处理文件,然后调用Makefile。

3)而不是使用SET命令来设置批处理文件中的环境变量,使用SETX命令(需要Windows资源工具包)。 SETX与SET类似,只是它对注册表中的主环境进行了更改,并将在将来启动的所有命令提示符(但不是当前启动的命令提示符)中生效。