Могу ли я передать аргумент VBScript (файл vbs, запускаемый с помощью cscript)?


85

У меня есть этот сценарий, сохраненный в "test.vbs":

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(workFolder &"\test.txt", 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Когда я запускаю сценарий, я хочу передать значение переменной «workFolder».

Как я могу это сделать? Могу ли я это сделать? Что-то вроде "cscript test.vbs workFolder: 'C: \ temp \'"?

Дополнительный вопрос: необходимо ли очищать переданную переменную с помощью «Set workFolder = Nothing» или VBSCript делает это автоматически после завершения работы? Может быть, "Set File = Nothing" и "Set FSO = Nothing" тоже не нужны? Пожалуйста, дайте мне знать, если вы знаете ответ на оба эти вопроса.

Ответы:


138

Вы можете использовать WScript.Arguments для доступа к аргументам, переданным вашему скрипту.

Вызов скрипта:

cscript.exe test.vbs "C:\temp\"

Внутри вашего скрипта:

Set File = FSO.OpenTextFile(WScript.Arguments(0) &"\test.txt", 2, True)

Не забудьте проверить, действительно ли вашему скрипту был передан аргумент. Вы можете сделать это, проверив Countсвойство:

if WScript.Arguments.Count = 0 then
    WScript.Echo "Missing parameters"
end if

Если ваш скрипт завершился после закрытия файла, тогда нет необходимости устанавливать переменные в Nothing. Ресурсы будут очищены автоматически после завершения процесса cscript.exe. Установка переменной вNothingОбычно необходима только в том случае, если вы явно хотите освободить ресурсы во время выполнения вашего скрипта. В этом случае вы должны установить переменные, содержащие ссылку на COM-объект Nothing, которые освободят COM-объект до завершения вашего скрипта. Это всего лишь краткий ответ на ваш вопрос о бонусе, дополнительную информацию вы найдете в следующих связанных вопросах:

Есть ли необходимость устанавливать для объектов значение Nothing внутри функций VBA

Когда я должен установить для переменной значение «Ничего» в VB6?


Бинго, вот и все! Очень ясно, большое спасибо. (Бонусный вопрос все еще открыт на случай, если кто-то захочет ответить на него в одном из этих комментариев.)
— Питер

@Peter: Я добавил короткий ответ на ваш вопрос о бонусе.
— Дирк Фоллмар

21

Внутри VBS вы можете получить доступ к параметрам с помощью

Wscript.Arguments(0)
Wscript.Arguments(1)

и так далее. Количество параметра:

Wscript.Arguments.Count

Спасибо! (Бонусный вопрос все еще открыт на случай, если кто-то захочет ответить на него в одном из этих комментариев.)
— Питер

6

К каждому аргументу, переданному через командную строку, можно получить доступ с помощью: Wscript.Arguments.Item (0), где ноль - это номер аргумента: т.е. 0, 1, 2, 3 и т. Д.

Итак, в вашем коде вы можете иметь:

strFolder = Wscript.Arguments.Item(0) 

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(strFolder, 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

Используя wscript.arguments.count, вы можете отловить ошибку, если кто-то не введет правильное значение и т. Д.

Примеры MS Technet


Ага, спасибо, чувак. Интересно, что вам не нужно создавать экземпляр Wcript. (Бонусный вопрос все еще открыт на случай, если кто-то захочет ответить на него в одном из этих комментариев.)
— Питер

1) workFolderне определен как объект ни в приведенном выше ответе, ни в исходном вопросе, поэтому Set workFolder = Nothingдолжен вызвать ошибку. 2) Поскольку аргумент не предполагается как требующий повторного использования более одного раза, возможно, пропустите его присвоение strFolderпеременной. 3) Предлагаю использовать xвместо 0inWscript.Arguments.Item(0)
— user66001 05

На самом деле это не вызовет ошибку, если явно не задана опция, и в этом случае ничего не будет работать, поскольку ничего не было определено. Это верно в отношении переменной, однако она не нужна, опять же, ни объекты FSO, ни объекты FILE, и можно использовать простой with. Возможна
— куча

2

Вы также можете использовать именованные аргументы, которые являются необязательными и могут быть указаны в любом порядке.

Set namedArguments = WScript.Arguments.Named

Вот небольшая вспомогательная функция:

Function GetNamedArgument(ByVal argumentName, ByVal defaultValue)
  If WScript.Arguments.Named.Exists(argumentName) Then
    GetNamedArgument = WScript.Arguments.Named.Item(argumentName) 
  Else  
    GetNamedArgument = defaultValue
  End If
End Function

Пример VBS:

'[test.vbs]
testArg = GetNamedArgument("testArg", "-unknown-")
wscript.Echo now &": "& testArg

Пример использования:

test.vbs /testArg:123

0

Чтобы ответить на ваш бонусный вопрос, общий ответ - нет, вам не нужно устанавливать переменные на «Nothing» в коротких .VBS-скриптах, подобных вашему, которые вызываются Wscript или Cscript.

Причина, по которой вы можете сделать это в середине более длинного сценария, состоит в том, чтобы вернуть память операционной системе, которую в противном случае удерживал бы VB. В наши дни, когда 8 ГБ ОЗУ является типичным и 16 ГБ + относительно обычным, это вряд ли окажет какое-либо измеримое влияние, даже на огромный скрипт, который содержит несколько мегабайт в одной переменной. На данный момент это своего рода пережиток тех дней, когда вы могли работать с 1 или 2 МБ ОЗУ.

Вы правы, в момент завершения вашего .VBS-скрипта все ваши переменные будут уничтожены, а память все равно будет освобождена. Установка для переменных значения «Ничего» просто ускоряет этот процесс и позволяет делать это в середине скрипта.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.