Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBScript/JScript/WSH/WMI/HTA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
1

Подредактировать скрипт VBS, добавив одно условие

18.02.2018, 22:03. Просмотров 853. Ответов 39
Метки нет (Все метки)

Всем привет.
Кто поможет подредактировать скрипт VBS?

Скрипт подставляет через 3000 мс выражения из одного текстового документа в другой.
Нужно добавить условие, чтобы подставлялись только строки, которые начинаются со знака <

Т.е. чтобы остальные строки просто игнорировались и не подставлялись.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Option Explicit
'===========
'если нужно остановить, то "убить" процесс wscript вдиспетчере задач
'===========
Const count = 3 'всего путей к файлам (если 0 то путь = 1,если 1 то путь = 2,....) 
Dim wordsPath
Dim editPath
ReDim ArrayWordsPath(count)
ReDim ArrayEditPath(count)
'----------------------------------------------------------------
'Путь к файлу фраз list.txt (каждая новая фраза начинается с новой строки) 
 ArrayWordsPath(0) = "D:\Script\list.txt" 
 ArrayWordsPath(1) = "D:\Script\list.txt" 
 ArrayWordsPath(2) = "D:\Script\list.txt"
 ArrayWordsPath(3) = "D:\Script\list.txt" 
'----------------------------------------------------------------
'Путь к файлу в котором каждые X сек меняется фраза
 ArrayEditPath(0) = "D:\1\text.txt"
 ArrayEditPath(1) = "D:\2\text.txt"
 ArrayEditPath(2) = "D:\3\text.txt"
 ArrayEditPath(3) = "D:\4\text.txt"
'----------------------------------------------------------------
'Время изменения в миллисекундах
Const sleepMSec = 3000
Const ForReading = 1
Dim fso, pTable, FileSize, Index
'---------------------------------
For Index = 0 To count
    CreateFileTxt(ArrayEditPath(Index))
    WScript.Sleep 400
Next    
'---------------------------------
wordsPath = ArrayWordsPath(count)
editPath = ArrayEditPath(count) 
Initialize
Do
    WScript.Sleep sleepMSec
    '----------------------
    For Index = 0 To count
    '---------- 
        wordsPath = ArrayWordsPath(Index)
        editPath = ArrayEditPath(Index) 
    '----------     
        If fso.GetFile(wordsPath).Size <> FileSize Then
            pTable.Close
            Initialize
        End If
        ChangeText
    '----------
        WScript.Sleep 400       
    Next 
    '---------------------- 
Loop
 
Private Sub ChangeText()
    Dim pStream
    Set pStream = fso.CreateTextFile(editPath, True)
    pStream.Write pTable("FText").Value
    pStream.Close
    pTable.MoveNext
    If pTable.EOF Then pTable.MoveFirst
End Sub
 
Private Sub Initialize()
    Const adInteger = 3
    Const adVarWChar = 202
    Const adUseClient = 3
 
    Dim subStrs, i, curStr, pStream
    Set fso = CreateObject("Scripting.FileSystemObject")
    FileSize = fso.GetFile(wordsPath).Size
    Set pTable = CreateObject("ADODB.Recordset")
    pTable.Fields.Append "FText", adVarWChar, 255
    pTable.CursorLocation = adUseClient
    pTable.Open
    Set pStream = fso.OpenTextFile(wordsPath, ForReading)
    subStrs = Split(pStream.ReadAll,vbCrLf)
    pStream.Close
    For i = LBound(subStrs) To UBound(subStrs)
        curStr = Trim(subStrs(i))
        If curStr <> "" Then pTable.AddNew Array("FText"), Array(curStr)
    Next
    Set pStream = fso.OpenTextFile(editPath, ForReading)
    curStr = Trim(pStream.ReadLine)
    pStream.Close
    
    If Len(curStr) > 0 Then
        pTable.MoveFirst
        pTable.Find "FText='" & curStr & "'"
    End If
    If Not pTable.EOF Then pTable.MoveNext
    If pTable.EOF Then pTable.MoveFirst
End Sub
 
Sub InsNewText(sPath)
    Dim fso, f1
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso.CreateTextFile(sPath, True)
End Sub
 
Sub CreateFileTxt(sPath)
  Dim fso, tf
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set tf = fso.CreateTextFile(sPath, True)
  ' Записать строку с переводом на новую строку.
  tf.Write("_")
  tf.Close
End Sub
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2018, 22:03
Ответы с готовыми решениями:

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

небольшой скрипт на vbs
Здравствуйте, подскажите как лучше решить след. задание. Дано: имя компьютера...

Перестал запускаться VBS-скрипт
начиная с 04/08/2015 перестал запускаться VBS-скрипт (необходимый для 1С)...

Не обрабатывается скрипт vbs в html
Имеется скрипт vbs в html: ... &lt;script language=&quot;VBScript&quot;&gt; Sub...

Замок на txt? vbs- скрипт
Ни чего не пойму - Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;) ...

39
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
19.02.2018, 21:17 2
Vasek2, уж лучше предоставить полное ТЗ скрипта, чем "поправьте где-то что-то там" в коде с сомнительным содержанием.
Вы вообще его сами писали?
1
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
19.02.2018, 21:42  [ТС] 3
FlasherX, нет, писал не сам, а автор молчит. Я не разбираюсь в Visual Basic скриптах.
Полное тех задание: исключить подставление строки из одного документа в другой, если в строке нет первого символа <
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
19.02.2018, 22:16 4
Vasek2, считаете, что это полное техзадание для работы скрипта? Исключение в скрипте вообще не нуждается.
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
19.02.2018, 22:21  [ТС] 5
FlasherX, считаю, что это решается одной строкой или двумя.
И, да, исключение - это хоть и существительное, но оно правда не нуждается в скрипте Исключению просто не нужен скрипт, скрипт нужен мне, а в скрипте должно быть исключение
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
19.02.2018, 22:24 6
Vasek2, ну, считайте дальше. Я начал с обратного.
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
20.02.2018, 00:14  [ТС] 7
FlasherX, Вы принцип работы скрипта поняли?
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
20.02.2018, 01:09 8
Vasek2, а сами то, что я написал в первом посте, поняли? Вы предлагаете анализировать неверно работающий код вместо описания того, что от него требуется. Лучше меньше демагогии и больше обратной связи. Исходя из ответа я сам решу, что лучше, оставить как есть или сделать как полагается.
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
20.02.2018, 02:12  [ТС] 9
FlasherX, я всё понял. Просто зачем переписывать рабочий скрипт (который отработал не один месяц) ради одной строчки? Ценник переписывания скрипта будет на порядок выше, чем за одну строчку. Платить за переписывание с нуля я не готов.
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
20.02.2018, 02:31 10
Vasek2, ценник? А кто здесь (в некоммерческом разделе ) говорит про ценник?
Я сомневаюсь, что опубликованный вариант чего-то стоит, говорить о повышение на порядок (в 10 раз) так вообще выглядит безумием.
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
20.02.2018, 03:05  [ТС] 11
FlasherX, т.е. Вы готовы безвозмездно написать мне нужный скрипт?
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
20.02.2018, 03:52 12
Vasek2, а я смотрю, вы — любитель походить вокруг да около. Читайте со слов "Исходя из ответа" в #8.
То, что делается от силы за 15-20 минут, мы обсуждаем уже 6 часов.
1
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
20.02.2018, 04:10  [ТС] 13
FlasherX, согласен, скрипт простейший.

ТЗ.

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

Дополнительно.
1. Файлов (словарей), из которых берётся текст может быть несколько (в старом скрипте выше это есть).
1.1. Если количество файлов, откуда надо брать текст (словари), меньше чем количество файлов, куда надо вставлять текст, то нужно выводить ошибку "Допиши словарь в настройки!"
2. Файлов, в которые вставляется текст, может быть несколько (в старом скрипте выше это есть).
2.1. Если количество файлов, куда надо вписывать текст, меньше чем количество файлов, откуда надо брать текст (словари), то нужно выводить ошибку "Допиши цели в настройки!".
3. Вставлять строку (файл 1) только в файл (пункт 2), если она начинается с символа < (как в html тегах <html>).
4. Функция из пункта 3 должна выключаться кваром* (0/1 или true/false, не знаю, как это в WBasic). Желательно назвать квар чем-то типо ignore_symbols = true.
5. Пустые строки должны игнорироваться.
6. Нужен квар, указывающий задержку перед вставкой строки из одного документа в другой (некая pause). По дефолту нужно 3000 ms.
7. Скрипту дать имя AutoEdit_3in1.vbs
8. Кодировку UTF-8 надо бы учесть обязательно.
9. В готовом скрипте есть такой момент:
Visual Basic
1
2
3
4
For Index = 0 To count
    CreateFileTxt(ArrayEditPath(Index))
    WScript.Sleep 400
Next
... насколько я помню, это было нужно для правильной работы скрипта, чтобы он не захлёбывался.

Схема работы:
Строка из файла 1 -> Строка в файл 1
Строки должны заменяться, а не добавляться ниже предыдущей. Т.е. удаляется старая строка, пишется новая.

* квар - это настройка, значение, переменная.
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
20.02.2018, 04:49 14
Vasek2
1. В скрипте я вижу массив с одним и тем же путём (строки 12-15). Как это соотносится с "несколько"?
2. У файлов всегда путь отличается только номерной папкой? Если да, то проще сопоставить число словарей с нумерацией родительских папок редактируемых файлов.
3. Стоило сразу написать (а не снизу), что речь о замене, а не вставке. О какой именно строке речь? Угловая скобка не может быть единственным критерием. Сама скобка в источнике или получателе? Или и там и там? Замена единственная и множественная?
4. А какую тогда менять строку, если отсутствует критерий поиска? Просто добавлять снизу?
7. Делается самостоятельно.
8. А в исходнике она не учтена вообще-то. Может, можно UTF-16?
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
20.02.2018, 15:25  [ТС] 15
FlasherX,
1. Это из одного документа строки вставляются в другие. Один и тот же документ.
2. Нет, это пример путей. Пути могут быть любые (в т.ч. буквы).
3. Речь о замене, я на горячую писал тз. Строки подставляются подряд: первая, затем вторая, третья и т.д., через заданный квар времени (3000 ms). Строка копируется полностью. Скобка - это показатель того, что строка должна быть скопирована и вставлена в файл. Если первый символ не скобка, то строку игнорировать и не копировать. Т.е. если строка в словаре начинается с <, то её нужно скопировать в файл, если начинается с любого другого символа, то игнорировать строку из словаря и перейти к другой.
4. Нет, нужно в конечном файле удалить старую строку (т.е. сделать документ пустым), а потом вставить новую, следующую строку из словаря.
7. Для удобства, если нужно будет доработать, чтобы не переименовывать несколько раз.
8. Хм.... лучше учесть. Нужен UTF-8.
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
20.02.2018, 20:40 16
Vasek2
1. Т. е. если источников несколько, то сопоставлять их надо с получателями по индексу массивов?
3. Давайте единицу мощности оставим в покое и будем называть нужное заданной константой. Со слов неясно, 3 секунды задержки требуются для замены строки или замены всех строк во всём документе?
4. Как это "сделать документ пустым"? Там же множество строк, а не одна.
7. Здесь выкладываются коды. Как именовать файлы с ними — дело исключительно добровольное.
8. А в каком смысле "учесть"? Можно учесть вероятность, а можно постоянство. Также про наличие ВОМ узнать не помешало бы.
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
21.02.2018, 00:04  [ТС] 17
FlasherX,
1. 1ый словарь -> 1ый документ, 2ой словарь -> 2ой документ и так далее.
3. Каких всех строк, если в документе априори только одна строка может быть?
4. В словаре много строк, а в конечном документе одна, её и надо стирать соответственно.
7. Я понял, Вы будете выкладывать не файл, а код.
8. UTF-8 without BOM.

Вот теперь мы действительно потратили много времени, только уже на ТЗ.
Вы пробовали запустить код, который я давал? Тогда было бы понятно, что нужно...
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
21.02.2018, 02:23 18
Vasek2
2. Вы же сами написали "Строки подставляются подряд: первая, затем вторая, третья и т.д.".
4. Т. е. нужно каждые № секунд строку поступательно из каждого словаря записывать в каждый из сопоставленных по индексу файлов? Словарей при этом может быть либо один либо столько же, сколько редактируемых файлов? Насчёт цикличности стоит прояснить. У словарей разное число строк. Т. е. если словарь заканчивается, сопоставленный файл больше не трогать? Или переходить к первой строке (в коде вижу MoveFirst)?
7. Вы тоже не файл выложили, что логично. )

Я бы попробовал запустить, если бы понимал суть того, что этот код должен делать и каким образом оформлять файлы. Уже становится яснее.
0
Vasek2
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 142
21.02.2018, 19:19  [ТС] 19
FlasherX, Вы скрипт пробовали запускать, который я выложил?
2. Затирается строка в файле, берётся первая строка из словаря, вставляется в файл.
Затирается строка в файле, берётся вторая строка из словаря, вставляется в файл.
Затирается строка в файле, берётся третья строка из словаря, вставляется в файл.
Затирается строка в файле, берётся четвёртая строка из словаря, вставляется в файл.
И так далее.
4. 1ый словарь -> 1ый файл. 2ой словарь -> 2ой файл. И так далее.
После подставновки последней строки нужно перейти вновь к первой, т.е. циклично.

Создаёте файлы, согласно названий, вписанных в мой код, запускаете скрипт. Профит
0
FlasherX
723 / 282 / 111
Регистрация: 06.06.2017
Сообщений: 1,081
22.02.2018, 00:11 20
Vasek2, не, не пробовал, лень-матушка.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
Dim iDic, oDic, cDic, RExp, oFSO, oCvt, i, iFile, oFile, Max, Test, Str, uStr
 
'= Вводные: =====================================================
Const Sec = 5 ' период выполнения в секундах
Const Check = 0 ' не/проверять строку по наличию '<' спереди: 0/1
'----------------------------------------------------------------
Set iDic = CreateObject("Scripting.Dictionary")
Set oDic = CreateObject("Scripting.Dictionary")
Set cDic = CreateObject("Scripting.Dictionary")
'--------------------------------
'Пути к словарям:
iDic.Add 1, "D:\Script\list1.txt"
iDic.Add 2, "D:\Script\list2.txt"
iDic.Add 3, "D:\Script\list3.txt"
iDic.Add 4, "D:\Script\list4.txt"
'--------------------------------
'Пути к редактируемым файлам:
oDic.Add 1, "D:\Test\1\text.txt"
oDic.Add 2, "D:\Test\2\text.txt"
oDic.Add 3, "D:\Test\3\text.txt"
oDic.Add 4, "D:\Test\4\text.txt"
'================================================================
 
If iDic.Count <> oDic.Count Then _
MsgBox "Число словарей должно соответствовать числу редактируемых файлов!", 4144 : WSH.Quit
Set RExp = New RegExp : RExp.Global = True : RExp.Pattern = "^(\r?\n)+|\r?\n(?=\r?\n|$)"
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oCvt = CreateObject("OlePrn.OleCvt")
For i = 1 To iDic.Count
    iDic.Item(i) = Split(RExp.Replace(oFSO.OpenTextFile(iDic.Item(i)).ReadAll, ""), vbNewLine)
    cDic.Add i, 0
Next
RExp.Pattern = "[^\s!-‚-›\u0080-\u00FF\u0400-\u04FF\u20A0-\u20CF\u2100-\u214F\w‘’–—]"
 
Do 
    For i = 1 To oDic.Count
        oFile = oDic(i) : Max = UBound(iDic(i)) : Test = 1
        If Check Then
            If oFSO.GetFile(oFile).Size = 0 Then Test = 0 Else _
            If oFSO.OpenTextFile(oFile).Read(1) <> "<" Then Test = 0
        End If
        If Test Then
            Str = iDic(i)(cDic(i)) : uStr = oCvt.ToUnicode(Str, 65001)
            If Not RExp.Test(uStr) Then Str = uStr
            With oFSO.OpenTextFile(oFile, 2) .Write Str :.Close :End With
        End If
        If cDic(i) = Max Then cDic(i) = 0 Else cDic(i) = cDic(i) + 1
    Next
    WSH.Sleep Sec*1000
Loop
0
22.02.2018, 00:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2018, 00:11

VBS-скрипт и Total Commander
Доброго времени суток.8-) Возникла необходимость соединить в своей работе...

VBS скрипт загрузки файла на сайт
нужно загрузить программой файл на сайт. Уже 5й день не могу найти способ, т.к....

Vbs скрипт собирающий данные о windows
Здравствуйте, такая проблема, пытаюсь запустить из под windows 7 HARDWARE,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru