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

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

chek 09-03-2017 17:54 2717950

исправить кодировку при вставке строки
 
всем привет.
друзья, есть файл (см вложение) в кодировке UCS-2 LE BOM
есть простой батник
Код:

set sword=CommonCfgLocation=\\SQLSERVER\Common1C\1CESCmn.cfg
find /i "%sword%" %AppData%\1C\1CEStart\1CEStart.cfg
echo %ERRORLEVEL%
if %ERRORLEVEL%==1 (
echo. >> %AppData%\1C\1CEStart\1CEStart.cfg
echo. >> %AppData%\1C\1CEStart\1CEStart.cfg
echo %sword% >> %AppData%\1C\1CEStart\1CEStart.cfg
)

после того, как строка добавляется, она не читается. как исправить ситуацию?

Iska 09-03-2017 18:16 2717954

Цитата:

Цитата chek
(см вложение) »

Нет вложения.

Цитата:

Цитата chek
после того, как строка добавляется, она не читается. как исправить ситуацию? »

Не использовать пакетные файлы. Использовать WSH/PoSH.

Цитата:

Цитата chek
UCS-2 »

UTF-16.

Iska 09-03-2017 18:36 2717963

Вот примерная болванка на WSH (не знаю, зачем там две пустые строки предварительно добавлять, но, коль Вы так написали…):
Скрытый текст
Код:

Option Explicit

Const ForReading  = 1
Const ForAppending = 8

Const TristateTrue      = -1


Dim strPattern
Dim strSourceFile

Dim strContent


strPattern    = "CommonCfgLocation=\\SQLSERVER\Common1C\1CESCmn.cfg"
strSourceFile = WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings("%AppData%\1C\1CEStart\1CEStart.cfg")

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FileExists(strSourceFile) Then
                With .OpenTextFile(strSourceFile, ForReading, False, TristateTrue)
                        strContent = .ReadAll()
                        .Close
                End With
               
                If Not InStr(1, strContent, strPattern, vbTextCompare) > 0 Then
                        With .OpenTextFile(strSourceFile, ForAppending, False, TristateTrue)
                                .WriteBlankLines 2
                                .WriteLine strPattern
                                .Close
                        End With
                End If
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0


chek 10-03-2017 08:52 2718086

Вложений: 1
добавил файл.
хотелось бы с помощью батника, т.к. будет распространятся с помощью ГП и добавится в уже существующий start.bat.

chek 10-03-2017 14:20 2718178

написал на поше
Код:

$ma = Get-Item $env:APPDATA\1C\1CEStart\1CEStart.cfg | Get-Content
$tt = "SQLSERVER\\Common1C\\1CESCmn.cfg"
if ($ma -match $tt) {} else {
Add-Content $env:APPDATA\1C\1CEStart\1CEStart.cfg "`nCommonCfgLocation=\\SQLSERVER\Common1C\1CESCmn.cfg"
}

результат тот же - вставляет иероглифы.

alpap 10-03-2017 14:37 2718183

если bat в 866 и файл потом читать в 866й, то cmd сможет разве это:
Код:

@echo off
set "f=1CEStart.txt"
set "sword=CommonCfgLocation=\\SQLSERVER\Common1C\1CESCmn.cfg"
>>$ (
 <"%f%">nul find /i "%sword%" || (
  more "%f%"
  echo.
  echo.
  echo %sword%
 )
)& move $ "%f%"
exit

или уже измененый в конце файл конвертируйте с помощью PoSh в utf-16, если так нужно.
А чем на vbs что Iska написал не устраивает, он же есть в системе, ничего устанавливать не нужно.

Iska 10-03-2017 14:52 2718188

Цитата:

Цитата chek
хотелось бы с помощью батника, »

chek, «батники» пакетные файлы очень ограниченно работают с юникодом.

Цитата:

Цитата chek
хотелось бы с помощью батника, т.к. будет распространятся с помощью ГП и добавится в уже существующий start.bat. »

Групповой политике глубоко наплевать, будет ли там пакетный файл, скрипт WSH или скрипт PoSH. Или даже несколько. Или вперемешку.

Кого «осенила» «светлая» идея дать пакетному файлу имя одной из внутренних команд командного процессора?! :lol:

Цитата:

Цитата chek
написал на поше … результат тот же - вставляет иероглифы. »

Без разницы — хоть на WSH, хоть на PowrShell — всё будет лучше, нежели на пакетных файлах.

Не нравится чем-то вышеприведённый WSH — держите аналогичный на PoSH:
Скрытый текст
Код:

$sPattern    = 'CommonCfgLocation=\\SQLSERVER\Common1C\1CESCmn.cfg'
$sSourceFile = "$($env:AppData)\1C\1CEStart\1CEStart.cfg"

if(Test-Path -Path $sSourceFile -PathType Leaf) {
    if(-not (Select-String -Path $sSourceFile -Encoding unicode -Pattern $sPattern -SimpleMatch -Quiet)) {
        Add-Content -Path $sSourceFile -Encoding Unicode -Value "`r`n`r`n$sPattern"
    }
} else {
    Write-Host "Can't find source file [$sSourceFile]." -ForegroundColor Red
}


chek 10-03-2017 15:00 2718190

Цитата:

Цитата alpap
уже измененый в конце файл конвертируйте с помощью PoSh в utf-16 »

подскажите, как это сделать?
немного видоизменил скрипт
Код:

$ma = Get-Item $env:APPDATA\1C\1CEStart\1CEStart.cfg | Get-Content
$tt = "SQLSERVER\\Common1C\\1CESCmn.cfg"
if ($ma -match $tt) {} else {
$tt | Out-File $env:APPDATA\1C\1CEStart\1CEStart.cfg -Encoding utf8 -Append }

но конечный файл все-равно сохраняется в UCS-2 LE BOM
Цитата:

Цитата alpap
А чем на vbs что Iska написал не устраивает »

к сожалению у меня совсем нет познаний в этом языке, а хочется не только получить результат, но и научиться.

Iska 10-03-2017 15:12 2718196

Цитата:

Цитата chek
а хочется не только получить результат, но и научиться. »

chek, перед Вашим последним сообщением — код на PowerShell. Учитесь.

P.S. И, ради бога, переименуйте start.bat в какое-нибудь другое имя.


Время: 21:41.

Время: 21:41.
© OSzone.net 2001-