midl找不到C预处理器cl.exe

时间:2015-02-24 16:50:02

标签: windows powershell rpc midl

我正在尝试用midl编译我的arith.idl文件。我正在运行Windows 7专业版。

以下是我在powershell提示符中启动的命令:

PS> 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\midl.exe' .\arith.idl

Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
64 bit Processing .\arith.idl
midl : command line error MIDL1005 : cannot find C preprocessor cl.exe
PS>

我在Windows RPC编程方面相当不错,我非常感谢一些帮助。我已阅读this但这并未解决任何问题(相同的症状)。我也尝试使用此命令指定预处理程序cl.exe:

PS C:\> & 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\midl.exe' /cpp_cmd 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cl.exe' C:\Users\$e\Desktop\MIDL\arith.idl

Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing C:\Users\philippe.CHIBOLLO\Desktop\MIDL\arith.idl
PS C:\>

此命令不返回任何内容和

echo $?

返回False

编辑:

执行vcvarsall.bat文件不会改变任何内容。这是我发布的powershell命令的输出:

PS C:\> & 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat'
Setting environment for using Microsoft Visual Studio 2010 x86 tools.
PS C:\> & 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\midl.exe' /cpp_cmd 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cl.exe' C:\Users\$me\Desktop\MIDL\arith.idl
Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555
Copyright (c) Microsoft Corporation. All rights reserved.
Processing C:\Users\$me\Desktop\MIDL\arith.idl
PS C:\> echo $?
False
PS C:\>

1 个答案:

答案 0 :(得分:4)

我不久前写了一篇关于此的文章。从PowerShell运行Cmd.exe shell脚本(批处理文件)时,环境变量更改不会传播到父进程(PowerShell)。要解决此问题,您需要在shell脚本完成后捕获环境变量更改。这篇文章是这样的:

Windows IT Pro: Take Charge of Environment Variables in PowerShell

您可以使用该文章中的Invoke-CmdScript函数运行vcvarsall.bat并将其环境变量更改传播到PowerShell。

Invoke-CmdScript如下所示:

function Invoke-CmdScript {
  param(
    [String] $scriptName
  )
  $cmdLine = """$scriptName"" $args & set"
  & $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
  select-string '^([^=]*)=(.*)$' | foreach-object {
    $varName = $_.Matches[0].Groups[1].Value
    $varValue = $_.Matches[0].Groups[2].Value
    set-item Env:$varName $varValue
  }
}

如果要在PowerShell脚本中本地化环境变量更改,还可以使用该文章中的Get-Environment和Restore-Environment函数。