为什么PowerShell无法构建我的.net解决方案?("文件正由另一个进程使用")

uri*_*rig 5 .net build-automation powershell build

我已经编写了一个PowerShell脚本来一个接一个地构建几个.net解决方案.它只是调用tfget(获取最新),然后调用devenv.exe(构建.sln文件).

这是代码:

tfget -item $SolutionPath -overwrite -recurse -ev +errors
...
$out = invoke-expression "devenv.com /rebuild debug $SolutionPath"
Run Code Online (Sandbox Code Playgroud)

几乎每次我运行脚本时,其中一个解决方案都无法构建,我从CSC.exe(?)收到错误说:

错误CS1606:程序集签名失败; 输出可能未签名 - 进程无法访问该文件,因为它正被另一个进程使用.

即使我已经关闭了所有持有这些解决方案的Visual Studio实例,并且我的计算机上没有运行任何exes,也会发生这种情况.

我编写的类似批处理文件工作得很好.只有PowerShell抱怨另一个进程正在使用该文件.

我怎样才能避免这种情况发生?有没有比通过PowerShell构建.net解决方案更好的例子?

Kei*_*ill 14

不要使用invoke-expression.只需直接在SLN文件上调用devenv.exe(或者只是使用MSBuild.exe,除非您有设置或其他不受支持的项目类型).使用shell脚本语言的一个优点是它们被设计为可以无缝地与控制台exes一起使用.我们一直在PowerShell脚本中执行此操作:

msbuild.exe "R:\Source\Foo.sln" /t:build /p:Configuration=Debug `
    /v:detailed 2>&1 | Out-String -stream -width 1024 > $DebugBuildLogFile
Run Code Online (Sandbox Code Playgroud)

我们通过Out-String运行输出,以便日志文件输出不会换行为80或120个字符(运行脚本的控制台的默认宽度).