1 (изменено: biffick, 2019-08-10 13:15:51)

Тема: CMD/BAT: Поиск текста и его замена в документах

Всем привет, может кто поможет со скриптом для домашнего сервера?
Нужно, чтобы скрипт находил текст в файлах и заменял на другой кусок текста (не целую строку, а именно кусок текста, который может быть в любом месте файла).
Очень важно добавить параметр, который отвечал бы за поиск с учётом регистра и без него.

Каркас нужен такой:

Log=True ; Логировать ли действия скрипта
Logfile="C:\replace.log ; Путь и название файла лога

CaseSens=True/False ; Учитывать ли регистр при поиске текста

Find="10.10.10.10" ; Что нужно найти
Replace="11.11.11.11" ; Чем нужно заменить найденное

Path1="C:\Folder 1\File.php" ; Путь к файлу №1, в котором нужно искать и заменять текст
Path2="C:\Folder 2\Folder3\File.txt" ; Путь к файлу №2, в котором нужно искать и заменять текст
Path3="C:\File.ini" ; Путь к файлу №3, в котором нужно искать и заменять текст

2 (изменено: alexii, 2019-08-10 23:30:22)

Re: CMD/BAT: Поиск текста и его замена в документах

Скажу сразу — пакетные файлы для этого не годятся.

Вот Вам примерный код на WSH:

+ открыть спойлер
Option Explicit

Const ForAppending = 8


Dim arrSourceFiles
Dim strString4Find
Dim strString4Replace
Dim boolIsCaseReplacing
Dim boolIsLogging
Dim strPath2LogFile

Dim objFSO
Dim strSourceFile
Dim strContent
Dim boolFound


arrSourceFiles      = Array( _
	"C:\Folder 1\File.php", _
	"C:\Folder 2\Folder3\File.txt", _
	"C:\File.ini" _
)

strString4Find      = "10.10.10.10"
strString4Replace   = "11.11.11.11"
boolIsCaseReplacing = True

boolIsLogging       = True
strPath2LogFile     = "C:\replace.log"


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

If boolIsLogging Then
	If Not objFSO.FolderExists(objFSO.GetParentFolderName(strPath2LogFile)) Then
		WScript.Echo "Can't find logging folder [" & objFSO.GetParentFolderName(strPath2LogFile) & "]."
		WScript.Quit 1
	End If
End If

For Each strSourceFile In arrSourceFiles
	If objFSO.FileExists(strSourceFile) Then
		With objFSO.OpenTextFile(strSourceFile)
			strContent = .ReadAll()
			.Close
		End With
		
		boolFound = False
		
		If boolIsCaseReplacing Then
			If InStr(1, strContent, strString4Find, vbTextCompare) > 0 Then
				boolFound  = True
				strContent = Replace(strContent, strString4Find, strString4Replace, 1, -1, vbTextCompare)
			End If
		Else
			If InStr(1, strContent, strString4Find, vbBinaryCompare) > 0 Then
				boolFound  = True
				strContent = Replace(strContent, strString4Find, strString4Replace, 1, -1, vbBinaryCompare)
			End If
		End If
		
		If boolFound Then
			With objFSO.CreateTextFile(strSourceFile, True)
				.Write strContent
				.Close
			End With
			
			LogOut "Found [" & strString4Find & "] in source file [" & _
				strSourceFile & "] and replaced by [" & strString4Replace & "]."
		Else
			LogOut "Nothing found in source file [" & strSourceFile & "]."
		End If
	Else
		LogOut "Can't find source file [" & strSourceFile & "]."
	End If
Next

Set objFSO = Nothing

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

'=============================================================================
Sub LogOut(strValue)
	WScript.Echo strValue
	
	If boolIsLogging Then
		With objFSO.OpenTextFile(strPath2LogFile, ForAppending, True)
			.WriteLine Now() & vbTab & strValue
			.Close
		End With
	End If
End Sub
'=============================================================================

P.S. Само собой, писать что-то в корень раздела системного диска — моветон.

3 (изменено: biffick, 2019-08-11 00:32:15)

Re: CMD/BAT: Поиск текста и его замена в документах

alexii, т.е. батником такое дело в принципе не реализовать?
UPD: проверил скрипт - работает на ура, большое спасибо!
UPD 2: подскажите, правильная кодировка для VBS-скриптов - 1251? Просто в UTF-8 и OEM-866 я получаю иероглифы при выводе информационных сообщений

4

Re: CMD/BAT: Поиск текста и его замена в документах

biffick пишет:

т.е. батником такое дело в принципе не реализовать?

Скажем так — возможностей на порядок меньше, код намного сложнее, и ряд сложно решаемых проблем с некоторыми символами.

biffick пишет:

подскажите, правильная кодировка для VBS-скриптов - 1251?

Да.

5

Re: CMD/BAT: Поиск текста и его замена в документах

alexii пишет:

Скажем так — возможностей на порядок меньше, код намного сложнее, и ряд сложно решаемых проблем с некоторыми символами.

Понял

Спасибо за скрипт Работает хорошо