1

Тема: VBS: Перекодировка из Unicode в win1251

Прошу прощения за "некропостинг", но вдоволь поискав, не нашел способа чтения *.udl файлов.


...
        strFilePath = Path+"sm.udl"
		Set objTS = objFS.OpenTextFile(strFilePath, 1)
		objTS.SkipLine
		objTS.SkipLine
		Udlread=objTS.Readline
...

В переменной пустота, потому что текст в файле *.udl хранится в формате Unicode.
Перепробовал несколько способов, перекодировать не получилось.
Здесь http://forum.script-coding.com/viewtopic.php?id=997 не зароботало тоже.
Подскажите, как прочесть UDL ?

Автоматизирую торговлю. Не 1С

2

Re: VBS: Перекодировка из Unicode в win1251

У OpenTextFile есть ещё два параметра. Четвёртый указывает кодировку в которой будет открыт файл. По умолчанию обычно 1251.
Хотя на пустоту это влиять не должно. А сколько в файле строк?

Не понятно что именно не заработало через ADODBStream. Желательно увидеть сам код.

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

3

Re: VBS: Перекодировка из Unicode в win1251

Создайте пустой текстовый файл, переименуйте его в UDL , запустите двойным кликом. Увидите свойства подключения к данным.
Если этот файл потом открыть блокнотом увидим примерно это:

[oledb]
; Everything after this line is an OLE DB initstring
Provider=MSDASQL.1;Password=masterkey;Persist Security Info=True;User ID=sysdba;Data Source=Smarket

Т.е. третья строчка - это connection string

Автоматизирую торговлю. Не 1С

4

Re: VBS: Перекодировка из Unicode в win1251

Option Explicit

Const ForReading   = 1
Const TristateTrue = -1


With WScript.CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile("E:\Песочница\0101\Some.udl", ForReading, False, TristateTrue)
        .SkipLine
        .SkipLine
        
        WScript.Echo .ReadLine()
    End With
End With

WScript.Quit 0
Provider=MSDASQL.1;Persist Security Info=False

5

Re: VBS: Перекодировка из Unicode в win1251

Вариант с "ADODB.Stream":

option explicit
Dim ADODBStream, Text
Set ADODBStream = CreateObject("ADODB.Stream")
ADODBStream.Type = 2
ADODBStream.Charset = "UTF-8"
ADODBStream.Open()
ADODBStream.LoadFromFile("test.udl")
ADODBStream.Charset = "Windows-1251"
Text = ADODBStream.ReadText()
ADODBStream.Close()
Dim f_regEx, f_Match, f_Matches
Set f_regEx = New RegExp
f_regEx.IgnoreCase = True
f_regEx.Global = True
f_regEx.Multiline = True
f_regEx.Pattern = "^Provider[\w\W]+"
If f_regEx.Test(Text) then
    Set f_Matches = f_regEx.Execute(Text)
    For Each f_Match in f_Matches
      wscript.echo "Connection string: " & f_Match
    Next
  Else
    wscript.echo "Connection string not found"
End If

6

Re: VBS: Перекодировка из Unicode в win1251

alexii пишет:

With .OpenTextFile

У меня такой вариант не отрабатывает:

D:\aScripts\vbs\tmp\udl_fso2.vbs(12, 9) Ошибка выполнения Microsoft VBScript: Ввод данных за пределами файла

12-ая строка это второй скип-лайн.
Читает из файла только одну строку, хотя при создании udl делал UTF-8 с переносом строк CR+LF(другие варианты юникода и переносов не проверял).
ADO-шный вариант с UTF-8 работает, правда BOM в первой строке глаза мозолит.

7

Re: VBS: Перекодировка из Unicode в win1251

Это сработало. Спасибо.

Автоматизирую торговлю. Не 1С

8

Re: VBS: Перекодировка из Unicode в win1251

2BeS Yara: образец файла *.udl был создан по методу Mat Skywalker'а, и был он в кодировке UTF-16 (1200).

9

Re: VBS: Перекодировка из Unicode в win1251

alexii пишет:

2BeS Yara: образец файла *.udl был создан по методу Mat Skywalker'а, и был он в кодировке UTF-16 (1200).

Да, уже понял в чём ошибка, ступил. Делал UTF-8, а нужен был UTF-16LE.
Для ADO-варианта достаточно поменять кодировку чтения на "Unicode"(или закоментарить строку - юникод дефолтом используется), и убрать конвертирование кодировки(не пойму пока почему при переводе в 1251 остаётся только BOM и левая квадратная скобка).