Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
VBS/WSH/JS - [решено] Замена текста в интервалах
ul9 ul9 вне форума

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


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

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


Изменения
Автор: ul9
Дата: 09-11-2013
Здравствуйте.
Нуждаюсь в вашей помощи.
Нашла такой скрипт.
Код: Выделить весь код
Option Explicit

Const ForReading   = 1
Const ForWriting   = 2


Dim objArgs
Dim objFSO
Dim objFile

Dim strWhatFind
Dim strReplaceBy

Dim strContent


Set objArgs = WScript.Arguments.Named

If objArgs.Count = 4 Then
    Set objFSO  = WScript.CreateObject("Scripting.FileSystemObject")
    
    If objArgs.Exists("FolderForScan") Then
        If objArgs.Exists("FileExtension") Then
            If objArgs.Exists("FileWhatFind") Then
                If objArgs.Exists("FileReplaceBy") Then
                    If objFSO.FolderExists(objArgs.Item("FolderForScan")) Then
                        If objFSO.FileExists(objArgs.Item("FileWhatFind")) Then
                            If objFSO.FileExists(objArgs.Item("FileReplaceBy")) Then
                                If objFSO.GetFile(objArgs.Item("FileWhatFind")).Size > 0 Then
                                    With objFSO.OpenTextFile(objArgs.Item("FileWhatFind"), ForReading)
                                        strWhatFind = .ReadAll()
                                        .Close
                                    End With
                                    
                                    If objFSO.GetFile(objArgs.Item("FileReplaceBy")).Size > 0 Then
                                        With objFSO.OpenTextFile(objArgs.Item("FileReplaceBy"), ForReading)
                                            strReplaceBy = .ReadAll()
                                            .Close
                                        End With
                                    Else
                                        strReplaceBy = ""
                                    End If
                                    
                                    WScript.Echo "Folder for scan: " & objArgs.Item("FolderForScan")
                                    WScript.Echo "File extension:  " & objArgs.Item("FileExtension")
                                    WScript.Echo "File what find:  " & objArgs.Item("FileWhatFind")
                                    WScript.Echo "File replace by: " & objArgs.Item("FileReplaceBy")
                                    WScript.Echo
                                    
                                    ScanSubFolders objFSO.GetFolder(objArgs.Item("FolderForScan"))
                                Else
                                    WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] is zero length"
                                End If
                            Else
                                WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
                            End If
                        Else
                            WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
                        End If
                    Else
                        WScript.Echo "Folder [" & objArgs.Item("FolderForScan") & "] not found"
                    End If
                Else
                    WScript.Echo "Not found argument <FileReplaceBy>"
                    Call Usage
                End If
            Else
                WScript.Echo "Not found argument <FileWhatFind>"
                Call Usage
            End If
        Else
            WScript.Echo "Not found argument <FileExtension>"
            Call Usage
        End If
    Else
        WScript.Echo "Not found argument <FolderForScan>"
        Call Usage
    End If
    
    Set objFSO = Nothing
Else
    Call Usage
End If

Set objArgs = Nothing

WScript.Quit
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
    Dim objSubFolder
    Dim objFile
    
    WScript.Echo "[" & objFolder.Path & "]"
    
    For Each objFile In objFolder.Files
        If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(objArgs.Item("FileExtension")) Then
            WScript.Echo "  " & objFile.Name
            
            If objFile.Size > 0 Then
                With objFSO.OpenTextFile(objFile.Path, ForReading)
                    strContent = .ReadAll()
                    .Close
                End With
                
                If InStr(1, strContent, strWhatFind, vbTextCompare) > 0 Then
                    WScript.Echo "    Fragment for replace found"
                    
                    With objFSO.OpenTextFile(objFile.Path, ForWriting)
                        .Write Replace(strContent, strWhatFind, strReplaceBy)
                        .Close
                    End With
                End If
            End If
        End If
    Next
    
    WScript.Echo
    
    For Each objSubFolder In objFolder.SubFolders
        ScanSubFolders objSubFolder
    Next
End Sub
'=============================================================================

'=============================================================================
Sub Usage()
    WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " " & _
        "/FolderForScan:<folder> " & _
        "/FileExtension:<extension> " & _
        "/FileWhatFind:<file> " & _
        "/FileReplaceBy:<file>"
End Sub
'=============================================================================
Он находит точное совпадение из одного файла и меняет на информацию, взятую из другого файла.
Можно его как-нибудь модифицировать, чтобы он искал начало и конец, а всё что в промежутке заменял?

Пример.
HTML код: Выделить весь код
<table> <tr><td class="thead">Панель управления</a></td></tr> <tr><td class="vbmenu_option">Редактировать подпись</a></td></tr> <tr><td class="vbmenu_option">Редактировать профиль</a></td></tr> <tr><td class="vbmenu_option">Настройки форума</a></td></tr> ....................... .......Какой-то html код.......... ....................... <tr><td class="thead">Разное</td></tr> <tr><td class="vbmenu_option">Личные сообщения</a></td></tr> <tr><td class="vbmenu_option">Менеджер подписки</a></td></tr> <tr><td class="vbmenu_option">Профиль</a></td></tr> <tr><td class="vbmenu_option">Пользователи в on-line</a></td></tr> </table>

скрипт берёт начало <tr><td class="vbmenu_option">Настройки форума</a></td></tr>
скрипт берёт конец <tr><td class="thead">Разное</td></tr>
заменяет информацию, которая находится между этими строками.

Помогите пожалуйста.

Отправлено: 01:33, 09-11-2013

 
ul9 ul9 вне форума Автор темы

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


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

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


Не тот уже oszone... Не хотят помогать

Отправлено: 22:22, 09-11-2013 | #2



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

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


Ветеран


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

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


На PowerShell:
Код: Выделить весь код
$a = gc 1.txt  # 1.txt исходный файл
$b = gc 2.txt  # 2.txt файл из которого вставляется содержимое
$c = 0

switch -regex ($a) {

    'Настройки форума' { $head = $c ++ }
    'Разное'           { $foot = $c ++; break }
    default            { $c ++ }

}

$a[0..$head], $b, $a[$foot..($a.count - 1)] | sc 1.txt

Последний раз редактировалось Foreigner, 10-11-2013 в 09:54.

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

Отправлено: 09:48, 10-11-2013 | #3

ul9 ul9 вне форума Автор темы

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


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

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


Здесь задаётся в коде условие.
А можно, чтобы условия поиска он брал из txt файла. Т.к. замен будет много, а мне нужен универсальный скрипт, которому я буду подсовывать только условия поиска.

Отправлено: 18:00, 10-11-2013 | #4


Аватара для morebeauty

Старожил


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

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


Цитата ul9:
"vbmenu_option" »
А не vBulletin ли это? Если так, то к нему есть модуль для пропатчивания, который как раз и выполняет нужную вам задачу. Лень сейчас гуглить, когда то им пользовался (лет 10 назад).

Отправлено: 11:00, 12-11-2013 | #5

ul9 ul9 вне форума Автор темы

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


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

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


Цитата morebeauty:
А не vBulletin ли это? Если так, то к нему есть модуль для пропатчивания, который как раз и выполняет нужную вам задачу. Лень сейчас гуглить, когда то им пользовался (лет 10 назад). »
Нет, это просто пример. Работа ведётся с html файлами, локально.

Отправлено: 21:21, 12-11-2013 | #6


Аватара для morebeauty

Старожил


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

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


Понятно. Исправил предложенный тобой скрипт.
Не тестировал, поэтому первый запуск советую произвести на тестовой папке с копиями реальных файлов. В теории все должно работать
Если чего то работать не будет или будет работать не так, опиши подробно что не так.
Перед использованием читай описание внизу сообщения.

Код: Выделить весь код
Option Explicit

Const ForReading   = 1
Const ForWriting   = 2


Dim objArgs
Dim objFSO
Dim objFile

Dim strWhatFind
Dim strReplaceBy
Dim strFindFrom
Dim strFindTo
Dim strContent


Set objArgs = WScript.Arguments.Named

If objArgs.Count = 5 Then
    Set objFSO  = WScript.CreateObject("Scripting.FileSystemObject")
    
    If objArgs.Exists("FolderForScan") Then
        If objArgs.Exists("FileExtension") Then
            If objArgs.Exists("FileReplaceBy") Then
                If objArgs.Exists("FileFindFrom") Then
			If objArgs.Exists("FileFindTo") Then
				If objFSO.FolderExists(objArgs.Item("FolderForScan")) Then
					If objFSO.FileExists(objArgs.Item("FileFindFrom")) Then
						If objFSO.FileExists(objArgs.Item("FileFindTo")) Then
							If objFSO.FileExists(objArgs.Item("FileReplaceBy")) Then

								If objFSO.GetFile(objArgs.Item("FileFindFrom")).Size > 0 Then
									With objFSO.OpenTextFile(objArgs.Item("FileFindFrom"), ForReading)
										strFindFrom = .ReadAll()
										.Close
									End With
								Else
									strFindFrom = ""
								End If
								If objFSO.GetFile(objArgs.Item("FileFindTo")).Size > 0 Then
									With objFSO.OpenTextFile(objArgs.Item("FileFindTo"), ForReading)
										strFindTo = .ReadAll()
										.Close
									End With
								Else
									strFindTo = ""
								End If
										
								If objFSO.GetFile(objArgs.Item("FileReplaceBy")).Size > 0 Then
									With objFSO.OpenTextFile(objArgs.Item("FileReplaceBy"), ForReading)
										strReplaceBy = .ReadAll()
										.Close
									End With
								Else
									strReplaceBy = ""
								End If
										
								WScript.Echo "Folder for scan: " & objArgs.Item("FolderForScan")
								WScript.Echo "File extension:  " & objArgs.Item("FileExtension")
								WScript.Echo "File find from:  " & objArgs.Item("FileFindFrom")
								WScript.Echo "File find to:    " & objArgs.Item("FileFindto")
								WScript.Echo "File replace by: " & objArgs.Item("FileReplaceBy")
								WScript.Echo
										
								ScanSubFolders objFSO.GetFolder(objArgs.Item("FolderForScan"))

							Else
								WScript.Echo "File [" & objArgs.Item("FileReplaceBy") & "] not found"
							End If
						Else
							WScript.Echo "File [" & objArgs.Item("FileFindTo") & "] not found"
						End If
					Else
						WScript.Echo "File [" & objArgs.Item("FileFindFrom") & "] not found"
					End If
				Else
					WScript.Echo "Folder [" & objArgs.Item("FolderForScan") & "] not found"
				End If
			Else
				WScript.Echo "Not found argument <FileFindTo>"
				Call Usage					
			End If
                Else
                    WScript.Echo "Not found argument <FileFindFrom>"
                    Call Usage
                End If
            Else
                WScript.Echo "Not found argument <FileReplaceBy>"
                Call Usage
            End If
        Else
            WScript.Echo "Not found argument <FileExtension>"
            Call Usage
        End If
    Else
        WScript.Echo "Not found argument <FolderForScan>"
        Call Usage
    End If
    
    Set objFSO = Nothing
Else
    Call Usage
End If

Set objArgs = Nothing

WScript.Quit
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
    Dim objSubFolder
    Dim objFile
    
    WScript.Echo "[" & objFolder.Path & "]"
    
    For Each objFile In objFolder.Files
        If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(objArgs.Item("FileExtension")) Then
            WScript.Echo "  " & objFile.Name
            
            If objFile.Size > 0 Then
                With objFSO.OpenTextFile(objFile.Path, ForReading)
                    strContent = .ReadAll()
                    .Close
                End With
                Dim posFrom As Currency
		Dim posTo As Currency
		If strFindFrom > "" And strFindTo > "" Then
			posFrom = InStr(1, strContent, strFindFrom, vbTextCompare) + Len(strFindFrom)
			posTo = InStr(1, strContent, strFindTo, vbTextCompare)
		Else
			If strFindFrom > "" And strFindTo = "" Then
				posFrom = InStr(1, strContent, strFindFrom, vbTextCompare) + Len(strFindFrom)
				posTo = Len(strContent)					
			End If
			If strFindFrom = "" And strFindTo > "" Then
				posFrom = 1
				posTo = InStr(1, strContent, strFindTo, vbTextCompare)					
			End if
			If strFindFrom = "" And strFindTo = "" Then
				posFrom = 0
				posTo = 0					
			End if
		End If
		If posFrom > Len(strFindFrom) And posTo > 0 Then
			strWhatFind = Mid(strContent, posFrom,  posTo - posFrom)
		Else
			strWhatFind = ""
		End If
                If InStr(1, strContent, strWhatFind, vbTextCompare) > 0 Then
                    WScript.Echo "    Fragment for replace found"
                    
                    With objFSO.OpenTextFile(objFile.Path, ForWriting)
                        .Write Replace(strContent, strWhatFind, strReplaceBy)
                        .Close
                    End With
                End If
            End If
        End If
    Next
    
    WScript.Echo
    
    For Each objSubFolder In objFolder.SubFolders
        ScanSubFolders objSubFolder
    Next
End Sub
'=============================================================================

'=============================================================================
Sub Usage()
    WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " " & _
        "/FolderForScan:<folder> " & _
        "/FileExtension:<extension> " & _
        "/FileWhatFind:<file> " & _
        "/FileReplaceBy:<file>"
End Sub
Описание:
Теперь скрипт нужно запускать не с 4 параметрами, а с 5.
  1. FolderForScan - был
  2. FileExtension - был
  3. FileReplaceBy - был
  4. FileFindFrom - новый параметр. Строка от которой нужно произвести замену (не включая саму строку)
  5. FileFindTo - новый параметр. Строка до которой нужно произвести замену (не включая саму строку)

Соответственно файлов с информацией теперь будет 3:
  1. Файл со строкой начала
  2. Файл со строкой конца
  3. Файл с текстом для замены

Условия выполнения замены (важно):
Если в файле начальной строки и в файле конечной строки есть информация и она найдена в тексте, то будет произведена обычная заменя ОТ -- ДО
Если в файле начальной строки ничего нет, а в файле конечной строки есть информация и она найдена, то будет произведена замена с самого начала файла до конечной строки
Если в файле начальной строки есть информация и она найдена, а в файле конечной строки ничего нет, то будет произведена замена от начальной строки до конца файла

Последний раз редактировалось morebeauty, 13-11-2013 в 07:25.

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

Отправлено: 05:20, 13-11-2013 | #7

ul9 ul9 вне форума Автор темы

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


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

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


Ага, спасибо! А как всю эту прелесть вызывать теперь?
Раньше вот так вызывала.
Код: Выделить весь код
cscript.exe //nologo replace.vbs /FolderForScan:"%UserProfile%\Рабочий стол\work" /FileExtension:"html" /FileWhatFind:"text\art_s.txt" /FileReplaceBy:"text\art_r.txt"

Отправлено: 18:23, 13-11-2013 | #8

ul9 ul9 вне форума Автор темы

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


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

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


Запустила вот так
Код: Выделить весь код
cscript.exe //nologo from_to.vbs /FolderForScan:"C:\from_to" /FileExtension:"html" /FileReplaceBy:"text\FileReplaceBy.txt" /FileFindFrom:"text\FileFindFrom.txt" /FileFindTo:"text\FileFindTo.txt"
Выдало ошибку
C:\from_to\from_to.vbs(127, 29) Ошибка компиляции Microsoft vbscript: Предполагается наличие окончания инструкции

Отправлено: 22:12, 13-11-2013 | #9


Аватара для morebeauty

Старожил


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

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


Все правильно, это же VBS тут нельзя указывать типы переменных
Исправьте
Dim posFrom As Currency
Dim posTo As Currency


на
Dim posFrom
Dim posTo


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

Отправлено: 07:14, 14-11-2013 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Замена текста в txt Starter1 Скриптовые языки администрирования Windows 17 04-08-2022 18:26
CMD/BAT - Замена текста Fevzy Скриптовые языки администрирования Windows 9 28-04-2013 21:22
Любой язык - Поиск и замена текста firstarey Скриптовые языки администрирования Windows 2 09-04-2013 08:44
C/C++ - [решено] Поиск и замена текста Simpler Программирование и базы данных 15 01-12-2010 16:03
Офис и Текст - Замена текста Котяра Программное обеспечение Windows 1 29-09-2008 13:51




 
Переход