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

Показать сообщение отдельно

Ветеран


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

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


Пробуйте:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim objFSO

Dim strFileMaster
Dim strFileWorking

Dim arrContent
Dim i
Dim objDictionaryMaster
Dim objDictionaryWorking

Dim strKey


If WScript.Arguments.Count = 2 Then
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	strFileMaster = WScript.Arguments.Item(0)
	
	If Not objFSO.FileExists(strFileMaster) Then
		WScript.Echo "Master file [" & strFileMaster & "] not found."
		WScript.Quit 2
	End If
	
	strFileWorking = WScript.Arguments.Item(1)
	
	If Not objFSO.FileExists(strFileWorking) Then
		WScript.Echo "Working file [" & strFileWorking & "] not found."
		WScript.Quit 3
	End If
	
	Set objDictionaryMaster  = WScript.CreateObject("Scripting.Dictionary")
	Set objDictionaryWorking = WScript.CreateObject("Scripting.Dictionary")
	
	With objFSO.OpenTextFile(strFileMaster)
		arrContent = Split(.ReadAll(), vbCrLf)
		.Close
	End With
	
	For i = LBound(arrContent) To UBound(arrContent) - 1
		arrContent(i) = Trim(arrContent(i))
		
		If Len(arrContent(i)) <> 0 Then
			If Left(arrContent(i), 1) <> "#" Then
				If InStr(arrContent(i), "=") > 0 Then
					objDictionaryMaster.Add Trim(Split(arrContent(i), "=", 2)(0)), Trim(Split(arrContent(i), "=", 2)(1))
				End If
			End If
		End If
	Next
	
	With objFSO.OpenTextFile(strFileWorking)
		arrContent = Split(.ReadAll(), vbCrLf)
		.Close
	End With
	
	For i = LBound(arrContent) To UBound(arrContent) - 1
		arrContent(i) = Trim(arrContent(i))
		
		If Len(arrContent(i)) <> 0 Then
			If Left(arrContent(i), 1) <> "#" Then
				If InStr(arrContent(i), "=") > 0 Then
					objDictionaryWorking.Add Trim(Split(arrContent(i), "=", 2)(0)), Trim(Split(arrContent(i), "=", 2)(1))
				End If
			End If
		End If
	Next
	
	objFSO.CopyFile strFileWorking, objFSO.GetBaseName(strFileWorking) & ".bak", True
	
	With objFSO.CreateTextFile(strFileWorking, True)
		For Each strKey In objDictionaryMaster.Keys
			If objDictionaryWorking.Exists(strKey) Then
				.WriteLine strKey & " = " & objDictionaryWorking.Item(strKey)
				
				objDictionaryMaster.Remove strKey
				objDictionaryWorking.Remove strKey
			Else
				.WriteLine strKey & " = "
			End If
		Next
		
		.WriteLine
		.WriteLine "# Lines below not found by patterns of Master file [" & strFileMaster & "]:"
		
		For Each strKey In objDictionaryWorking.Keys
			.WriteLine strKey & " = " & objDictionaryWorking.Item(strKey)
		Next
		
		.Close
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Master file> <Working file>"
	WScript.Quit 1
End If

WScript.Quit 0

Скрипту требуется указать два аргумента: образец, мастер-файл и рабочий, целевой файл. Из мастер-файла берутся левые части строк до символа «=» и их порядок. Из целевого файла убираются пустые строки и строки, начинающиеся на «#». Из остальных строк в порядке, заданном порядком левых частей строк мастер-файла, строится новое содержимое целевого файла.

Если в мастер-файле существуют левые части строк, отсутствующие в целевом файле, то такие строки добавляются в целевой файл с пустыми значениями — пустыми правыми частями после знака равенства.

В конце нового содержимого целевого файла указываются строки оригинального целевого файла, которым не было найдено соответствия с левыми частями строк мастер-файла.

Оригинальное предыдущее содержимое целевого файла остаётся доступным в одноимённом файле с расширением «.bak» (при этом, если таковой .bak файл уже существовал ранее — его содержимое будет утеряно).
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:18, 21-05-2014 | #2