Чи можу я передати аргумент 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 \'" можливо?

Бонусне запитання: Чи потрібно очищати передану змінну за допомогою "Встановити workFolder = Нічого", або VBSCript робить це автоматично, коли вона закінчується? Можливо, "Встановити файл = Нічого" та "Встановити FSO = Нічого" також непотрібно? Будь ласка, повідомте мене, якщо ви знаєте відповідь на обидва ці запитання.

Відповіді:


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-об'єкт до завершення дії вашого сценарію. Це лише коротка відповідь на ваше бонусне запитання. Ви знайдете більше інформації в таких супутніх питаннях:

Чи потрібно встановлювати для об’єктів значення „Нічого” всередині функцій VBA

Коли потрібно встановити для змінної значення “Нічого” у VB6?


Бінго, ось і все! Дуже зрозуміло, велике спасибі. (Бонусне питання все ще відкрите, якщо хтось хоче відповісти на нього в одному з цих коментарів.)
Пітер,

@Peter: Я додав коротку відповідь на ваше бонусне запитання.
Dirk Vollmar

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

Насправді це не призведе до помилки, якщо не встановлено явний параметр, і в цьому випадку нічого не буде працювати, оскільки нічого не визначено. Це правда щодо змінної, однак вона не потрібна, тоді знову ж таки не є об'єктами FSO або FILE, і можна використовувати простий за допомогою. Можливе безліч різних підходів ... :)
unrealtrip

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

Щоб відповісти на ваше бонусне запитання, загальною відповіддю є ні, вам не потрібно встановлювати змінним значення "Нічого", якщо коротко. Скрипти VBS, подібні до вашого, які викликаються Wscript або Cscript.

Причиною того, що ви можете зробити це в середині довшого сценарію, є повернення пам'яті в операційну систему, яку в іншому випадку містив би VB. У наші дні, коли 8 Гб оперативної пам'яті є типовим і 16 Гб + відносно поширеним, це навряд чи матиме якийсь вимірюваний вплив, навіть на величезний сценарій, який має кілька мегабайт в одній змінній. На даний момент це свого роду затримка з тих часів, коли ви могли працювати з 1 МБ або 2 МБ оперативної пам'яті.

Ви маєте рацію, як тільки ваш скрипт .VBS завершується, всі ваші змінні знищуються, і пам’ять все одно відновлюється. Встановлення змінних у значення "Нічого" просто пришвидшує цей процес і дозволяє робити це в середині сценарію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.