Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Iska, Скобки там не существенны, »
megaloman, согласен.

Собственно, всю разницу можно увидеть на таком примере:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strValue


strValue = "AAAA"
SomeSub strValue
WScript.Echo "strValue = " & strValue

WScript.Echo

strValue = "AAAA"
SomeSub (strValue)
WScript.Echo "strValue = " & strValue

WScript.Quit 0

Sub SomeSub(anyValue)
	WScript.Echo "anyValue before = " & anyValue
	anyValue = anyValue & "+" & anyValue
	WScript.Echo "anyValue after  = " & anyValue
End Sub
Цитата:
Код: Выделить весь код
anyValue before = AAAA
anyValue after  = AAAA+AAAA
strValue = AAAA+AAAA

anyValue before = AAAA
anyValue after  = AAAA+AAAA
strValue = AAAA

По умолчанию, в VBScript параметры передаются по ссылке (в стек кладётся не значение переменной-параметра, а ссылка на саму переменную-параметр), посему, если изменить значение аргумента внутри процедуры/функции — это отразится на значении самого переданного параметра (поскольку на самом деле работа идёт как раз с ним).

Когда аргумент заключается в скобки — тем самым сначала вычисляется выражение в скобках, а затем уже это вычисленное значение передаётся в процедуру/функцию.

В таких языках, как, например, AutoIt — там практически любой вызов оформляется скобками, а вот в VBScript — скобки используются только тогда, когда вызов осуществляется в правой части выражения. В противном случае скобки интерпретируются не как скобки при вызове процедуры/функции, а как необходимость вычисления выражения.

Когда у нас имеется несколько параметров — ничего страшного, попытка такого вызова:
Код: Выделить весь код
SomeSub (strValue1, strValue2)
приведёт к тому, что возникнет ошибка компиляции «Недопустимо использование скобок при вызове процедуры Sub». А вот если аргумент будет один, как в случае выше:
Код: Выделить весь код
SomeSub (strValue)
— компилятор просто решит, что «ничего страшного, (strValue) — это просто выражение, которое надо вычислить и затем передать его значение в процедуру/функцию».

Цитата megaloman:
Хуже, что скрипт работает корректно только при запуске посредством Wscript, с Cscript писАть в архив не хочет. »
И хочет, и пишет. Просто не успевает, поскольку метод .CopyHere() работает асинхронно, т.е., объект Folder класса Shell.Application не ждёт окончания работы метода, а сразу возвращает управление скрипту, который, соответственно, продолжает свою работу. Боюсь, что на достаточно крупных файлах «обломится» и wscript.exe (сейчас не проверялось, я уже не помню конкретики).
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:46, 07-08-2019 | #8