2010-05-10 2 views
67

У меня есть этот скрипт, сохраненный в «test.vbs»:Могу ли я передать аргумент VBScript (файл vbs, запущенный cscript)?

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 », возможно?

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

ответ

112

Вы можете использовать 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 до завершения вашего сценария. Это лишь короткий ответ на ваш бонусный вопрос, вы найдете более подробную информацию в этих взаимосвязанных вопросов:

Is there a need to set Objects to Nothing inside VBA Functions

When must I set a variable to “Nothing” in VB6?

+0

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

+0

@Peter: Я добавил короткий ответ на ваш бонусный вопрос. –

5

Каждый аргумент, передаваемый через командную строку можно получить доступ с: 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 examples

+0

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

+0

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

+0

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

16

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

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

и так далее. Номер параметра:

Wscript.Arguments.Count 
+0

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

2

Фактически ответ на вопрос о бонусе «Нет». Вам не нужно чистить. Но общая практика программирования заключается в том, чтобы всегда очищать ваши вещи, например, после вашего обеда, pls очистить вашу тарелку.

2

При обучении новых программистов правильный ответ на вопрос «должен ли я убирать?» всегда да. Если кто-то привык убирать, то он будет убираться. Затем, когда это действительно необходимо (чтобы не сделать беспорядок кучи и т. Д.), Очистка - привычка и произойдет.

Лучший вопрос: «Это вызывает проблему, если я очищу в конце этого скрипта?» или даже лучше ... »Предполагая, что я продолжаю с длинным сценарием (или у меня нет GC), это правильный способ очистки этих объектов?»

мои два цента. Paul

Смежные вопросы