Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Добавление строк в файле формата .txt (http://forum.oszone.net/showthread.php?t=334998)

TheLeon 24-05-2018 12:10 2815220

Добавление строк в файле формата .txt
 
Здравствуйте, уважаемые форумчане 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
Ремонтные части


Iska 24-05-2018 12:29 2815228

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

TheLeon 24-05-2018 14:20 2815257

Вложений: 1
Iska, Файл 152709

Iska 24-05-2018 14:32 2815264

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

TheLeon 24-05-2018 14:49 2815267

Iska, вроде да.

Iska 24-05-2018 16:10 2815285

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 2815405

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

Iska 25-05-2018 10:22 2815417

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 2815433

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

Скриншот №1

Скриншот №2

Iska 25-05-2018 11:52 2815435

Цитата:

Цитата TheLeon
Iska, после завершения установки выходит такое окно(скриншот №1 ниже), можно ли это окно скрыть? »

Закомментируйте строку:
Код:

WScript.Echo "Strings [" & objRegExp.Pattern & "] append to source file [" & strSourceFile & "]."
Цитата:

Цитата TheLeon
Строчки добавляются, но между ними такая ерунда (скриншот №2 ниже), т.е. всё, что было на русском - превратилось в непонятные символы. »

Это не между ними, это то, что Вы добавляете. Если происходит, как Вы пишете, такая ерунда — делайте следующее: упаковываете в архив Ваш исходный файл — именно тот, с которым Вы работаете, упаковываете Ваш файл скрипта .vbs, и прикладываете архив к сообщению.

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

TheLeon 25-05-2018 12:27 2815439

Iska, спасибо, окно больше не появляется, а скрипт сохраняю - в UTF-8 без BOM)

Iska 25-05-2018 12:30 2815442

Цитата:

Цитата TheLeon
а скрипт сохраняю - в UTF-8 без BOM) »

Не делайте так. Скрипт нужно сохранять в ANSI/1251.

TheLeon 25-05-2018 12:34 2815444

Iska, всё, спасибо вам большое.


Время: 14:10.

Время: 14:10.
© OSzone.net 2001-