2010-04-01 29 views
5

Tôi đã viết một kịch bản PowerShell để xây dựng một vài giải pháp .net sau cái khác. Nó chỉ đơn giản là làm cho một số cuộc gọi đến tfget (để có được mới nhất) theo sau là các cuộc gọi đến devenv.exe (để xây dựng các tập tin .sln).Tại sao PowerShell không thể xây dựng các giải pháp .net của tôi? ("tập tin đang được sử dụng bởi một quá trình khác")

Dưới đây là các mã:

tfget -item $SolutionPath -overwrite -recurse -ev +errors 
... 
$out = invoke-expression "devenv.com /rebuild debug $SolutionPath" 

Hầu như mỗi khi tôi chạy kịch bản một trong những giải pháp thất bại trong việc xây dựng và tôi nhận được một lỗi từ csc.exe nói (?):

lỗi CS1606: Ký hợp đồng không thành công; đầu ra có thể không được ký - Quy trình không thể truy cập tệp vì quá trình này đang được sử dụng bởi một quy trình khác.

Điều này xảy ra mặc dù tôi đã đóng tất cả các trường hợp của Visual Studio giữ các giải pháp này và tôi không có ứng dụng nào chạy trên máy của tôi.

Một tệp hàng loạt tương tự mà tôi đã viết hoạt động tốt. Nó chỉ PowerShell phàn nàn về tập tin đang được sử dụng bởi một quá trình khác.

Làm cách nào để tránh điều này xảy ra? Có bất kỳ ví dụ nào tốt hơn ngoài việc xây dựng các giải pháp .net thông qua PowerShell không?

+0

Bạn có thể dán mã của mình không? – stej

+0

Xin chào, tôi vừa cập nhật câu hỏi để bao gồm một mẫu mã. – urig

+0

Có lý do cụ thể nào khiến bạn muốn sử dụng devenv.exe để xây dựng thay vì MSBuild không? – Filburt

Trả lời

14

Không sử dụng biểu thức gọi. Chỉ cần gọi devenv.exe trực tiếp trên tập tin SLN (hoặc cho rằng vấn đề chỉ sử dụng MSBuild.exe trừ khi bạn có thiết lập hoặc các loại dự án không được hỗ trợ). Một trong những nét đẹp của việc sử dụng một ngôn ngữ kịch bản lệnh shell là chúng được thiết kế để làm việc với giao diện điều khiển exes khá trơn tru. Chúng tôi làm điều này tất cả các thời gian trong các kịch bản PowerShell:

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

Chúng tôi chạy đầu ra thông qua Out-String sao cho đầu ra tập tin đăng nhập không quấn tại 80 hoặc 120 ký tự (chiều rộng mặc định của giao diện điều khiển chạy các script).

+1

Làm việc như một sự quyến rũ, cảm ơn bạn. Tôi chỉ nên thêm rằng msbuild.exe có thể được tìm thấy trong thư mục .net framework, ví dụ: C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ msbuild.exe – urig

3

Đó là do devenv đang chạy ở chế độ nền. Bạn phải chạy nó và chờ cho đến khi nó kết thúc.

này nên làm việc:

$p = Start-Process -FilePath devenv -ArgumentList $solutionPath,"/Rebuild Debug" -PassThru 
$null = $p.WaitForExit(-1) 

tôi sử dụng nó để xây dựng các giải pháp của tôi là tốt.

+0

PowerShell của tôi (v2.0) phàn nàn rằng tôi nên sử dụng -File thay vì -FilePath và -Arguments thay vì -ArgumentList. Bây giờ tôi đang bị mắc kẹt bởi vì nó nói với tôi rằng $ solutionPath là loại đối tượng [] và cần phải được loại chuỗi :) – urig

+0

Scratch đó. Có vẻ như PS của tôi đang chạy Cmdlet Bắt đầu quá trình sai. Tôi đã cài đặt PSCX và mặc định, PS đang chạy phiên bản Khởi động của PSCX. Tôi sẽ bắt đầu một câu hỏi SO mới để tìm hiểu cách làm cho PS sử dụng đúng phiên bản. – urig

+0

Ok, chúc may mắn. Như tôi thấy có một số giải pháp;) – stej

0

1684 và 1606 cho system.dll

step 1: Remove [ control panal-> Microsoft .NET Framework 3.5 SP1 and KB976769v2 under Microsoft .NET Framework 3.0 Service Pack 2] 

step 2: windows update-> express-> .NET versions 2.0 through 3.5 (KB951847) x86. 

sau đó làm msbuild một lần nữa. Tôi có thể vượt qua.

Các vấn đề liên quan