7

我需要从构建不同版本的应用程序的同一 bash 脚本 (msys) 中调用 vcvars32.bat 和 vcvars64.bat。

问题是,即使我能够使用 cmd.exe 命令调用批处理文件,一旦它返回 Visual Studio 变量显然没有设置。

我无法从调用 bash 脚本的外部批处理文件(如 msys.bat)调用 vcvars,因为我需要在同一个脚本中按顺序调用它们。

那么,有没有办法调用 vcvars 以便在运行时正确设置 bash 脚本中的变量?

4

3 回答 3

1

解决此问题的一种方法是从 vcvars 环境中运行命令,而不是尝试将其导出回 bash 端。这就是我们为项目选择的方法。

主要问题是它vcvars*.bat不接受在环境中执行的命令,因此需要使用 cmd 进行一些技巧。所以我想出了一个简单的 Bash 脚本vcvars_env_run.sh,它接受任意参数并将它们转发到vcvars64.bat已调用的 cmd.exe。大部分工作是弄清楚如何正确转发带引号的参数,以及 &&、||、返回码等。

我已经在https://github.com/kromain/wsl-utils上传了脚本和一些示例

您可能需要稍微调整一下才能在 和 之间切换vcvars32.batvcvars64.bat但希望它对您尝试做的事情有所帮助。

于 2019-11-12T16:15:31.783 回答
0

POSIX shellexport -p打印所有环境变量的值,eval以便输出重新创建这些值。这个想法是在vcvars*.bat运行后从子shell调用它并eval在顶级脚本中捕获输出。

一个 Cygwin 环境变量设置脚本可以获得vcvars*.bat如下结果:

eval "$($(cygpath "$COMSPEC") /c vcvars_export "$vcvars_bat" "$(
                cygpath -w "$SHELL")")"

其中vcvars_bat包含相关vcvars*.bat文件的路径。例如,您会在文件的目标中找到此值x64 Native Tools Command Prompt for VS 2019.lnk,可以使用readlink -t. (另请注意,该vcvarsall.bat脚本允许使用编译器和 SDK 版本的规范,在需要精确控制时很有用)。

本地vcvars_export.bat文件包含

@echo off
call %1 > nul
"%2" -c "export -p"

Cygwin 本机进程调用子系统的限制(参数引用是启发式完成的)使得这个辅助文件是必要的。

于 2021-10-01T11:01:43.807 回答
-1

您需要做的是在批处理脚本中使用命令:“call”。所以它可能看起来像:

call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
echo DevEnvDir set to: %DevEnvDir%

如果您不使用“调用”,则脚本将在 vcvars32.bat 退出后退出,并且不会运行任何其他命令。

于 2013-03-14T15:02:38.743 回答