Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск замена текста

Ответить
Настройки темы
CMD/BAT - [решено] Поиск замена текста
csp csp вне форума

Новый участник


Сообщения: 24
Благодарности: 0

Профиль | Отправить PM | Цитировать


гм неполистал форум прошу прощения на следующей страницы похожая тема. если не выйдет. отпишу нижу

Отправлено: 01:39, 25-03-2012

 

Аватара для UncleD

Пользователь


Сообщения: 100
Благодарности: 7

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:22, 19-07-2019 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 19-07-2019 в 15:35.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:27, 19-07-2019 | #22


Ветеран


Сообщения: 900
Благодарности: 86

Профиль | Отправить PM | Цитировать


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] НЕ трогать

Отправлено: 15:22, 09-08-2023 | #23


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:47, 09-08-2023 | #24


Ветеран


Сообщения: 900
Благодарности: 86

Профиль | Отправить PM | Цитировать


megaloman

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

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

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

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

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

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

Последний раз редактировалось SharkyEXE, 09-08-2023 в 21:34.


Отправлено: 21:11, 09-08-2023 | #25


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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), а также в каждой секции ПоказательТипа может встречаться не один раз.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 21:48, 09-08-2023 | #26


Ветеран


Сообщения: 900
Благодарности: 86

Профиль | Отправить PM | Цитировать


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 секциях параметра
Код: Выделить весь код
ПоказательТипа={тут всякие цифры}
нигде нету

Последний раз редактировалось SharkyEXE, 09-08-2023 в 22:06.


Отправлено: 21:56, 09-08-2023 | #27


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:52, 09-08-2023 | #28


Ветеран


Сообщения: 900
Благодарности: 86

Профиль | Отправить PM | Цитировать


megaloman

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

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

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

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

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

Отправлено: 23:15, 09-08-2023 | #29


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


SharkyEXE, У меня работает. Но я запускаю скрипт без планировщика от своего имени. Возможно, сто лет тому назад я делал какие-то настройки.
Попробуйте почитать.. Попробуйте вместо
" * "
написать " имяпользователя "
имяпользователя можно увидеть, запустив в командном окне
Echo %Username%

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 09-08-2023 в 23:43.


Отправлено: 23:37, 09-08-2023 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск замена текста

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск и замена текста ajakzs Скриптовые языки администрирования Windows 18 08-08-2013 16:10
CMD/BAT - Поиск и замена текста через bat Lilless Скриптовые языки администрирования Windows 0 28-02-2012 02:08
CMD/BAT - [решено] Поиск, остановка процесса, поиск и замена файла на разных дисках Gawr33 Скриптовые языки администрирования Windows 11 23-04-2011 23:09
[решено] Поиск и замена текста в файле TERMINAL AutoIt 6 16-03-2011 17:49
C/C++ - [решено] Поиск и замена текста Simpler Программирование и базы данных 15 01-12-2010 16:03




 
Переход