28

Trong dự án Thiết lập, các tệp thi hành như ".exe, .dll, .js, .vbs" được chấp nhận nhưng không có cách nào để chạy tệp .bat trong Tác vụ tùy chỉnh.Cách chạy tệp ".bat" trong khi cài đặt?

Câu hỏi đặt ra là cách chạy các tệp *.bat trong khi cài đặt?

+2

bạn đã thử nghiệm cmd.exe với xxxx.bat làm thông số chưa? –

+0

No. Cách thực hiện việc này? – mammadalius

Trả lời

54

Vâng, sau nhiều lần tìm kiếm và dùng thử và lỗi, tôi đã giải quyết vấn đề này. Tôi không chắc đây có phải là cách tốt nhất, nhưng nó hoạt động.

Đây là kịch bản: Tôi có một ứng dụng tôi muốn triển khai thông qua dự án Thiết lập Visual Studio. Ngoài các tệp ứng dụng của tôi, tôi muốn tạo một thư mục con trong thư mục đích chứa tệp batch (.bat). Tôi muốn tệp này chạy vào cuối quá trình cài đặt.

Dưới đây là những gì bạn làm:

  1. Tạo một dự án thiết lập và cấu hình như bình thường, bao gồm các thư mục con trong đó bạn sẽ đặt tập tin thực thi của bạn (bạn chỉ có thể đặt nó trong thư mục Application trực tiếp nếu bạn không muốn nó trong thư mục con).
  2. Trong chế độ xem "Hệ thống tệp" (nhấp chuột phải vào dự án trong Solution Explorer-> View-> File System), thêm tệp lô bạn muốn thực thi cmd.exe (C: \ Windows \ System32 \ cmd.exe)
  3. Mở chế độ xem "Hành động tùy chỉnh" (nhấp chuột phải vào dự án trong Solution Explorer-> View-> Custom Actions)
  4. Nhấp chuột phải vào "Cam kết" và chọn "Thêm hành động tùy chỉnh"
  5. Điều hướng đến và chọn cmd.exe.
  6. Mở bảng thuộc tính cho tác vụ tùy chỉnh mới được tạo.
  7. Xóa/Cam kết khỏi thuộc tính Đối số.
  8. Nhập: /c "[TARGETDIR]subdirectoryname\batchfile.bat" trong thuộc tính Đối số, nơi subdirectoryname phải được thay thế bằng tên của thư mục con của bạn (nếu bạn đặt tệp bó trong thư mục con như tôi đã làm ... nếu không, giá trị sẽ là /c "[TARGETDIR]batchfile.bat") và batchfile.bat phải là tên tệp của tệp lô của bạn.

Vậy đó. Tập tin thực thi sẽ được thực hiện sau khi hoàn tất quá trình cài đặt.

Dưới đây là một ví dụ vì lợi ích của sự rõ ràng:

tập tin thực thi của tôi: blah.bat
thư mục con của tôi: mydir

Giá trị của luận cứ để nhắm mục tiêu hành động tùy chỉnh của tôi cmd. exe sau đó sẽ là

/c "[TARGETDIR]mydir\blah.bat"

Hy vọng rằng hel ps ai đó!

+6

Là một phụ lục, tôi thấy rằng chạy cmd.exe đóng gói (trái ngược với cmd.exe trong thư mục System32) biến tất cả các thông báo lỗi từ một câu lệnh thông tin thành những thứ như "Hệ thống không thể tìm thấy nội dung tin nhắn cho số tin nhắn 0x8" . Để giải quyết vấn đề này, bạn có thể (nếu bạn biết chắc chắn rằng sẽ tồn tại cmd.exe trong System32 trên máy tính đích) sử dụng '/ c cmd.exe/c" TARGETDIR] subdirectoryname \ batchfile.bat "'. Điều này sẽ làm cho cmd.exe đóng gói để gọi cmd.exe gốc trên máy tính đích, sẽ cung cấp thông báo lỗi đúng. –

+1

Cảnh báo: phương pháp này không hoạt động nếu thiết lập được tạo trong Windows 10 và được thực thi trong Windows 7 !! – Lumo

+0

@Lumo: chỉ để biết thông tin; tùy chọn với 'vbs' hoạt động độc lập với hệ điều hành. – Stefan

0

Nếu bạn đang cố gắng chạy tệp lô có đường dẫn tương đối trong quá trình cài đặt, điều đó sẽ không chắc chắn. Đó là bởi vì tập tin batch sẽ đưa vào tài khoản thư mục nơi trình cài đặt đang chạy, và không phải nơi các tập tin đã được cài đặt. Sử dụng trình xây dựng trình cài đặt sao chép tệp lô vào thư mục tạm thời.

4
  1. Kiểm tra bài viết này (bài viết không được chấp nhận), mặc dù trong VB.NET cũng áp dụng cho C#. Phần quan trọng nhất là (dịch sang C#) tạo Thư viện Lớp mới và thêm Lớp Trình cài đặt mới với nội dung sau: Như đã nêu trong bài viết, bạn có thể tạo một hành động tùy chỉnh mới với tham chiếu đến dự án vừa tạo của bạn.

    override void Commit(IDictionary savedState) 
    { 
        base.Commit(savedState); 
        System.Diagnostics.Process.Start("myApp.bat","your bat arguments"); 
    } 
    
  2. Bây giờ chúng tôi đang thêm tệp lô vào dự án trình cài đặt của bạn. Tạo một dự án thiết lập và cấu hình như bình thường, bao gồm thư mục con mà bạn sẽ đặt tập tin batch của bạn (bạn chỉ có thể đặt nó trong Thư mục Ứng dụng trực tiếp nếu bạn không muốn nó trong thư mục con).

  3. Trong chế độ xem "Hệ thống tệp" (nhấp chuột phải vào dự án trong Solution Explorer-> View-> File System), thêm tệp lô mà bạn muốn thực thi.

  4. Tạo dự án trình cài đặt.

4

Một cách khác để đạt được kết quả tương tự là đặt tệp .vbs trong hành động tùy chỉnh chạy tệp .bat tương ứng. Mã sau đây là "RunRegisterComponents.vbs" Tôi đặt trong thư mục ứng dụng thiết lập. Tất nhiên tôi đặt [TARGETDIR] dưới dạng tham số .vbs trong cửa sổ thuộc tính Visual Studio.

dim WshShell 
Set WshShell = CreateObject("WScript.Shell") 

' Read the "CustomActionData" property holding the install directory. 
dim programDir 
programDir= property("CustomActionData") 

' Make the batch full file name and parameter 
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) & 
programDir& chr(34) 

' Set the current directory 
WshShell.CurrentDirectory = programDir 

' Run batch. 
ret = WshShell.Run (commandString, 0, 0) 

Đó là khi tôi thiết lập hành động tùy chỉnh của tôi:

enter image description here

Tôi hy vọng điều này có thể giúp bạn!

+0

Tôi vẫn nghĩ đây là lựa chọn tốt hơn vì nó không phụ thuộc vào 'cmd.exe'. – Stefan

+0

Bạn đang đặt 'WshShell.CurrentDirectory' vào thư mục cài đặt (' [TARGETDIR] '), không phải là dự phòng để đặt' programDir' trong 'commandString' trước' RegisterComponents.bat'? – Wolf