PDA

Показать полную графическую версию : [решено] VBS - переменные файла


Ragnazar
10-10-2012, 07:42
Как заставить VBS скрипт читать переменные из файла?
Есть файл var.cfg в нем примерно такой текст

anyVar=VARHERE
another.var1=Var1
another.var2=Var2

и тд. Тоесть

название.переменной=значение переменной

В java такое точно есть но нужно через VBS

Iska
10-10-2012, 07:58
Ragnazar, в VBScript переменные не могут содержать точку:
Naming Restrictions
Variable names follow the standard rules for naming anything in VBScript. A variable name:
* Must begin with an alphabetic character.
* Cannot contain an embedded period.
* Must not exceed 255 characters.
* Must be unique in the scope in which it is declared.

В остальном — пожалуйста:
Option Explicit

Dim strContent
Dim strLine

With WScript.CreateObject("Scripting.FileSystemObject")
With .OpenTextFile("E:\Песочница\0182\var.cfg")
For Each strLine In Split(.ReadAll(), vbCrLf)
WScript.Echo "Var name:", Split(strLine, "=")(0), vbTab, "Var value:", Split(strLine, "=")(1)

Execute strLine
'…or ExecuteGlobal strLine
Next

.Close
End With
End With

WScript.Quit 0

Ragnazar
10-10-2012, 08:30
Работает. Но есть два недочета
1) Пишет значение только первой строчки.
var.cfg
var1=AnyVar
var2=VarHere

Выход
Var name: var1 Var value: AnyVar
var2

2) После нажатия ОК выдает ошибку
Строка: 11
Символ: 4
Ошибка: Недопустимый знак

Самому разобрать и понять скрипт пока не получилось и я просто скопировал

Iska
10-10-2012, 08:59
Работает. Но есть два недочета
1) Пишет значение только первой строчки.
var.cfg
var1=AnyVar
var2=VarHere
Выход
Var name: var1 Var value: AnyVar
var2 »
У меня на приведённом примере:
Var name: var1 Var value: AnyVar
Var name: var2 Var value: VarHere

2) После нажатия ОК выдает ошибку
Строка: 11
Символ: 4
Ошибка: Недопустимый знак »
Ragnazar, полагаю, дело по-прежнему в именовании переменных. Выложите файл «var.cfg», упаковав его в архив.

P.S. Я предпочитаю исполнять скрипты под cscript.exe.

Ragnazar
10-10-2012, 14:49
Странно но вторая проблема прошла сама. Но вторая сточка все так-же выдает только var2
А и можно - ли сделать что-бы эти переменные можно-было использовать далее?? Не только в пределах
WScript.Echo "Var name:", Split(strLine, "=")(0), vbTab, "Var value:", Split(strLine, "=")(1)

Ragnazar
10-10-2012, 14:51
http://s018.radikal.ru/i507/1210/88/07ecd4d6039a.png
var.cfg (http://forum.oszone.net/attachment.php?attachmentid=88488&stc=1&d=1349866296)

Iska
11-10-2012, 08:50
Но вторая сточка все так-же выдает только var2 »
Как я и предполагал — Ваш файл «var.cfg» в качестве разделителя строк использует не стандартные для Windows «CrLf», а только «Lf», использование которых характерно для Unix [оттого-то я и просил не просто выложить содержимое файла на форум, а хотел увидеть именно сам файл и именно в архиве, дабы сохранить его целостность для последующего анализа]. Потому Вы и видели в выводе:
Var name: var1 Var value: AnyVar
var2
одну лишь, единственную переменную — var1, со значением AnyVar ↵var2 (где «↵» — Lf, LineFeed).

Выход: использовать в функции Split() разделитель «vbLf» вместо «vbCrLf», либо перейти использование в файле «var.cfg» стандартных для Windows разделителей строк.

А и можно - ли сделать что-бы эти переменные можно-было использовать далее?? Не только в пределах
WScript.Echo "Var name:", Split(strLine, "=")(0), vbTab, "Var value:", Split(strLine, "=")(1) »
А как Вы будете заранее знать, какие в файле переменные?

Опишите, что именно Вы хотите получить. Хранение значений некоторых, заранее известных, переменных между запусками скрипта?

Ragnazar
13-10-2012, 15:28
Будет лишь один скрипт а вот var.cfg будет гулять и меняться
Скрипт будет дописан с учетом всех переменных.
Лишние переменные не будут использоваться а те что отсутствуют будут с ошибками либо скрипт не продолжит работу

Iska
13-10-2012, 17:04
Ragnazar, понятней не стало.

Ragnazar
13-10-2012, 19:14
Скрипт будет основан на выведении данных в виде
Товар:%var1% Статус:%var1s%
И при добавлении новых строк в конфиг будет больше строк выводиться
Если в конфиге 4 товара
Товар:Некийтовар Статус:ОК
Товар:Другойтовар Статус:ОК
Товар:Ещетовар Статус:Нет
Товар:Товар Статус:

cfg
var1=Некийтовар
var1s=ОК
var2=Другойтовар
var2s=ОК
var3=Ещетовар
var3s=Нет
var4=Товар
var4s=

Iska
14-10-2012, 00:29
Ragnazar, тогда переменные Вам ни к чему. Это обычные данные. Используйте простой двумерный (а лучше — ассоциативный) массив.

Iska
14-10-2012, 19:40
Ragnazar, если не совсем понятно, вот пример:
Option Explicit

Dim objDictionary
Dim elem

Dim strLine


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With WScript.CreateObject("Scripting.FileSystemObject")
With .OpenTextFile("E:\Песочница\0183\var.cfg")
For Each strLine In Split(.ReadAll(), vbCrLf)
objDictionary.Add Split(strLine, "=")(0), Split(strLine, "=")(1)
Next

.Close
End With
End With

For Each elem In objDictionary.Keys
WScript.Echo "Key:", elem, vbTab, "Value:", objDictionary.Item(elem)
Next

objDictionary.RemoveAll
Set objDictionary = Nothing

WScript.Quit 0
Если же понадобится заполнять некий шаблон — Вы можете проверять существование путём «objDictionary.Exists(<Key>)».




© OSzone.net 2001-2012