Компьютерный форум 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=143746)

__sa__nya 29-06-2009 13:28 1154602

Автоматическая смена кодировки .txt файлов
 
Доброе время суток. Нужно написать батник, который бы менял кодировку текстовых файлов с UTF на ANSI. Подскажите пожалуйста как подобное можно реализовать.

amel27 30-06-2009 07:30 1155206

AFAIK только UTF-16LE, если речь про UTF-8 без посторонних утилит не обойтись, варианты:

recode из комплекта UNIX портов:
Код:

recode -f utf8/crlf..cp1251 <1.txt >2.txt
TCODE Алексея Бойко:
Код:

tcode 1.txt /utf 2.txt /win

mitiya 30-06-2009 18:22 1155677

а можно как-то перекодировать слова в cmd ?
Просто я с помощью команды for добыл из файла нужное место, а оно на русском и в кодировке UTF-8, а мне потом его надо записать в файл в кодировке 1251.

mitiya 30-06-2009 23:13 1155945

Цитата:

Цитата amel27
recode -f utf8/crlf..cp1251 <1.txt >2.txt »

у меня на выходе получается файл 0 кб

__sa__nya 01-07-2009 07:34 1156092

amel27, tcode вместо русских букв на выходе дает вопросы, а recode файл весом 0 кб.

amel27 01-07-2009 12:01 1156258

mitiya, __sa__nya, у меня вроде обе работают, :dont-know ...нужен пациент
не совсем в тему - вариант на VBS, вызвать из CMD не составит проблемы:
Код:

FileIn  = "in.txt"
FileOut = "out.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(FileOut, 2, vbTrue)
strText = FileDecode(FileIn, "utf-8")
objFile.WriteLine(strText)

Function FileDecode (strFile, strCP)
  Set Stream = CreateObject("ADODB.Stream")
  With Stream
    .Type = 2
    .Mode = 3
    .CharSet = strCP
    .Open
    .LoadFromFile(strFile)
  End With

  FileDecode = Stream.Readtext()
  Stream.Close
End Function


mitiya 01-07-2009 23:20 1156821

Вложений: 1
скрипт работает, спасибо. А вот recode ни в какую. Пациента прикрепляю.

__sa__nya 02-07-2009 07:32 1156942

amel27, скрипт не пробовал, но recode не работает, во вложении readme.txt - оригинал, readme_recoded - после обработки recode.
Скрипт попробовал, работает, но вот еще нужно, чтобы имя файла было не в него зашито, а ему передавалось батником, и чтобы файл-источник и файл-приемник был одним файлом, короче нужно так, чтобы из файла c UTF-8 кодировкой автоматом делался файл с ANSI-кодировкой. Что-нибудь такое: dir /B *.txt | recode.vbs.
Так возможно сделать?

mitiya 02-07-2009 09:01 1156979

__sa__nya,

просто замени первые строчки.


Код:

FileIn  = Wscript.arguments.Item(0)
FileOut = Wscript.arguments.Item(1)

recode.vbs 1.txt 2.txt

__sa__nya 02-07-2009 10:12 1157032

mitiya, не проходит, мне нужна конструкция, указанная выше: dir /B *.txt | recode.vbs - т.е в папке находится батник, vbs- скрипт, и файл, кодировку которого нужно сменить, имя файла постоянно будет изменяться, первые строки изменял, выходит ошибка Windows Script Host: "Индекс выходит за пределы допустимого диапазона". Т.е файл-источник с UTF-кодировкой должен потом стать файлом с ANSI-кодировкой, количество файлов не должно стать больше.

mitiya 02-07-2009 11:09 1157069

__sa__nya,
перекодировать 1.txt в 2.txt , удалить 1.txt , переименовать 2.txt в 1.txt

не подходит ?

amel27 02-07-2009 12:15 1157143

mitiya, __sa__nya, если в этих файлах удалить первые три псевдосимвола (BOM), RECODE вроде работает... по ходу это наследие никсов... кстати, мануал по утилю: http://www.informatik.uni-hamburg.de...ecode_toc.html

__sa__nya, типа такого?.. с учетом замен двух строчек, как сказал mitiya
Код:

For /F "Delims=" %%i In ('DIR /B *.txt') Do (
  cscript //Nologo recode.vbs "%%i" "%%~dpn.tmp"
  copy /Y "%%~dpn.tmp" "%%i"
  del "%%~dpn.tmp"
)


__sa__nya 02-07-2009 12:46 1157171

amel27, самое оно :), вроде работает, сейчас возьму файлов с десяток, буду проверять.
Еще вопрос: чтобы скрипт vbs отрабатывал, какая служба в системе должна быть запущена, он же на что-то опирается?

amel27 02-07-2009 13:04 1157187

__sa__nya, WSH - это встроенный набор компонент, службы тут не причем:

- для VBS минимум Win2K, но лучше XP/2003 или обновить WSH до версии 5.6;
- для поддержки "ADODB.Stream" минимум XP SP2, иначе накатывать MDAC 2.8

mitiya 03-07-2009 02:24 1157813

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

amel27 03-07-2009 05:12 1157833

mitiya, смысл?.. ИМХО это из разряда извращений, если очень хочется используй AutoIT... в него кста можно запихать и VBS-код

anatolysn 05-05-2018 01:07 2812176

взято из http://forum.oszone.net/post-1156258-6.html

а как выставить принудительно кодировку 866 в получаемом файле в это скрипте?
Код:

FileIn  = "info.xml"
FileOut = "info.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(FileOut, 2, vbTrue)
strText = FileDecode(FileIn, "utf-8")
objFile.WriteLine(strText)

Function FileDecode (strFile, strCP)
  Set Stream = CreateObject("ADODB.Stream")
  With Stream
    .Type = 2
    .Mode = 3
    .CharSet = strCP
    .Open
    .LoadFromFile(strFile)
  End With
  FileDecode = Stream.Readtext()
  Stream.Close
End Function


Iska 05-05-2018 02:26 2812180

Цитата:

Цитата anatolysn
а как выставить принудительно кодировку 866 в получаемом файле в это скрипте? »

WSH: пример конвертации текста из кодировки в кодировку — Windows Script Host, HTA (VBScript, JScript) — Коллекция скриптов и идей — Серый форум:
Цитата:

Цитата alexii
Доступные варианты кодировок на компьютере для использования в вышеприведённых скриптах находятся в реестре по адресу HKEY_CLASSES_ROOT\MIME\Database\Charset.

В данном случае сие может выглядеть, например, так:
Код:

Option Explicit

Const adTypeText            = 2
Const adModeReadWrite      = 3
Const adSaveCreateOverWrite = 2


Dim strSourceFile
Dim strDestFile

Dim strSourceCharset
Dim strDestCharset

Dim objFSO
Dim strContent


strSourceFile = "C:\Мои проекты\0153\0001.xml"
strDestFile  = "C:\Мои проекты\0153\Result.txt"

strSourceCharset = "utf-8"
strDestCharset  = "cp866"


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
        With WScript.CreateObject("ADODB.Stream")
                .Type = adTypeText
                .Mode = adModeReadWrite
               
                .Charset = strSourceCharset
                .Open
                .LoadFromFile strSourceFile
                strContent = .ReadText()
                .Close
               
                .Charset = strDestCharset
                .Open
                .WriteText strContent
                .SaveToFile strDestFile, adSaveCreateOverWrite
                .Close
        End With
Else
        WScript.Echo "Can't find source file [" & strSourceFile & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0


anatolysn 05-05-2018 15:35 2812219

Код:

strSourceFile = "C:\test\*.log"
strDestFile  = "C:\test\*.log"

Код:

strSourceFile = "C:\test\*.log"
strDestFile  = "C:\test\dir2\*.log"

пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку

на единичный файл работает проверил , гуд

система windows xp sp3

П.С.
Я не программист, ссылки на код не понимаю только юзать умею. :(

Iska 06-05-2018 02:59 2812277

Цитата:

Цитата anatolysn
пакетный режим не работает »

Странно, да :lol: ?

Цитата:

Цитата anatolysn
нужно все файлы в одной папке с расширением log конвертировать в другую кодировку »

Вот с этого и нужно было начинать.

Код:

Option Explicit

Dim strSourceFolder
Dim objFile


strSourceFolder = "C:\Мои проекты\0153"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                For Each objFile In .GetFolder(strSourceFolder).Files
                        If StrComp(.GetExtensionName(objFile.Name), "log", vbTextCompare) = 0 Then
                                ConvertFile objFile.Path, "utf-8", "cp866"
                        End If
                Next
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ConvertFile(strFile, strSourceCharset, strDestCharset)
        Const adTypeText            = 2
        Const adModeReadWrite      = 3
        Const adSaveCreateOverWrite = 2
       
        Dim strContent
       
        With WScript.CreateObject("ADODB.Stream")
                .Type = adTypeText
                .Mode = adModeReadWrite
               
                .Charset = strSourceCharset
                .Open
                .LoadFromFile strFile
                strContent = .ReadText()
                .Close
               
                .Charset = strDestCharset
                .Open
                .WriteText strContent
                .SaveToFile strFile, adSaveCreateOverWrite
                .Close
        End With
End Sub
'=============================================================================

Путь к целевому каталогу и расширение файлов тупо заданы в коде, резервные копии не делаются.

anatolysn 06-05-2018 17:59 2812339

Каюсь.
стоило написать мне, и невнимательно прочитать свой запрос
Цитата:

пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку
вот что хотел сказать:
пакетный режим не работает когда нужно все файлы в одной папке с расширением log конвертировать в другую кодировку в другую папку

alpap 06-05-2018 23:45 2812378

Цитата:

Цитата anatolysn
в другую папку »

ну это вы уже могли и командой move допилить на крайний случай.

Iska 07-05-2018 02:24 2812390

Цитата:

Цитата anatolysn
в другую папку »

Код:

Option Explicit

Dim strSourceFolder
Dim strDestFolder
Dim objFile


strSourceFolder = "C:\Мои проекты\0153\Source"
strDestFolder  = "C:\Мои проекты\0153\Destination"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strSourceFolder) Then
                If .FolderExists(strDestFolder) Then
                        For Each objFile In .GetFolder(strSourceFolder).Files
                                If StrComp(.GetExtensionName(objFile.Name), "log", vbTextCompare) = 0 Then
                                        ConvertFile objFile.Path, .BuildPath(strDestFolder, objFile.Name), "utf-8", "cp866"
                                End If
                        Next
                Else
                        WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
                        WScript.Quit 2
                End If
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ConvertFile(strSourceFile, strDestFile, strSourceCharset, strDestCharset)
        Const adTypeText            = 2
        Const adModeReadWrite      = 3
        Const adSaveCreateOverWrite = 2
       
        Dim strContent
       
        With WScript.CreateObject("ADODB.Stream")
                .Type = adTypeText
                .Mode = adModeReadWrite
               
                .Charset = strSourceCharset
                .Open
                .LoadFromFile strSourceFile
                strContent = .ReadText()
                .Close
               
                .Charset = strDestCharset
                .Open
                .WriteText strContent
                .SaveToFile strDestFile, adSaveCreateOverWrite
                .Close
        End With
End Sub
'=============================================================================



Время: 18:56.

Время: 18:56.
© OSzone.net 2001-