1

Тема: VBS: Конфигурационный файл. Структура.

Существует задача создать конфигурационный файл для скрипта VBS, который будет работать с маской файлов.
(Скрипт будет считывать конфигурацию конфигурационного файла и в зависимости от маски файлов, файл будет копироваться по определенному направлению)

Один из вариантов структуры, который я думал использовать:
При работе с конфигурационными файлами можно считывать параметры управления скрипта построчно и при помощи Split разделять те или иные параметры. Например:

маска(шаблон); путь копирования 1;путь копирования 2;путь копирования n

Кто какие варианты еще может подсказать,  как лучше сделать данную задачу?
Какие обычно структуры конфигурационных файлов бывают, что б может выбрать лучшую для данной задачи?
Какими методами VBS потом считать данные параметры конфигурационного файла?

2

Re: VBS: Конфигурационный файл. Структура.

Ini-файл. Маска - секция, ключи (0,1,2,3,..) - пути. Работать через подключаемые компоненты (JSSys3, AutoItX3 и т.д.).

3

Re: VBS: Конфигурационный файл. Структура.

XML

4

Re: VBS: Конфигурационный файл. Структура.

Спасибо с Ini интересный вариант. Выглядеть будет вот так :
'Раздел путей
0 "C:\1"
1 "C:\2"
2 "C:\3"
3 "D:\1"

'Раздел масок
12345678.xls;0;1;2;3
87654321.xls;0;1;2;3

Верно?

Как я понимаю в обоих предложенных вариантах необходимо подключать и скачивать дополнительные библиотеки ?
А нельзя ли стандартным набором обработать который имеется в Windows ?
А XML обрабатывать тоже какую-то желательно библиотеку подключать ?

5

Re: VBS: Конфигурационный файл. Структура.

Верно?

Неверно. ini-файл имеет чётко выраженную структуру, например:

; Раздел путей
[Paths]
"Path0"="C:\1"
"Path1"="C:\2"
"Path2"="C:\3"
"Path3"="D:\1"

; Раздел масок
[Masks]
"Mask0"="12345678.xls;0;1;2;3"
"Mask1"="87654321.xls;0;1;2;3"

XML труднее редактировать ручками, но проще работать программно, поскольку, как правило, библиотека есть в комплекте. Второе — мы не ограничены двумя уровнями вложенности, в отличие от ini-файла, например (соответствия между примером xml и предыдущим примером ini нет):

<?xml version="1.0" encoding="utf-8"?>
<Templates>
  <Template Name="Template1" Mask="12345678.xls">
      <Paths>
        <Path Name="C:\1" />
        <Path Name="C:\2" />
        <Path Name="C:\3" />
        <Path Name="D:\1" />
      </Paths>
  </Template>
  <Template Name="Template2" Mask="87654321.xls">
      <Paths>
        <Path Name="C:\1" />
        <Path Name="C:\2" />
        <Path Name="C:\3" />
        <Path Name="D:\1" />
      </Paths>
  </Template>
</Templates>

А XML обрабатывать тоже какую-то желательно библиотеку подключать ?

Option Explicit

Dim strIniFile


Dim objFSO
Dim strPath2Ini

Dim objDOMDocument
Dim objXMLDOMElement
Dim objXMLDOMSelection

strIniFile = "config.xml"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strPath2Ini = objFSO.BuildPath(objFSO.GetParentFolderName(WScript.ScriptFullName), strIniFile)

If objFSO.FileExists(strPath2Ini) Then
    Set objDOMDocument = WScript.CreateObject("MSXML2.DOMDocument")
    
    If objDOMDocument.load(strPath2Ini) Then
        Set objXMLDOMSelection = objDOMDocument.selectNodes("Templates/Template")
        
        WScript.Echo "Total:", objXMLDOMSelection.length
        WScript.Echo
        
        For Each objXMLDOMElement In objXMLDOMSelection
            WScript.Echo objXMLDOMElement.nodeName
            
            With objXMLDOMElement.attributes
                WScript.Echo "Name:", .getNamedItem("Name").nodeValue
                WScript.Echo "Mask:", .getNamedItem("Mask").nodeValue
            End With
            
            WScript.Echo
        Next
    Else
        WScript.Echo "Can't load ini file [" & strPath2Ini & "]."
        WScript.Quit 2
    End If
    
    Set objDOMDocument = Nothing
Else
    WScript.Echo "Can't find ini file [" & strPath2Ini & "]."
    WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0

6 (изменено: Flasher, 2014-03-10 22:44:07)

Re: VBS: Конфигурационный файл. Структура.

wildwolf007 пишет:

Верно?

В данном случае имелось в виду это:

[12345678.xls]
0="C:\1"
1="C:\2"
2="C:\3"
3="D:\1"


wildwolf007 пишет:

Как я понимаю в обоих предложенных вариантах необходимо подключать и скачивать дополнительные библиотеки ?

В первом случае для упрощения работы - да.

wildwolf007 пишет:

А нельзя ли стандартным набором обработать который имеется в Windows ?

Можно парсить через Filter/InStr/Mid/Left, но тогда пропадает смысл использовать такую структуру.

wildwolf007 пишет:

А XML обрабатывать тоже какую-то желательно библиотеку подключать ?

Msxml2.DOMDocument - встроенная. Выше примеры.

7 (изменено: Rom5, 2014-03-11 12:50:44)

Re: VBS: Конфигурационный файл. Структура.

Flasher пишет:
wildwolf007 пишет:

А нельзя ли стандартным набором обработать который имеется в Windows ?

Можно парсить через Filter/InStr/Mid/Left, но тогда пропадает смысл использовать такую структуру.
[...]

К слову: разбивать строку "имя=значение" удобно через создание временного массива функцией "Split", код типа такого:


Dim arrTmp
arrTmp = Split(myString, "=")
If Ubound( arrTmp )=1 Then 'был разделитель "=", в arrTmp(0) - имя, в arrTmp(1) - значение
 

, а хранить-искать значения, если есть необходимость, удобно в словарях - "Scripting.Dictionary".

WBR. Roman

8

Re: VBS: Конфигурационный файл. Структура.

Rom5 пишет:

через создание временного массива функцией "Split"

Filter только через массив и работает, поэтому Split подразумевался.

9

Re: VBS: Конфигурационный файл. Структура.

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

Последний вопрос. В чем плюс использования INI файла ведь можно обойтись обычным текстовичком?

10 (изменено: Flasher, 2014-03-12 03:14:56)

Re: VBS: Конфигурационный файл. Структура.

wildwolf007 пишет:

В чем плюс использования INI файла ведь можно обойтись обычным текстовичком?

Плюсы, что очевидно, функциональные - ресурсоёмкость и скорость чтения/записи результатов.

11

Re: VBS: Конфигурационный файл. Структура.

В чем плюс использования INI файла

Стандартизация. Явно видно, что и как.

12

Re: VBS: Конфигурационный файл. Структура.

Я создал 2 файла:

1.txt

12345678.xls = C:\ = D:\
12345678.xls = C:\ = D:\
12345678.xls = C:\ = D:\

1.ini

12345678.xls = C:\ = D:\
12345678.xls = C:\ = D:\
12345678.xls = C:\ = D:\

И в первом и во втором случая я прекрасно вижу как все настроено стандартизация у них будет одинаковая. Функциональные скорость записи у ini будет шустрее верно я понимаю? Но как-то подозрительно открывать и тот и тот файлик будем одинаково в память, а там уже будем считывать настройки.

Ресурсоемкость  файлы если у них был размер 100 кб если я буду использовать ini он не станет 50 кб так и останется 100кб.

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

Побороздил просторы интернет нашел кое какие более весомые аргументы по поводу INI

"
Многие программы открывают и работают с INI-файлами напрямую, минуя официальный API. Это означает, что теперь формат INI-файлов фиксирован и мы не можем его поменять. Даже если бы мы захотели добавить что-то (безопасность на ключи или вложенность) - мы не смогли бы этого сделать. Что ещё хуже, многие программы содержат ошибки или ограничения в своих парсерах INI-файлов, так что на практике вы можете столкнуться с ситуацией, когда вы не можете хранить строку длиннее 70 символов, иначе вылетит другая программа, которая читает этот файл.
INI-файлы имеют ограничение в максимальный размер - не более 32 Кб.
"
Ссылка на источник http://www.transl-gunsmoker.ru/2010/05/ini.html

Но формально для обработки в VBS такой ситуации скорее всего не будет. И остается один плюс так это значок .
Кстати можно использовать так же *.inf

Жду опровержения моего мнения - может оно ошибочно. В споре рождается истина.

P.S.
Прошу прощения если кого-то обидел, не хотел.

13

Re: VBS: Конфигурационный файл. Структура.

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

Кто будет открывать и в какую память, не понял? Ключи в приведённых компонентах читаются скорее всего API-шными средствами. Для редакции секций там, видимо, уже свои парсеры.

Ресурсоемкость  файлы если у них был размер 100 кб если я буду использовать ini он не станет 50 кб так и останется 100кб.

Размер файла тут роли особой не играет.

14

Re: VBS: Конфигурационный файл. Структура.

Видимо я Вас не понял я думал использовать: Set vStream = objFso.OpenTextFile("C:\1.ini", 1, True), f c API пока не знаком начал изучать.

15

Re: VBS: Конфигурационный файл. Структура.

В данном случае не надо с ним знакомиться, надо знакомиться с методами объектов.

16

Re: VBS: Конфигурационный файл. Структура.

Спасибо. С каждым разом все новое и новое.

17 (изменено: TAOSoft, 2017-04-28 08:00:25)

Re: VBS: Конфигурационный файл. Структура.

Здравствуйте уважаемые!

А подскажите пожалуйста, как из этого примера, по мимо получения значений для Name и Mask, получить значения  тегов:
        <Path Name="C:\1" />
        <Path Name="C:\2" />
        <Path Name="C:\3" />
        <Path Name="D:\1" />

Заранее благодарен за ответ.

18

Re: VBS: Конфигурационный файл. Структура.

TAOSoft
Почему нарушаете? Цитата всего поста заменена ссылкой.

strIniFile = "config.xml"

With CreateObject("MSXML2.DOMDocument") 
   If .load(strIniFile) Then
      For Each objXMLDOMElement In .selectNodes("Templates/Template/Paths/Path")          
         WSH.Echo "Path:", objXMLDOMElement.attributes.getNamedItem("Name").nodeValue
      Next
   End If
End With

19 (изменено: TAOSoft, 2017-04-28 12:10:48)

Re: VBS: Конфигурационный файл. Структура.

Flasher

Прошу прощения за нарушение оформления поста, не подумал про ссылку на пост, поэтому завернул в спойлер. Буду знать теперь как ссылаться на ранний пост.

Возможно я не верно сформулировал мысль при своем вопросе, но мне нужно одномоментно получить и Name и Mask и содержимое тега Path Name. Что то пипа:
Name="Template1" Mask="12345678.xls Name="C:\1"
Name="Template1" Mask="12345678.xls Name="C:\2"
Name="Template1" Mask="12345678.xls Name="C:\3"
Name="Template1" Mask="12345678.xls Name="D:\1"

20

Re: VBS: Конфигурационный файл. Структура.

Так?:

XMLFile = "config.xml"

With CreateObject("Msxml2.DOMDocument")
  .Load(XMLFile)
  For Each N In .selectNodes("Templates/Template/Paths/Path")
	Set PN = N.parentNode : MsgBox _
	"Name=""" & PN.parentNode.attributes.getNamedItem("Name").text & """ " &_
	"Mask=""" & PN.parentNode.attributes.getNamedItem("Mask").text & """ " &_
	"Path=""" & N.attributes.getNamedItem("Name").text & """"
  Next
End With

21

Re: VBS: Конфигурационный файл. Структура.

Flasher
Спасибо большое Вам! То что мне и надо.

22 (изменено: TAOSoft, 2017-04-29 13:44:48)

Re: VBS: Конфигурационный файл. Структура.

Flasher

Извиняюсь за наглость, но не могли бы вы подсказать для такого xml файла как будет правильно выглядеть код, выводящий результат:

name=LocalPath serializeAs=String c:\
name=RemotePath serializeAs=String \\server\Share




<configuration>
	<applicationSettings>
		<App.Settings>
			<setting name="LocalPath" serializeAs="String">
				<value>c:\</value>
			</setting>
			<setting name="RemotePath" serializeAs="String">
				<value>\\server\Share</value>
			</setting>
		</App.Settings>
	</applicationSettings>
</configuration>

Заранее благодарен за ответ.

23

Re: VBS: Конфигурационный файл. Структура.

TAOSoft
Финишные знаки препинания в предложениях обязательны.
Будьте любезны расставить и делать так впредь. Отвечу после.

24

Re: VBS: Конфигурационный файл. Структура.

XMLFile = "config.xml"

With CreateObject("Msxml2.DOMDocument")
  .Load(XMLFile)
  For Each N In .selectNodes("configuration/applicationSettings/App.Settings/setting")
	MsgBox "name=" & N.attributes.getNamedItem("name").text & " " & _ 
	"serializeAs=" & N.attributes.getNamedItem("serializeAs").text & " " & N.childNodes(0).text
  Next
End With

25

Re: VBS: Конфигурационный файл. Структура.

Можно ещё чуть короче:


With CreateObject("Msxml2.DOMDocument")
	.Load("config.xml")
	For Each n In .selectNodes("configuration/applicationSettings/App.Settings/setting")
		MsgBox "name=" & n.getAttribute("name") & " " & _ 
		"serializeAs=" & n.getAttribute("serializeAs") & " " & N.childNodes(0).text
	Next
End With
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !