Войти

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


Страниц : 1 [2]

UncleD
19-07-2019, 15:22
откуда берётся имя файла? »
Имя файла постоянное и в реальности такое "1c_to_kl.txt".
И в чём затруднение вставить vbs скрипт в планировщик, вроде Вы это можете? »
Скрипт скрывающий окно командной строки нормально вставляется. А не элегантным я это решение назвал потому что в планировщик вставляется скрипт, который тянет за собой батник.

megaloman
19-07-2019, 15:27
Скрипт скрывающий окно командной строки нормально вставляется. »Еще нормальнее вставляется vbs-скрипт с решением вашей задачи и никаких окон не выскочит.
У Вас: vbs-скрипт скрывает батник, который вызывает VBS-скрипт. Тихо шифером шурша ....
Посмотрите предыдущий пост, я немного изменил скрипт.
А еще нормальнее, разобраться с формированием файла, чтобы его не корректировать.

SharkyEXE
09-08-2023, 15:22
megaloman, здравствуйте

Пожалуйста, помогите ДОработать Ваш отличный скрипт
http://forum.oszone.net/post-2880574-20.html

FileIn = "Z:\Где файл\11.txt"
Fin = "ПоказательТипа=0"
Rep = "ПоказательТипа="

Set FSO = CreateObject("Scripting.FileSystemObject")
Set FF = FSO.OpenTextFile(FileIn, 1)
InTxt = FF.ReadAll
FF.Close

If InStr(1, InTxt, Fin) <> 0 Then
Set FF = FSO.OpenTextFile(FileIn, 2, True)
FF.Write Replace(InTxt, Fin, Rep)
FF.Close
End If

Момент №1

На входе, лично в моем случае, может быть
ПоказательТипа=0
ПоказательТипа=1
ПоказательТипа=3
ПоказательТипа=4
ПоказательТипа=5
...
то есть после равно может быть любая цифра, хоть 0, хоть 987654321

Как сделать по умному, чтобы на выходе было
ПоказательТипа=2

Момент №2

В файле
FileIn = "Z:\Где файл\11.txt"
параметр
ПоказательТипа=2
может быть в двух местах

...
[messageWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3\xab\0\0\0\x9e\0\0\x5\xdd\0\0\x3I\0\0\x3\xb3\0\0\ 0\xbc\0\0\x5\xd5\0\0\x3\x41\0\0\0\0\0\0\0\0\a\x80\0\0\x3\xb3\0\0\0\xbc\0\0\x5\xd5\0\0\x3\x41)
ПоказательТипа=0
wordWarp=true
...
[mediaInfo]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\x31\0\0\0w\0\0\x2\xc8\0\0\x2\x9f\0\0\x1\x35\0\0\ 0\x8e\0\0\x2\xc4\0\0\x2\x9b\0\0\0\0\0\0\0\0\x5\0\0\0\x1\x35\0\0\0\x8e\0\0\x2\xc4\0\0\x2\x9b)
ПоказательТипа=1
aceSplitterSettings=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\xcd\0\0\x1*\x1\xff\xff\xff\xff\x1\ 0\0\0\x2\0)
showTimestamp=true

Возможно или нет сделать так, чтобы менялось ТОЛЬКО во 2м случае, в секции [mediaInfo]

А секцию [messageWindow] НЕ трогать

megaloman
09-08-2023, 17:47
FileIn = "Z:\Где файл\1c_to_kl.txt"
Section = Array("mediaInfo")
Fin = "ПоказательТипа=\d* *"
Rep = "ПоказательТипа=2"

Set R = CreateObject("VBScript.RegExp")
With R
.Global = True
.Pattern = Fin
.IgnoreCase = True
End With

With CreateObject("Scripting.FileSystemObject")
With .OpenTextFile(FileIn, 1)
InTxt = Split(.ReadAll, "[")
.Close
End With

For i = 0 To UBound(InTxt)
For Each s In Section
If InStr(1, InTxt(i), s + "]", 1) = 1 Then
InTxt(i) = R.Replace(InTxt(i), Rep)
Exit For
End If
Next
Next

With .OpenTextFile(FileIn, 2, True)
.Write Join(InTxt, "[")
.Close
End With

End With

SharkyEXE
09-08-2023, 21:11
megaloman

Здравствуйте

Отлично, класс..

Но возникла бяка - каждый раз при запуске скрипта файл сохраняется заново, даже если в секции [mediaInfo], ПоказательТипа=2

Можете, пожалуйста, сделать как здесь
http://forum.oszone.net/post-2880574-20.html

Вот доработка vbs-скрипта c целью исключения перезаписи входного файла в случае, если строка для замены не найдена (то есть, на практике, ранее эта замена уже планировщиком была сделана)

Если по проще:
если в файле, в секции [mediaInfo], ПоказательТипа=2 - то ничего НЕ делать, не сохранять файл, просто закрыть файл
если в файле, в секции [mediaInfo], ПоказательТипа= НЕ РАВНО 2 - то делать замену и сохранять файл

megaloman
09-08-2023, 21:48
FileIn = "Z:\Где файл\1c_to_kl.txt"
Section = Array("mediaInfo")
Fin = "ПоказательТипа=\d*"
Rep = "ПоказательТипа=2"

Set R = CreateObject("VBScript.RegExp")
With R
.Global = True
.Pattern = Fin
.IgnoreCase = True
End With

With CreateObject("Scripting.FileSystemObject")
With .OpenTextFile(FileIn, 1)
InTxt = Split(.ReadAll, "[")
.Close
End With

L = False
For i = 0 To UBound(InTxt)
For Each s In Section
If InStr(1, InTxt(i), s + "]", 1) = 1 Then
InTxt0 = InTxt(i)
InTxt(i) = R.Replace(InTxt(i), Rep)
L = L Or InTxt0 <> InTxt(i)
Exit For
End If
Next
Next

If L Then
With .OpenTextFile(FileIn, 2, True)
.Write Join(InTxt, "[")
.Close
End With
MsgBox FileIn + vbCr + "был изменен"
End If
End With
Я смутно представляю задачу, поэтому предполагаю, что секций, где надо менять данные, несколько (имена задаются в массиве Section), а также в каждой секции ПоказательТипа может встречаться не один раз.

SharkyEXE
09-08-2023, 21:56
megaloman

Здравствуйте

1) Класс, отлично

Теперь запустил один раз Ваш скрипт - в файле, в секции [mediaInfo], было ПоказательТипа=0, стало ПоказательТипа=2
Появилась табличка "был изменен"

Потом сколько раз я НЕ запускал Ваш скрипт - файл НЕ записывался и НЕ сохранялся заново

Мини пожелание - а нельзя добавить табличку "НЕ был изменен"?

Типа, потом, сколько раз я не буду запускать Ваш скрипт - я каждый раз буду видеть табличку "НЕ был изменен"

2) Цитата:
Я неточно представляю задачу, поэтому предполагаю, что секций, где надо менять данные, несколько (имена задаются в массиве Section), а также в каждой секции ПоказательТипа может встречаться не один раз.

Приношу Вам мои извинения, пусть будет так, для меня работает и работает

А так, повторюсь: есть файл, в файле 52 секции
...
[messageWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3\xab\0\0\0\x9e\0\0\x5\xdd\0\0\x3I\0\0\x3\xb3\0\0\ 0\xbc\0\0\x5\xd5\0\0\x3\x41\0\0\0\0\0\0\0\0\a\x80\0\0\x3\xb3\0\0\0\xbc\0\0\x5\xd5\0\0\x3\x41)
ПоказательТипа=0
wordWarp=true
...
[mediaInfo]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\x31\0\0\0w\0\0\x2\xc8\0\0\x2\x9f\0\0\x1\x35\0\0\ 0\x8e\0\0\x2\xc4\0\0\x2\x9b\0\0\0\0\0\0\0\0\x5\0\0\0\x1\x35\0\0\0\x8e\0\0\x2\xc4\0\0\x2\x9b)
ПоказательТипа=1
aceSplitterSettings=@ByteArray(\0\0\0\xff\0\0\0\x1\0\0\0\x2\0\0\0\xcd\0\0\x1*\x1\xff\xff\xff\xff\x1\ 0\0\0\x2\0)
showTimestamp=true
...
То есть параметр
ПоказательТипа={тут всякие цифры}
может быть только
1) 1на строка в секции [messageWindow]
2) 1на строка в секции [mediaInfo]
Больше в файле в остальных 50 секциях параметра
ПоказательТипа={тут всякие цифры}
нигде нету

megaloman
09-08-2023, 22:52
Msgbox я оставил случайно, для отладки. для планировщика это не годится. Как вариантFileIn = "Z:\Где файл\1c_to_kl.txt"
Section = Array("mediaInfo")
Fin = "ПоказательТипа=\d*"
Rep = "ПоказательТипа=2"

Set R = CreateObject("VBScript.RegExp")
With R
.Global = True
.Pattern = Fin
.IgnoreCase = True
End With

With CreateObject("Scripting.FileSystemObject")
With .OpenTextFile(FileIn, 1)
InTxt = Split(.ReadAll, "[")
.Close
End With

L = False
For i = 0 To UBound(InTxt)
For Each s In Section
If InStr(1, InTxt(i), s + "]", 1) = 1 Then
InTxt0 = InTxt(i)
InTxt(i) = R.Replace(InTxt(i), Rep)
L = L Or InTxt0 <> InTxt(i)
Exit For
End If
Next
Next

Out = FileIn + vbCr + "не изменялся"
If L Then
With .OpenTextFile(FileIn, 2, True)
.Write Join(InTxt, "[")
.Close
End With
Out = FileIn + vbCr + "был изменен"
End If
''''''''MsgBox Out
CreateObject("WScript.Shell").Run "Msg.exe" + " * " + CStr(Now()) + vbCr + Out, 0, False
End With

SharkyEXE
09-08-2023, 23:15
megaloman

Здравствуйте

Пожалуйста, будьте так, любезны, научите, а как увидеть выхлоп Вашего скрипта?

Мол, когда изменился - увидеть строку, окно "был изменен"

Мол, когда изменений нет - увидеть строку, окно "не изменялся"

Банальный запуск vbs скрипта - ничего не появляется, ни "был изменен", ни "не изменялся"

megaloman
09-08-2023, 23:37
SharkyEXE, У меня работает. Но я запускаю скрипт без планировщика от своего имени. Возможно, сто лет тому назад я делал какие-то настройки.
Попробуйте почитать. (https://sebeadmin.ru/forum/viewtopic.php?id=581). Попробуйте вместо
" * "
написать " имяпользователя "
имяпользователя можно увидеть, запустив в командном окне
Echo %Username%

SharkyEXE
09-08-2023, 23:45
megaloman

Здравствуйте

Я многократно извиняюсь

1) Есть файл 1.vbs, внутри файла 1.vbs код отсюда http://forum.oszone.net/post-3013706-28.html

FileIn = "Z:\Где файл\1c_to_kl.txt"
Section = Array("mediaInfo")
Fin = "ПоказательТипа=\d*"
Rep = "ПоказательТипа=2"

Set R = CreateObject("VBScript.RegExp")
With R
.Global = True
.Pattern = Fin
.IgnoreCase = True
End With

With CreateObject("Scripting.FileSystemObject")
With .OpenTextFile(FileIn, 1)
InTxt = Split(.ReadAll, "[")
.Close
End With

L = False
For i = 0 To UBound(InTxt)
For Each s In Section
If InStr(1, InTxt(i), s + "]", 1) = 1 Then
InTxt0 = InTxt(i)
InTxt(i) = R.Replace(InTxt(i), Rep)
L = L Or InTxt0 <> InTxt(i)
Exit For
End If
Next
Next

Out = FileIn + vbCr + "не изменялся"
If L Then
With .OpenTextFile(FileIn, 2, True)
.Write Join(InTxt, "[")
.Close
End With
Out = FileIn + vbCr + "был изменен"
End If
''''''''MsgBox Out
CreateObject("WScript.Shell").Run "Msg.exe" + " * " + CStr(Now()) + vbCr + Out, 0, False
End With


2) Я извиняюсь, но возможно или нет:
1) создать файл 1.cmd, внутри файла 1.cmd прописать команду

@Echo Off
1.vbs >> 1.txt
Pause
Exit

Так сказать, вывод в stdout
Так нормально или так не нормально?

megaloman
10-08-2023, 07:18
Если нужен log-файл, все равно скрипач (https://youtu.be/b1yoUtNj9y0) батник не нужен, измените скрипт (http://forum.oszone.net/post-3013706-28.html)...........
...........
...........
End If
''''''''MsgBox Out
''''''''CreateObject("WScript.Shell").Run "Msg.exe" + " * " + CStr(Now()) + vbCr + Out, 0, False
With .OpenTextFile(FileIn + ".log", 8, True)
.writeline CStr(Now()) + vbTab + Replace(Out, vbCr, vbTab)
.Close
End With
End WithЛог-файл создаётся рядом с исходным файлом. Его можно удалять, он пересоздастся.

Насчет выхлопа, попробуйте в командном окне исполнить команды

Msg * kuku
Msg %Username% kuku

Как насчет выхлопа?




© OSzone.net 2001-2012