2011-01-17 32 views
8

Tôi đang cố thực thi tệp lô trong suốt sự kiện dựng trước. Tôi có một dự án mới và đã thêm foo.bat vào nó. Các tập tin chứa các dòng sau:Sự cố khi thực thi tệp hàng loạt trong sự kiện trước khi xây dựng

echo bar 

Khi tôi đặt trước sự kiện xây dựng dòng lệnh để foo.bat, tôi nhận được lỗi sau:

The command "foo.bat" exited with code 9009.

Khi tôi đặt trước xây dựng dòng lệnh kiện để gọi foo.bat, tôi nhận được lỗi sau:

The command "call foo.bat" exited with code 1.

Tất cả những gì tôi đã đọc liên quan đến các mã nói chung chỉ ra rằng có một vấn đề với nội dung của tập tin thực thi (không có khả năng trong trường hợp này) hoặc hệ thống không thể tìm thấy tập tin thực thi.

Tệp lô hoạt động tốt từ lời nhắc lệnh. Những điều tôi đã thử: Tạo tệp bằng các công cụ khác nhau, các mã hóa khác nhau, đặt lối ra 0 trong tệp, các tác vụ xây dựng khác nhau cho tệp và sao chép tệp vào thư mục đầu ra. Tất cả đều không có may mắn.

Tôi đang thiếu gì? Nó phải là một cái gì đó đơn giản.

Cập nhật: Đúng, đơn giản là độ dài của đường dẫn quá dài. Xem câu trả lời bên dưới để biết chi tiết.

Cảm ơn!

+0

Bạn đã cố gắng cấp cho mọi người quyền truy cập để đọc/ghi? –

Trả lời

3

Dường như vấn đề của tôi là chiều dài của đường dẫn đến tệp lô. Vì đây là bằng chứng về khái niệm tôi cho phép VS tạo ra nó ở vị trí mặc định:

C:\Documents and Settings\UserXXX\My Documents\Visual Studio 2010\Projects\SolutionXXX\ProjectXXX\foo.bat

Ngay sau khi tôi chuyển giải pháp đến một địa điểm có đường đi ngắn hơn, nó hoạt động tốt. = P

Cảm ơn bạn đã đề xuất!

4

Có thể bạn có một số khác foo.bat ở đâu đó trong số PATH. Cố gắng chỉ định đường dẫn đầy đủ đến tệp lô của bạn như C:\Path\to\foo.bat.

Khi dự án đang được xây dựng, thư mục hiện tại là dự án có tệp .vcproj. Đường dẫn lệnh phải được chỉ định liên quan đến thư mục này, nếu nó không nằm trong số PATH.

Một điều nữa để cố gắng chẩn đoán vấn đề sẽ được chỉ định cmd trong lệnh sự kiện xây dựng trước một cách rõ ràng như thế này:

cmd /c C:\Path\to\foo.bat 

hoặc thậm chí

C:\windows\system32\cmd.exe /c C:\Path\to\foo.bat 
+1

Lúc đầu, tôi đã thử '$ (SolutionDir) Scripts \ PostBuild.bat' ban đầu, nhưng sau đó đã đưa ra mã lỗi 9009. Khi tôi sử dụng' cmd $ (SolutionDir) Scripts \ PostBuild.bat' nó làm việc cho tôi, cảm ơn! Kiểm tra tệp bat của tôi chứa một dòng duy nhất 'thoát 0' không có khoảng trắng nào khác. – HodlDwon

+0

xin lỗi, điều này thực sự không hoạt động, tôi đã đăng câu trả lời dưới đây, 'cmd' chỉ không hiển thị lỗi ... nhưng nó cũng không chạy tập tin thực thi – HodlDwon

1

1) xem chi tiết lỗi bằng cách Xem => Output 2) cố gắng gọi "$ (SolutionDir) \ xx \ xx.bat"

1

tôi giải quyết vấn đề bằng cách tạo ra các tập tin .bat từ cửa sổ nhà thám hiểm, và sau đó bao gồm cả nó vào dự án của tôi, thay vì tạo trực tiếp trong VS 2010.

+0

Sự khác biệt là gì? –

10

Tôi đã làm việc này và tôi hình một bức tranh trị giá một ngàn chữ, vì vậy đây là thiết lập đầy đủ trong một ảnh chụp màn hình duy nhất.

enter image description here

+0

đĩa CD vào thư mục của tập tin batch là những gì sửa chữa nó ở đây cho tôi ... khi tôi trực tiếp gọi 'c: \ mydirectory \ mybatch.bat' nó không hoạt động, nhưng một cd để 'c: \ mydirectory' và sau đó một cuộc gọi đến 'mybatch.bat' không hoạt động ... cảm ơn! –

+0

Điều đó làm việc hoàn hảo với tôi! – Homam

-2

Nhấp chuột phải dự án -> chọn Properties -> chọn sự kiện xây dựng Tab Rồi Xóa Pre-Build dòng sự kiện nhận xét.

+1

Điều đó không * khắc phục được sự cố khi cố gắng thực thi lô, phải không? Nó chỉ loại bỏ nguyên nhân. – SlapY

1

Thư mục làm việc hiện tại của các sự kiện dựng sẵn và sau xây dựng là thư mục đầu ra được chỉ định bởi macro $ (OutDir), không phải thư mục dự án.

Các thẻ sau đây trong "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.targets" định này:

<Target 
    Name="PreBuildEvent" 
    Condition="'$(PreBuildEvent)'!=''" 
    DependsOnTargets="$(PreBuildEventDependsOn)"> 

    <Exec WorkingDirectory="$(OutDir)" Command="$(PreBuildEvent)" /> 
</Target> 

<Target 
    Name="PostBuildEvent" 
    Condition="'$(PostBuildEvent)' != '' and ('$(RunPostBuildEvent)' != 'OnOutputUpdated' or '$(_AssemblyTimestampBeforeCompile)' != '$(_AssemblyTimestampAfterCompile)')" 
    DependsOnTargets="$(PostBuildEventDependsOn)"> 

    <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" /> 
</Target> 
0

Vấn đề tôi nghi ngờ là có một nhân vật SPACE trong đường dẫn thư mục của bạn.

Vì vậy, lệnh này có lẽ sẽ làm việc cho c:\development\projectABC\foo.bat nhưng không phải cho c:\development\project ABC\foo.bat

Ít nhất đó là vấn đề đối với tôi, có thể có những vấn đề khác, nhưng tôi nghi ngờ điều này là phổ biến nhất. Giải pháp: đặt dấu ngoặc kép xung quanh bạn gọi hàng loạt:

"c:\development\project ABC\foo.bat" 
Các vấn đề liên quan