Войти

Показать полную графическую версию : [решено] Добавление строк в файле формата .txt


TheLeon
24-05-2018, 12:10
Здравствуйте, уважаемые форумчане OSZone.net. Нужна помощь, а именно:
В файле, например, "assets.txt" нужно добавить строки("/G-65", "Mercedes-Benz G65 AMG" и т.д.) + чтобы каждая строчка была с новой строки и, если уже данная строка в файле присутствует, то ничего не предпринимать. Возможно ли это сделать через .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



/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
Ремонтные части

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

TheLeon
24-05-2018, 14:20
Iska, 152709

Iska
24-05-2018, 14:32
TheLeon, у Вас действительно файлы в Юникоде UTF-16LE без BOM?

TheLeon
24-05-2018, 14:49
Iska, вроде да.

Iska
24-05-2018, 16:10
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.

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

Iska
25-05-2018, 10:22
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». Не забывайте экранировать в шаблоне спецсимволы, иначе ни искаться, ни добавляться толком не будет. И путь к исходному файлу, и шаблон заданы тупо в коде.

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

https://a.radikal.ru/a27/1805/1d/8886fadfef4e.png
https://c.radikal.ru/c40/1805/ef/a38744c19f29.png

Iska
25-05-2018, 11:52
Iska, после завершения установки выходит такое окно(скриншот №1 ниже), можно ли это окно скрыть? »
Закомментируйте строку:
WScript.Echo "Strings [" & objRegExp.Pattern & "] append to source file [" & strSourceFile & "]."

Строчки добавляются, но между ними такая ерунда (скриншот №2 ниже), т.е. всё, что было на русском - превратилось в непонятные символы. »
Это не между ними, это то, что Вы добавляете. Если происходит, как Вы пишете, такая ерунда — делайте следующее: упаковываете в архив Ваш исходный файл — именно тот, с которым Вы работаете, упаковываете Ваш файл скрипта .vbs, и прикладываете архив к сообщению.

Вы случайно скрипт не в UTF-8 сохраняете, а?

TheLeon
25-05-2018, 12:27
Iska, спасибо, окно больше не появляется, а скрипт сохраняю - в UTF-8 без BOM)

Iska
25-05-2018, 12:30
а скрипт сохраняю - в UTF-8 без BOM) »
Не делайте так. Скрипт нужно сохранять в ANSI/1251.

TheLeon
25-05-2018, 12:34
Iska, всё, спасибо вам большое.




© OSzone.net 2001-2012