2013-02-15 12 views
17

Dostaję błąd 800A0414 w liniach 7 i 12 tego skryptu:Nie można użyć nawiasów Dzwoniąc Sub błąd 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 

próbuję uruchomić skrypt wsadowy, który uruchamia proces, a następnie poczekaj, aż proces się zakończy, a następnie uruchom kolejny skrypt wsadowy. Nie chcę również pokazywać żadnych okien poleceń. Jeśli ich jest łatwiejszy, proszę daj mi znać.

Dzięki za pomoc

Odpowiedz

42

Kiedy ująć listę argumentów danej procedurze w nawiasie, należy użyć Call kluczowe:

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

Jeśli pominąć słowa kluczowego Call, należy również spaść nawiasów:

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

Wydaje się, że istnieje wyjątek, który pozwoli ci użyć nawiasów, jeśli użyjesz tylko pierwszego parametru. to znaczy. 'CreateObject (" Wscript.Shell ") Uruchom (" program.bat ")' działa bez zarzutu – BeowulfNode42

+0

@ BeowulfNode42: '.Run (" program.bat ")' jest prawidłową składnią - interpretowana jest jako 'Call ... Run ((" program.bat "))' .Ustawianie nawiasów wokół specyficzny argument wymusza przekazywanie tego argumentu 'ByVal' zamiast' ByRef' Innymi słowy, 'MySub (param)' zadziała jeśli sub spodziewa się argumentów 'ByVal', ale nie zadziała, jeśli oczekuje' ByRef' Aby uzyskać szczegółowe informacje, zobacz [ByRef i ByVal w VBScript] (http://stackoverflow.com/q/1537819/113116). – Helen

-1

Wydaje mi się, że jest to kod VB.NET, a nie VBScript. Masz Shell function w VB.NET (i inne metody).

W każdym razie, Run zwraca kod błędu zwrócony przez program, a jeśli użytkownik zapisze wynik w zmiennej, można w tym przypadku użyć nawiasów.

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

Resztę odpowiedział @Helen.

7

Aby wypełnić to, co zostało powiedziane wcześniej:

Kiedy Call kluczowe służy do wywołania procedury (czyli sub lub funkcja) argumenty musi być ujęty w nawiasy, wyjątkiem gdy procedura nie ma argumenty, w którym to przypadku nawiasy są opcjonalne. Na przykład wszystkie wypowiedzi:

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

są ważne, ale nie ten:

Call test 1 

Przy wywołaniu procedury bez użycia słowa kluczowego połączenia, nawiasy można tylko być stosowane, gdy albo procedura ma zero lub jeden argument, lub procedura ma wartość zwracaną (tj. jest to funkcja ), a jej wartość jest używana w oświadczeniu o tej samej nazwie:. Na przykład wszystkie stwierdzenia:

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

są ważne, z wyjątkiem trzeciego, który ma więcej niż jeden argument. W przypadku, gdy nie jest to jasne, wewnętrzne wywołanie "test" w ostatniej instrukcji jest ważne, ponieważ jego wartość zwracana jest używana jako argument do innego połączenia.

Należy zauważyć, że gdy nawiasy jest stosowane w niniejszym tekście, rozumie się jako oznaczające możliwe wartości przecinek -separated również.

+0

Uwaga: 'test (1)' to nie to samo co "test 1". to 'Call test ((1))', gdzie nawiasy wokół argumentu (nie listy argumentów) wymuszają przekazanie argumentu 'ByVal' zamiast' ByRef'. Zobacz [ByRef i ByVal w VBScript] (http: // /stackoverflow.com/q/1537819/113116) po szczegóły. – Helen