3

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

if $(ConfigurationName) == Debug ( call "$(VS100COMNTOOLS)VCVarsQueryRegistry.bat" call "$(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 并稍后在构建后使用它,或者我应该使用另一种方法?

4

1 回答 1

3

这有点棘手:

  • 首先,对于 cmd 变量,您需要使用%var%语法而不是类似 msbuild$(var)
  • 接下来,call批处理中的 SET 语句确实适用.. 但if主体会预先计算其变量,因此您需要几if行而不是一个if主体。这是对这种行为和其他避免它的方法的很好解释.bat 文件中的奇怪范围问题

所以,这个应该工作:

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)"
于 2013-03-26T16:09:39.517 回答