Могу ли я передать аргумент 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
tb-mtg
источник
0

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

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

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

Джефф Грисвальд
источник