VS Post构建事件在bat文件中声明var并稍后使用它

时间:2013-03-21 10:37:25

标签: visual-studio-2010 visual-studio batch-file msbuild post-build-event

我正在尝试使用Visual Studio 2010中的signtool.exe自动使用证书对项目进行签名。这是我的简化后构建脚本:

  

如果$(ConfigurationName)== Debug(    调用“$(VS100COMNTOOLS)VCVarsQueryRegistry.bat”    调用“$(WindowsSdkDir)bin / signtool.exe”sign / f“$(ProjectDir)my.pfx”/ p mypass / t timstamp.dll“$(TargetPath)”   )

Debug用于测试目的。我正在尝试模仿Visual Studio command prompt - 执行$(VS100COMNTOOLS)VCVarsQueryRegistry.bat,这会添加一些额外的变量,然后再使用它。我需要$(WindowsSdkDir)

虽然该脚本在简单的bat文件中完美运行,但它拒绝在Visual Studio中工作。输出是:

  

调用“C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ Tools \ VCVarsQueryRegistry.bat”    调用“bin / signtool.exe”标志......

请注意,它无法识别在VCVarsQueryRegistry.bat中创建的$(WindowsSdkDir)。

是否可以在bat中声明var并在后期构建中使用它,或者我应该使用其他方法?

1 个答案:

答案 0 :(得分:3)

这有点棘手:

  • 首先,对于cmd变量,您需要使用%var%语法而不是类似msbuild的$(var)
  • 接下来,来自call批次的SET语句确实适用..但if正文预先计算其变量,因此您需要多个if行,而不只需要一个if正文。以下是对此类行为及其他避免此类行为的方法的良好解释Weird scope issue in .bat file

所以,这个应该有效:

if $(ConfigurationName) == Debug call "%VS100COMNTOOLS%VCVarsQueryRegistry.bat"
if $(ConfigurationName) == Debug call "%WindowsSdkDir%bin\signtool.exe" sign /f "$(ProjectDir)my.pfx" /p mypass /t timstamp.dll "$(TargetPath)"