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

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

Ответить
Настройки темы
VBS/WSH/JS - [решено] Добавление строк в файле формата .txt

Аватара для TheLeon

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


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


Конфигурация

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


Здравствуйте, уважаемые форумчане OSZone.net. Нужна помощь, а именно:
В файле, например, "assets.txt" нужно добавить строки("/G-65", "Mercedes-Benz G65 AMG" и т.д.) + чтобы каждая строчка была с новой строки и, если уже данная строка в файле присутствует, то ничего не предпринимать. Возможно ли это сделать через .vbs файл? Вот, что у меня получилось, но это не то.

Чайник.vbs

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

Dim oFSO, oTS, sFileText
Dim sDataToAdd, sBuff

Const vbForReading = 1
Const vbForWriting = 2

sDataToAdd = "/G-65" & vbCrLf & _
			 "Mercedes-Benz G65 AMG" & vbCrLf

If WScript.Arguments.Count = 0 Then
	MsgBox "Необходимо передать файл в параметре", vbExclamation
	WScript.Quit 1
End If

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oTS = oFSO.OpenTextFile(WScript.Arguments(0), vbForReading)

sFileText = oTS.ReadAll
oTS.Close

If Len(sFileText) >= Len(sDataToAdd) Then
	sBuff = Right(sFileText, Len(sDataToAdd))
	If LCase(sBuff) = LCase(sDataToAdd) Then
		MsgBox "Данные уже были добавлены", vbInformation
		WScript.Quit 2
	End If
End If

sFileText = sFileText & sDataToAdd

Set oTS = oFSO.OpenTextFile(WScript.Arguments(0), vbForWriting)
oTS.Write(sFileText)
oTS.Close

Set oTS = Nothing
Set oFSO = Nothing

WScript.Quit 0

Сам файл (assets.txt)

/gaz66
Модель B-66

/gaz_backup_wheel
Зап. колесо

/gaz_utility
Ремонтные части

/kamaz6520
Модель C-6520

/kamaz6522
Модель C-6522

/kirovets700
Модель K-700

/kirovets_grabber
Приспособа

/kirovets_protector
Защита кабины

/kraz255
Модель C-255

/kraz_backup_wheel
Зап. колесо

/kraz_carriage
Бортовая платформа

/kraz_cart
Платформа лесовоза

/kraz_cart_crane
Автономн. лес. кран

/kraz_cistern
Топливная цистерна

/kraz_markers
Маячки

/kraz_protector
Защита кабины

/kraz_roofpack
Зап. колесо

/kraz_tent
Гаражные части

/kraz_tractor
Сцепка

/kraz_utility
Ремонтные части

/load_logs_long
Длинные бревна

/load_logs_medium
Средние бревна

/load_logs_medium_wide
Средние бревна

/load_logs_short
Короткие бревна

/load_logs_short_short
Короткие бревна

/load_logs_short_crane
Короткие бревна

/load_logs_short_trailer
Короткие бревна

/maz535
Модель D-535

/maz7310
Модель E-7310

/maz_big_cart
Платформа лесовоза

/maz_big_tractor
Сцепка

/maz_big_utility
Ремонтные части

/maz_tractor
Сцепка

/trailer_cart
Прицеп-роспуск

/trailer_cistern
Полуприцеп-цистерна

/trailer_kraz_cart
Удлиненный роспуск

/trailer_short_cart
Бортовой прицеп

/trailer_tent
Полуприцеп-фургон

/trailer_tent_cart
Тележка-фургон

/trailer_utility
Борт. полуприцеп

/trailer_utility_cart
Сервисная тележка

/trailer_gaz
Гаражная тележка

/uaz469
Модель A-469

/uaz_bumper
Силовой бампер

/uaz_illumination
Маячки

/uaz_snorkel
Шноркель

/uaz_trunk
Ремонтные части

/ural4320
Модель C-4320

/ural_backup_wheel
Зап. колесо

/ural_cart
Платформа с краном

/ural_crane_support
Опора для крана

/ural_exhaust
Пожаробезопасный выхлоп

/zil130
Модель B-130

/zil_carriage
Бортовая платформа

/zil_utility
Ремонтные части


Отправлено: 12:10, 24-05-2018

 

Ветеран


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

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


TheLeon, файл желательно упаковывать в архив и прикладывать к сообщению. Вообще же здесь понадобится два файла — файл до добавления и файл после добавления, чтобы можно было понять, что именно требуется.

Отправлено: 12:29, 24-05-2018 | #2



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

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


Аватара для TheLeon

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


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

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



Iska, assets_old assets_new.zip

Отправлено: 14:20, 24-05-2018 | #3


Ветеран


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

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


TheLeon, у Вас действительно файлы в Юникоде UTF-16LE без BOM?
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:32, 24-05-2018 | #4


Аватара для TheLeon

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


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

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


Iska, вроде да.

Отправлено: 14:49, 24-05-2018 | #5


Ветеран


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

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


TheLeon, тогда я спрошу Вас так — как Вы относитесь к PowerShell?
Код: Выделить весь код
$sSourceFile   = 'C:\Мои проекты\0160\assets_old assets_new\assets_old.txt'
$sStrings4Find = "/G-65`r`nMercedes-Benz G65 AMG`r`n"

if(Test-Path -Path $sSourceFile -PathType Leaf) {
    $oUnicodeEncodingWithoutBOM = New-Object -TypeName 'System.Text.UnicodeEncoding' -ArgumentList $false, $false

    $sContent = [System.IO.File]::ReadAllText($sSourceFile, $oUnicodeEncodingWithoutBOM)

    if($sContent –notmatch $sStrings4Find) {
        $sContent += "`r`n$sStrings4Find"
        [System.IO.File]::WriteAllText($sSourceFile, $sContent, $oUnicodeEncodingWithoutBOM)
        Write-Host "Strings ["                                         -ForegroundColor Green  -NoNewline
        Write-Host $sStrings4Find                                      -ForegroundColor Yellow -NoNewline
        Write-Host "] append to source file ["                         -ForegroundColor Green  -NoNewline
        Write-Host $sSourceFile                                        -ForegroundColor Yellow -NoNewline
        Write-Host "]."                                                -ForegroundColor Green
    } else {
        Write-Host "Strings ["                                         -ForegroundColor Green  -NoNewline
        Write-Host $sStrings4Find                                      -ForegroundColor Yellow -NoNewline
        Write-Host "] already presents in source file ["               -ForegroundColor Green  -NoNewline
        Write-Host $sSourceFile                                        -ForegroundColor Yellow -NoNewline
        Write-Host "]."                                                -ForegroundColor Green
    }
} else {
    Write-Host "Can't find source file [$sSourceFile]." -ForegroundColor Red
}
«`r`n» — это конец строки 0x0D, 0x0A, он же CrLf.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:10, 24-05-2018 | #6


Аватара для TheLeon

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


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

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


Iska, у меня проблема с PowerShell'ом, т.к. по-умолчанию в Shindows выполнение скриптов на PowerShell выключено.. А также не знаю, включена ли возможность выполнение скриптов у других пользователей, которые будут использовать установщик. Опять же, хотель, чтобы скрипт был на VBS, но не понимаю, как это реализовать.

Последний раз редактировалось TheLeon, 25-05-2018 в 09:06.


Отправлено: 08:59, 25-05-2018 | #7


Ветеран


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

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


TheLeon, с WSH есть проблема: там в принципе отсутствует прямая поддержка записи файлов в кодировке UTF-16LE без BOM — в том смысле, что BOM пишется всегда.

Ну, давайте попробуем обходным путём:
Скрытый текст
Код: Выделить весь код
Option Explicit

Const ForReading   =  1
Const TristateTrue = -1

Const adTypeBinary = 1
Const adTypeText   = 2

Const adModeReadWrite = 3

Const adSaveCreateOverWrite = 2


Dim strSourceFile
Dim objRegExp

Dim strContent

Dim objStreamBinary


strSourceFile = "C:\Мои проекты\0160\assets_old assets_new\assets_old.txt"

Set objRegExp = WScript.CreateObject("VBScript.RegExp")

With objRegExp
	.Pattern    = "/G-65\r\nMercedes-Benz G65 AMG\r\n"
	.Multiline  = True
	.IgnoreCase = True
End With

With WScript.CreateObject("Scripting.FileSystemObject")
	If .FileExists(strSourceFile) Then
		With .OpenTextFile(strSourceFile, ForReading, False, TristateTrue)
			strContent = .ReadAll()
			.Close
		End With
	Else
		WScript.Echo "Can't find source file [" & strSourceFile & "]."
		WScript.Quit 1
	End If
End With

If Not objRegExp.Test(strContent) Then
	strContent = strContent & vbCrLf & Replace(objRegExp.Pattern, "\r\n", vbCrLf)
	
	Set objStreamBinary = WScript.CreateObject("ADODB.Stream")
	
	With objStreamBinary
		.Type     = adTypeBinary
		.Mode     = adModeReadWrite
		.Open
	End With
	
	With WScript.CreateObject("ADODB.Stream")
		.Type     = adTypeText
		.Mode     = adModeReadWrite
		.Charset  = "unicode"
		.Open
		.WriteText strContent
		.Position = 2           ' Skip BOM
		.CopyTo objStreamBinary ' Strips BOM (first 2 bytes)
		.Close
	End With
	
	With objStreamBinary
		.SaveToFile strSourceFile, adSaveCreateOverWrite
		.Close
	End With
	
	Set objStreamBinary = Nothing
	
	WScript.Echo "Strings [" & objRegExp.Pattern & "] append to source file [" & strSourceFile & "]."
Else
	WScript.Echo "Strings [" & objRegExp.Pattern & "] already presents in source file [" & strSourceFile & "]."
End If

Set objRegExp = Nothing

WScript.Quit 0

Теперь символы конца строки — «\r\n». Не забывайте экранировать в шаблоне спецсимволы, иначе ни искаться, ни добавляться толком не будет. И путь к исходному файлу, и шаблон заданы тупо в коде.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:22, 25-05-2018 | #8


Аватара для TheLeon

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


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

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


Iska, после завершения установки выходит такое окно(скриншот №1 ниже), можно ли это окно скрыть? Строчки добавляются, но между ними такая ерунда (скриншот №2 ниже), т.е. всё, что было на русском - превратилось в непонятные символы.

Скриншот №1

Скриншот №2

Отправлено: 11:33, 25-05-2018 | #9


Ветеран


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

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


Цитата TheLeon:
Iska, после завершения установки выходит такое окно(скриншот №1 ниже), можно ли это окно скрыть? »
Закомментируйте строку:
Код: Выделить весь код
WScript.Echo "Strings [" & objRegExp.Pattern & "] append to source file [" & strSourceFile & "]."
Цитата TheLeon:
Строчки добавляются, но между ними такая ерунда (скриншот №2 ниже), т.е. всё, что было на русском - превратилось в непонятные символы. »
Это не между ними, это то, что Вы добавляете. Если происходит, как Вы пишете, такая ерунда — делайте следующее: упаковываете в архив Ваш исходный файл — именно тот, с которым Вы работаете, упаковываете Ваш файл скрипта .vbs, и прикладываете архив к сообщению.

Вы случайно скрипт не в UTF-8 сохраняете, а?
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:52, 25-05-2018 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Замена строк в файле формата .xml TheLeon Скриптовые языки администрирования Windows 14 17-05-2018 19:47
CMD/BAT - Поиск строк и добавление к ним цифр в файле mountainspeak Скриптовые языки администрирования Windows 1 09-11-2016 13:34
CMD/BAT - [решено] Поиск, удаление, замена и добавление строк в текстового файле. Что возможно? akrav Скриптовые языки администрирования Windows 8 06-12-2015 13:22
CMD/BAT - Подсчет количества одинаковых строк в txt файле lexis1980 Скриптовые языки администрирования Windows 1 19-11-2013 11:46
CMD/BAT - Замена и добавление числа в txt файле Tsok Скриптовые языки администрирования Windows 0 17-10-2011 17:22




 
Переход