To complete what’s been said before:
When Call keyword is used to call a procedure (i.e. sub or function) the arguments must be enclosed in parentheses, except when the procedure has no arguments in which case the parentheses are optional. For example all the statements:
Call test()
Call test
Call test(1,2)
are valid, but not this one:
Call test 1
When calling a procedure without using the Call keyword, the parentheses can only be used when either the procedure has zero or one argument or the procedure has a return value (i.e. is a function) and its value is used in the same statement. For example all the statements:
test()
test(1)
test(1,2)
a = test
a = test(1,2)
a = test(test(1,2),2)
are valid, except the third one which has more than one argument. In case it’s not clear, the inner call of «test» in the last statement is valid because its return value is used as an argument to another call.
Note that whenever parentheses is used in this text, it is meant to imply the possible comma-separated values as well.
I am fairly new to vbs and i am writing a script that checks what version of a program is installed and update it if necessary. I have the updates in a folder and it checks (or should) the kbnumber and the title to make sure its the correct update.
I keep getting error code 800a0414 on the following line, and i have looked everywhere and tried many ways of placing the parentheses, taking them away or using call.
Else InStr(1, update.title, "Internet Explorer 8", vbtextcompare) > 0 Then
Installed = installHotFix(ie9RegExp)
Also here if you could look at this and help me with it, I can’t tell if it will work since the compiler gets stuck on the above issue. I dont want to flood the site with another question once the 800a0414 is resolved. I thank you in advance.
Set ie7RegExp = "^IE7.*strKBNumber.*"
Set ie8RegExp = "^IE8.*strKBNumber.*"
Set ie9RegExp = "^IE9.*strKBNumber.*"
If InStr(1, update.title, "Internet Explorer", vbtextcompare) > 0 Then
If InStr(1, update.title, "Internet Explorer 6", vbtextcompare) > 0 Then
Installed = installHotFix(ie7RegExp)
myRegExp = ie7RegExp
ElseIf InStr(1, update.title, "Internet Explorer 7", vbtextcompare) > 0 Then
Installed = installHotFix(ie8RegExp)
myRegExp = ie8RegExp
Else InStr(1, update.title, "Internet Explorer 8", vbtextcompare) > 0 Then
Installed = installHotFix(ie9RegExp)
myRegExp = ie9RegExp
Function installKB(strKBNumber)
Dim myRegExp
myRegExp.IgnoreCase = True
myRegExp.Pattern = strKBNumber
installHotFix(myRegExp)
End Function
Function installHotFix(objRegExp)
Dim result
Dim hotfixDir
installKB = false
For each hotfixdir in arrHotfixlocations
if objFSO.FolderExists(hotfixDir) Then
result = SearchForHotfixes(objRegExp, hotfixDir)
if result = True Then
installKB = True
End If
End If
Next
End Function
Function SearchForHotfixes(objRegExp, strFolderName)
Dim file
Dim subFolder
dim result
SearchForHotfixes = false
For Each file in objFSO.GetFolder(strFolderName).Files
If objRegExp.Test(file.name) Then
installUpdate(file)
SearchForHotfixes = true
End If
Next
For Each subFolder in objFSO.GetFolder(strFolderName).subFolders
result = SearchForHotfixes(objRegExp, subFolder)
If result = true then
SearchForHotfixes = true
End If
Next
End Function
This is just the parts i have changed, before i added the above the old script worked. So if you require more code or a better explanation to help me please ask, but i believe this is all.
Jeremy |
||||||||
1 |
||||||||
06.09.2007, 13:31. Показов 7707. Ответов 8 Метки нет (Все метки)
Есть процедура:
Так вот, когда я ее вызываю
вылетает сообщение об ошибке: В чем ошибка? |
0 / 0 / 0 Регистрация: 22.06.2007 Сообщений: 176 |
|
06.09.2007, 14:00 |
2 |
А где вызываешь … в форме?
0 |
0 / 0 / 0 Регистрация: 22.06.2007 Сообщений: 176 |
|
06.09.2007, 14:04 |
3 |
Sorry!!!
0 |
Jeremy |
|
06.09.2007, 17:33 |
4 |
я свалился не только с Delphi, но еще и с C++ я попробовал вызвать эту процедуру используя Call и все встало на свои места… Вот ты говоришь:’Убери круглые скобки’…А как процедура поймет, что перечисленные переменные к ней прилагаются или я чего-то не понимаю? |
2 / 2 / 1 Регистрация: 19.07.2007 Сообщений: 737 |
|
06.09.2007, 18:32 |
5 |
show param1, param2 Если Show — функция, то: Для передачи указателей или значений нужно объявлять так, например: end sub
0 |
ex |
|
06.09.2007, 19:19 |
6 |
+ ко всему сказанному — текст ошибки сам за себя говорит ) |
Славик |
|
07.09.2007, 16:11 |
7 |
Для подобного случая рекомендую иметь переводчика, |
Jeremy |
|
09.09.2007, 10:09 |
8 |
Спасибо всем за помощь |
0 / 0 / 0 Регистрация: 26.03.2007 Сообщений: 238 |
|
09.09.2007, 11:41 |
9 |
Использовать скобки можно, только перед вызовом надо указать команду СALL. Типа:
0 |
Вопрос:
Я получаю ошибку 800A0414 в строках 7 и 12 этого script:
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
Я пытаюсь запустить пакетный пакет script, который запускает процесс, а затем дождитесь завершения процесса, затем запустим еще одну партию script. Я также не хочу показывать какие-либо командные поля. Если их проще, пожалуйста, дайте мне знать.
Спасибо за помощь
Лучший ответ:
Когда вы вставляете список аргументов процедуры в круглые скобки, вы должны использовать ключевое слово Call
:
Call CreateObject("WScript.Shell").Run("program.bat", 0, True)
Если вы опускаете ключевое слово Call
, вы также должны отбрасывать круглые скобки:
CreateObject("WScript.Shell").Run "program.bat", 0, True
Ответ №1
Чтобы завершить сказанное ранее:
При использовании Call ключевого слова для вызова процедуры (то есть суб или функции) аргументы должны быть заключены в круглые скобки, за исключением случаев, когда процедура не имеет аргументов, и в этом случае скобки являются необязательными. Например, все утверждения:
Call test()
Call test
Call test(1,2)
действительны, но не следующие:
Call test 1
При вызове процедуры без использования ключевого слова Call круглые скобки могут использоваться только в том случае, если процедура имеет нулевой или один аргумент, или процедура имеет возвращаемое значение (т.е. является функцией) и ее значение используется в одном выражении. Например, все утверждения:
test()
test(1)
test(1,2)
a = test
a = test(1,2)
a = test(test(1,2),2)
действительны, кроме третьего, который имеет более одного аргумента. Если это не ясно, внутренний вызов “теста” в последнем утверждении действителен, потому что его возвращаемое значение используется в качестве аргумента для другого вызова.
Обратите внимание, что всякий раз, когда в этом тексте используются круглые скобки, он подразумевает также возможные значения, разделенные запятыми.
Ответ №2
Мне кажется, что это VB.NET, а не код VBScript.
У вас Функция оболочки в VB.NET(и другие методы).
В любом случае Run возвращает код ошибки, возвращаемый программой, и если вы
хранилище, которое приводит к переменной, вы можете использовать круглые скобки в этом случае.
Dim lResult As Long
lResult = CreateObject("Wscript.Shell").Run("program.bat", 0, True)
На остальное ответил @Helen.
vbscript
I am getting the 800A0414 error in lines 7 and 12 of this script:
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
I am trying to run a batch script, that starts a process, then wait until the process terminates, then run another batch script. I also do not want any command boxes being shown. If their is a easier way please let me know.
Thanks for your help
Related Question