2013-02-15 9 views
17

Tôi nhận được lỗi 800A0414 trong dòng 7 và 12 của kịch bản này:Không thể sử dụng dấu ngoặc khi gọi một Lỗi Sub 800A0414 VBS

Module Module1 

    Dim p 

    Sub Main() 
     CreateObject("Wscript.Shell").Run("program.bat", 0, True) 

     p = Process.GetProcessesByName("program") 
     If p.Count > 0 Then 
      WScript.Sleep(300000) 
     Else 
      CreateObject("Wscript.Shell").Run("program clean up.bat", 0, True) 
     End If 

    End Sub 

    Private Function WScript() As Object 
     Throw New NotImplementedException 
    End Function 

End Module 

Tôi cố gắng để chạy một kịch bản hàng loạt, bắt đầu một quá trình, sau đó đợi cho đến khi quá trình chấm dứt, sau đó chạy một tập lệnh batch khác. Tôi cũng không muốn bất kỳ hộp lệnh nào được hiển thị. Nếu họ là một cách dễ dàng hơn xin vui lòng cho tôi biết.

Nhờ sự giúp đỡ của bạn

Trả lời

42

Khi bạn gửi kèm theo danh sách đối số của một thủ tục trong dấu ngoặc đơn, bạn phải sử dụng Call keyword:

Call CreateObject("WScript.Shell").Run("program.bat", 0, True) 

Nếu bạn bỏ qua các từ khóa Call, bạn cũng phải thả ngoặc:

CreateObject("WScript.Shell").Run "program.bat", 0, True 
+1

Dường như có ngoại lệ cho phép bạn sử dụng dấu ngoặc đơn nếu bạn chỉ sử dụng thông số đầu tiên. I E. 'CreateObject (" Wscript.Shell "). Chạy (" chương trình.bat ")' hoạt động mà không có khiếu nại – BeowulfNode42

+0

@ BeowulfNode42: '.Run (" program.bat ")' là cú pháp hợp lệ - nó được hiểu là 'Call ... Run ((" program.bat "))'. đối số cụ thể buộc đối số này được thông qua 'ByVal' thay vì' ByRef'. Nói cách khác, 'MySub (param)' sẽ hoạt động nếu sub đang chờ đối số 'ByVal', nhưng sẽ không hoạt động nếu nó đang chờ' ByRef' Để biết chi tiết, xem [ByRef và ByVal trong VBScript] (http://stackoverflow.com/q/1537819/113116) – Helen

-1

Dường như với tôi đây là VB.NET, không phải mã VBScript. Bạn có Shell function trong VB.NET (và các phương thức khác).

Dù sao, Run trả về bất kỳ mã lỗi nào được chương trình trả lại và nếu bạn lưu trữ kết quả trong một biến, bạn có thể sử dụng dấu ngoặc đơn trong trường hợp này.

Dim lResult As Long 
lResult = CreateObject("Wscript.Shell").Run("program.bat", 0, True) 

Phần còn lại được trả lời bởi @Helen.

7

Để hoàn thành những gì đã nói trước:

Khi Call từ khóa được sử dụng để gọi một thủ tục (tức là phụ hoặc chức năng) các đối số phải được kèm theo trong ngoặc đơn, trừ khi các thủ tục không có người đối số trong trường hợp dấu ngoặc đơn là tùy chọn. Ví dụ như tất cả các báo cáo:

Call test() 
Call test 
Call test(1,2) 

có giá trị, nhưng không phải cái này:

Call test 1 

Khi gọi một thủ tục mà không sử dụng các cuộc gọi từ khóa, các dấu ngoặc đơn có thể chỉ được sử dụng khi một trong hai thủ tục có số không hoặc một đối số hoặc quy trình có giá trị trả về (nghĩa là hàm ) và giá trị của nó được sử dụng trong tuyên bố tương tự. Ví dụ: tất cả các câu lệnh:

test() 
test(1) 
test(1,2) 
a = test 
a = test(1,2) 
a = test(test(1,2),2) 

hợp lệ, ngoại trừ trường hợp thứ ba có nhiều đối số. Trong trường hợp nó không rõ ràng, cuộc gọi bên trong của "test" trong câu lệnh cuối cùng là hợp lệ vì giá trị trả về của nó được sử dụng như một đối số cho một cuộc gọi khác.

Lưu ý rằng bất cứ khi nào ngoặc được sử dụng trong văn bản này, nó có nghĩa là để ngụ ý các giá trị dấu phẩy -separated thể là tốt.

+0

Lưu ý: 'test (1)' không giống với 'test 1'. để 'Kiểm tra cuộc gọi ((1))', trong đó dấu ngoặc đơn xung quanh đối số (không phải danh sách đối số) buộc đối số được chuyển 'ByVal' thay vì' ByRef'. Xem [ByRef và ByVal trong VBScript] (http://stackoverflow.com/q/1537819/113116) để biết chi tiết. – Helen