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

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

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

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


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

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


Всем привет!
Решила снова прибегнуть к помощи форумчан
Попробую описать подробно проблему. Есть папка (test) с файлами и подпапками, содержащими разные файлы. Созданы дополнительно два текстовых файла. Из первого файла берём образец (многострочный текстовый файл), т.е. то, что надо найти в файлах папок test. А второй файл это то, на что нужно заменить найденное. Хотелось бы, чтобы можно было задавать маску поиска (strMask = "*.txt")

Отправлено: 01:58, 23-10-2012

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

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


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

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


Пробовала с gsar и sed экспериментировать, но что-то не получилось добиться поиска текста из файла-образца.

Код: Выделить весь код
@echo off
setlocal

set "replace=some text"
sed "s/zamena/%replace%/g" test1.txt 1>test2.txt
если бы можно было задавать путь
set "replace=C:\test\example.txt"

Последний раз редактировалось ul9, 23-10-2012 в 02:08.


Отправлено: 02:02, 23-10-2012 | #2



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

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

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

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


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

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


Нашла ещё вот такой скрипт, но опять-таки заменяет не из текстового файла

[cscript|wscript] replace.vbs Find Replacewith File
Find … Required. Substring being searched for.
Replacewith … Required. Replacement substring.
File … Source and destination file for the replacement

Код: Выделить весь код
Dim FileName, Find, ReplaceWith, FileContents, dFileContents
Find         = WScript.Arguments(0)
ReplaceWith  = WScript.Arguments(1)
FileName     = WScript.Arguments(2)

'Read source text file
FileContents = GetFile(FileName)

'replace all string In the source file
dFileContents = replace(FileContents, Find, ReplaceWith, 1, -1, 1)

'Compare source And result
if dFileContents <> FileContents Then
  'write result If different
  WriteFile FileName, dFileContents

  Wscript.Echo "Replace done."
  If Len(ReplaceWith) <> Len(Find) Then 'Can we count n of replacements?
    Wscript.Echo _
    ( (Len(dFileContents) - Len(FileContents)) / (Len(ReplaceWith)-Len(Find)) ) & _
    " replacements."
  End If
Else
  Wscript.Echo "Searched string Not In the source file"
End If

'Read text file
function GetFile(FileName)
  If FileName<>"" Then
    Dim FS, FileStream
    Set FS = CreateObject("Scripting.FileSystemObject")
      on error resume Next
      Set FileStream = FS.OpenTextFile(FileName)
      GetFile = FileStream.ReadAll
  End If
End Function

'Write string As a text file.
function WriteFile(FileName, Contents)
  Dim OutStream, FS

  on error resume Next
  Set FS = CreateObject("Scripting.FileSystemObject")
    Set OutStream = FS.OpenTextFile(FileName, 2, True)
    OutStream.Write Contents
End Function

Отправлено: 17:15, 23-10-2012 | #3


Ветеран


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

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


Цитата ul9:
Из первого файла берём образец (многострочный текстовый файл), т.е. то, что надо найти в файлах папок test. А второй файл это то, на что нужно заменить найденное. »
Выложите архив с примером: «первый файл» — что заменять, «второй файл» — на что заменять, и образец файла — где заменять.

Отправлено: 18:52, 23-10-2012 | #4

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

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


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

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


Вложения
Тип файла: rar replace.rar
(7.3 Kb, 23 просмотров)

Вот, но это не мой пример. Просто всегда текст (заменяемый) разный и выкладывать конкретный случай не имеет смысла. Я для каждой замены продублирую скрипт со своими заменами. В архиве заменять нужно в фале html, но иногда также приходится заменять и в файлах яваскрипта, не затрагивая html. Поэтому хотелось бы, чтобы можно было выбирать тип файла (html, js..)

Отправлено: 19:22, 23-10-2012 | #5


Ветеран


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

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


ul9, тип файла не важен. Важна кодировка. Особенно желательно, чтобы она совпадала у тех файлов, в которых ищем, так и у тех файлов, которые используются в качестве источников фрагментов поиска и замены. В приведённом Вами примере это не так: «work.htm» имеет кодировку windows-1251, а «Найти это.txt» и «заменить этим.txt» — UTF-8, да ещё и без BOM. Что, при наличии во фрагменте поиска кирилицы в приведённом примере делает невозможным простой поиск и замену.

Что скажете?

Отправлено: 22:51, 23-10-2012 | #6

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

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


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

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


Всё поняла. Все файлы будут в UTF-8 без BOM.
«Найти это.txt» и «заменить этим.txt» тоже сохраню в нужной кодировке, так как они делаются руками. А вот файлы, в которых нужно работать, приходят в UTF-8 без BOM.
И я ещё хотела бы уточнить, возможен будет такой вариант, чтобы при пустом файле «заменить этим.txt» в файле «work.htm» просто удалялся фрагмент кода, заданный в «Найти это.txt»?

Отправлено: 23:01, 23-10-2012 | #7


Ветеран


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

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


Цитата ul9:
Всё поняла. Все файлы будут в UTF-8 без BOM.
«Найти это.txt» и «заменить этим.txt» тоже сохраню в нужной кодировке, так как они делаются руками. А вот файлы, в которых нужно работать, приходят в UTF-8 без BOM. »
Ясно.

Цитата ul9:
И я ещё хотела бы уточнить, возможен будет такой вариант, чтобы при пустом файле «заменить этим.txt» в файле «work.htm» просто удалялся фрагмент кода, заданный в «Найти это.txt»? »
Да.

Как осуществляем замену: переписываем содержимое файла новым содержимым (с произведённой заменой) поверх, без резервной копии, так?

Отправлено: 23:06, 23-10-2012 | #8

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

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


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

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


Цитата Iska:
Как осуществляем замену: переписываем содержимое файла новым содержимым (с произведённой заменой) поверх, без резервной копии, так? »
В резервной копии нет необходимости. Меняем безоговорочно и безвозвратно

Отправлено: 23:10, 23-10-2012 | #9


Ветеран


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

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


Ну, вот, в первом приближении:
читать дальше »
Код: Выделить весь код
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
'=============================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:54, 23-10-2012 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Замена текста в txt Starter1 Скриптовые языки администрирования Windows 17 04-08-2022 18:26
CMD/BAT - [решено] Поиск и замена текста ajakzs Скриптовые языки администрирования Windows 18 08-08-2013 16:10
2007 - [решено] Word вставка одного текста вместо другого 3DpacTe Microsoft Office (Word, Excel, Outlook и т.д.) 5 11-05-2012 14:36
.NET - [решено] Получение Текста Из Edita Другого Приложения ( C# ) LilLoco Программирование и базы данных 1 28-06-2010 13:12
Офис и Текст - Замена текста Котяра Программное обеспечение Windows 1 29-09-2008 13:51




 
Переход