2008-09-19 29 views
5

Tôi cần thực thi tệp bó như là một phần của quy trình chưa cài đặt trong dự án trình cài đặt Windows (tiêu chuẩn trình cài đặt OOTB VS 2008-vdproj). Người ta không thể thực thi một tập tin bat trực tiếp từ các hành động tùy chỉnh trong dự án cài đặt, vì vậy tôi đã viết một tập lệnh vbs nhanh để gọi tập tin bat bắt buộc.
vbs mã:Thực thi tệp tập lệnh từ Hành động tùy chỉnh Windows Installer

Set WshShell = WScript.CreateObject("WScript.Shell") 
command = "uninstall-windows-serivce.bat" 
msgbox command 
WshShell.Run ("cmd /C " & """" & command & """") 
Set WshShell = Nothing 

Khi kịch bản này được điều hành độc lập với gỡ bỏ cài đặt, nó hoạt động một cách hoàn hảo. Tuy nhiên, khi chạy như một phần của quá trình gỡ cài đặt, nó không thực thi tệp bat (nhưng hộp thông báo được hiển thị, vì vậy tôi biết tệp vbs được gọi). Không có báo cáo lỗi (ít nhất là tôi có thể nói). Tại sao không làm việc kịch bản này như một phần của "Uninstall Tuỳ chỉnh hành động"

+0

Mục đích của tệp lô là gì, bạn đang cố loại bỏ Dịch vụ Windows thông qua tệp bó? Nếu có một số cách dễ dàng hơn để thực hiện việc này bằng cách sử dụng một lớp Trình cài đặt trong dự án dịch vụ của bạn. Hãy cho tôi biết và tôi sẽ đăng mã tôi luôn sử dụng. –

Trả lời

0

Trong lớp cài đặt của bạn, bạn có trọng phương pháp Uninstall:

Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary) 
      MyBase.Uninstall(savedState) 
      'Shell to batch file here 
    End Sub 

Và thứ hai, bạn đã đủ điều kiện đầy đủ đường dẫn đến tập tin batch?

0

Bạn đã kiểm tra xem tệp bó có nằm trong thư mục hiện tại mà kịch bản đã xem không? Tôi sẽ thêm một thông báo khác cho thấy thư mục mà nó đang sử dụng để đảm bảo rằng nó thực sự đang cố gắng thực thi tệp bó mà bạn cho rằng nó nằm ở đó.

0

Tập lệnh Windows Installer thường chạy dưới dạng Hệ thống, trừ khi bạn nói cách khác. Có thể tập tin batch của bạn cần được người dùng tương tác điều hành không?

6

tôi đã chạy vào vấn đề này cùng và vấn đề là bạn không thể gọi WScript bên trong file vbs - bạn sẽ cần phải JUST gọi CreateObject

tức.

Set WshShell = CreateObject("WScript.Shell") 
command = "uninstall-windows-serivce.bat" 
msgbox command 
WshShell.Run ("cmd /C " & """" & command & """") 
Set WshShell = Nothing 
+3

Lý do là, như tôi phát hiện ngày hôm qua, là tập tin vbs của bạn không được lưu trữ trong Windows Scripting Host, nhưng bởi chính MSI. Do đó, WMI API không có sẵn. Không có "WScript". Mặc dù có vẻ như WScript có thể truy cập (tức là "WScript.Shell"), đó chỉ là một vùng tên chứ không phải đối tượng "WScript". –

+0

WScript.Shell là đối tượng COM. Nó không giống với đối tượng WScript có sẵn khi một kịch bản được chạy qua WSH. – Cheeso

1

Bạn càng cần phân phối ứng dụng của mình, tôi càng khuyên bạn nên chống lại các hành động tùy chỉnh theo kịch bản. Tôi đã viết một bó trong quá khứ, nhưng tôi thấy rằng có quá nhiều máy tính gặp sự cố khi chạy VBScript hoặc JavaScript. Tôi đã kết thúc viết lại tất cả trong C++ để xử lý tình huống này. Dưới đây là một vài bài viết mà đưa ra một lời giải thích sâu về lý do tại sao bạn nên tránh hành động tùy chỉnh Scripted:

0

gì làm việc cho tôi là để xác định đường dẫn đầy đủ tệp .bat.

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