cscript - неверный вызов процедуры или аргумент при запуске файла VBS - PullRequest
0 голосов
/ 18 ноября 2011

Я пытался использовать check_time.vbs для проверки времени Windows.

Вот сценарий: http://pastebin.com/NfUrCAqU

Может отображаться справочное сообщение:

C:\Program Files\NSClient++\scripts>cscript //NoLogo check_time.vbs /?
check_time.vbs V1.01
Usage: cscript /NoLogo check_time.vbs serverlist warn crit [biggest]

Options:
 serverlist (required): one or more server names, coma-separated
 warn  (required): warning offset in seconds, can be partial
 crit  (required): critical offset in seconds, can be partial
 biggest (optional): if multiple servers, else use default least offset

Example:
cscript /NoLogo check_time.vbs myserver1,myserver2 0.4 5 biggest

Но я получаю следующую ошибку при запуске:

C:\Program Files\NSClient++\scripts>cscript //NoLogo check_time.vbs 0.asia.pool.ntp.org 20 50
C:\Program Files\NSClient++\scripts\check_time.vbs(53, 1) Microsoft VBScript run
time error: Invalid procedure call or argument

Скриншот:

enter image description here

Выполнить вручную w32tm все еще работает нормально:

enter image description here

Что может быть причиной этого?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

Виновником является аргумент /nowarn:

w32tm /monitor /nowarn /computers:0.asia.pool.ntp.org
The following arguments were unexpected: /nowarn
Exiting with error 0x80070057

Удалите его из скрипта, и теперь он работает:

cscript //NoLogo check_time.vbs 0.uk.pool.ntp.org 20 50
NTP OK: Offset -2.4262131 secs|'offset'=-2.4262131s;20;50;
0 голосов
/ 18 ноября 2011

IIRC (53,1) указывает, что ошибка находится в строке 53. На данный момент ожидается, что массив регулярных выражений соответствует по крайней мере одному элементу (индекс 0) и одному под-совпадению (то есть объекту в позиции0 в массиве имеет свойство массива SubMatches, в котором есть хотя бы один элемент.

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

MyПредполагается, что вызов regexp не может найти что-либо для сопоставления, предположительно, потому что входная строка не в ожидаемом формате. Вы можете вывести содержимое strOutput перед этой строкой, чтобы увидеть, что оно содержит - это может быть дата /Представление времени в локализованной форме, отличной от той, для которой предназначено регулярное выражение. Вы также можете выводить содержимое input после каждого вызова objProc.StdOut.ReadLine - это покажет вам, если вызов w32tm.exe вернет полезное сообщение об ошибке, котороепропускается скриптом, который просто ищет возвращаемое значение, когда все хорошо, и игнорирует возможностьВозможность различного выхода.

...