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

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

Jahnhoy 17-09-2011 23:38 1755158

Вставить имя файла в текстовый файл (UTF-8 without BOM)
 
Как бы сделать батник у которого входным параметром был путь до папки и делал он следующие:
Рекурсивно обходил все подпапки от заданной начальной, а также в ней самой для всех файлов с расширенем .mp3 .flac .ape .wv создавал (но не перезаписывал если такой уже есть) текстовой файл в той же папки и с таким же именем, но с расширением .apl и кодировкой UTF-8 without BOM (Dos\Windows). Плюс содержимое этого файла было следующие
Код:

[Monkey's Audio Image Link File]
Image File=ИМЯ_ФАЙЛА.РАСШИРЕНИЕ
Start Block=0

----- APE TAG (DO NOT TOUCH!!!) -----

P.S. Если кому интересно таким образом можно сделать музыкальную библиотеку в foobar2000 которая будет иметь правильные теги (APEv2) не трогая саченных с торрента файлов (нужен только foo_input_monkey.dll). Можно прям в uTorrent вставить этот батник, чтоб он генерировал аплки когда докачает, и они автоматом добавлялись в библиотеку fb2k, в 3 секунды стянуть теги и вуаля мы и продолжаем сидировать и имеем правильные теги. Также apl позволяет указывать полный путь до файла, а хранить его в другом месте, но такой способ имеет ряд недостатков. Единственная загвоздка с image+сue раздачами, конечно можно добавить в батник проверка если файл только один и есть файл .cue то запустить или другой батник или програмку которая можно превращать cue в apl, но такого батника у меня нет, а единственная программа которая может это делать не может принимать параметров, да еще часто в одной папки лежать несколько image файлов. Так что с данным бат, будет просто создаваться ссылка на один длинный файл, через который можно попасть в папку добавить оттуда cue в foobar2000 и им разрезать на апл, благо такая возможность в нем есть и музыки в image формате появляется все меньше и меньше. Заранее спасибо.

SendMessage 18-09-2011 13:10 1755368

Jahnhoy, могу предложить решение на WSH:
читать дальше »
Код:

' Запуск:
' wscript.exe маршрут_скрипта обрабатываемая_папка1 [обрабатываемая_папка2] [...]

Option Explicit

Const EXT_FILTER = "*.mp3; *.flac; *.ape; *.wv"

If WScript.Arguments.Length Then
  Dim objShApp
  Dim objFSO
  Dim objOC
  Dim i
    Set objShApp = CreateObject("Shell.Application")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objOC = CreateObject("OlePrn.OleCvt.1")
    For i = 0 To WScript.Arguments.Count - 1
      RecDirs objFSO.getfolder(WScript.Arguments.Item(i))
    Next
    Set objShApp = Nothing
    Set objFSO = Nothing
    Set objOC = Nothing 
End If

MsgBox "Скрипт отработал."

WScript.Quit

Sub RecDirs(sDir)
  Dim SubDir
  Dim arrFiles
  Dim i
    For Each SubDir In sDir.SubFolders
      RecDirs(SubDir)
    Next
    Set arrFiles = objShApp.NameSpace(sDir.Path).Items
    arrFiles.Filter 192, EXT_FILTER
    For i = 0 To arrFiles.Count - 1
      CreateAplFile arrFiles.Item(i).Path
    Next
End Sub

Sub CreateAplFile(fPath)
  Dim aplFile
  Dim aplFileName
    aplFileName = objFSO.GetParentFolderName(fPath) & "\" & objFSO.GetBaseName(fPath) & ".apl"
    If Not objFSO.FileExists(aplFileName) Then
      Set aplFile = objFSO.CreateTextFile(aplFileName)
        aplFile.Write "[Monkey's Audio Image Link File]" & vbCrLf & _
                      "Image File=" & objOC.ToUtf8(fPath) & vbCrLf & _
                      "Start Block=0" & vbCrLf & vbCrLf & _
                      "----- APE TAG (DO NOT TOUCH!!!) -----"
      aplFile.Close
    End If
End Sub


Jahnhoy 18-09-2011 16:17 1755477

SendMessage, спасибо огромное вам, мне то всеравно, на чем, главное чтоб работал, только вот с ним есть небольшые проблемки почасти unicode'а. Во первых он создает файлы .apl в кодировки ANSI (по крайне мере так показывает notepad++) и выдает ошибку если встречает файлы по типу 01. Transe Amazônico.mp3. А во вторых ну это не ошибка конечно, но можно ли в "Image File=" вписывать не полный путь до файла, а только само название файла.

P.S. Может я неправильно поступил, но я дал скрипту расширение .vbs и сначала он мне выдавал ошибки, потом погуглил оказывается его надо сохранить в ANSI, а до этого он был в UTF-8, и не работал.

P.S.S. Я тут вручную поправлял все кодировки и точно убедился, что если в файлах присуствуют диакритические символы (а я любитель французкой музыки и таких файлов у меня очень много), то работает только с такой кодировкой в меню notepad++ она носит названее UTF-8 without BOM

SendMessage 18-09-2011 17:06 1755496

Вложений: 1
Цитата:

Цитата Jahnhoy
Во первых он создает файлы .apl в кодировки ANSI (по крайне мере так показывает notepad++) и выдает ошибку если встречает файлы по типу 01. Transe Amazônico.mp3 »

Файл определится как utf-8 только при наличии символов >127. Ведь BOM в начале файла отсутствует, а символы 0-127 в utf-8 совпадают с ansi.
Кстати, я назвал у себя файл 01. Transe Amazônico.mp3 и все нормально (смотрите прикрепленный рисунок).
Цитата:

Цитата Jahnhoy
А во вторых ну это не ошибка конечно, но можно ли в "Image File=" вписывать не полный путь до файла, а только само название файла. »

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

"Image File=" & objOC.ToUtf8(fPath) & vbCrLf & _
на
Код:

"Image File=" & objOC.ToUtf8(objFSO.GetFileName(fPath)) & vbCrLf & _

Jahnhoy 18-09-2011 17:49 1755514

SendMessage, у вас на скриншоте, имя самого апл файла без этой ô. Я когда запускаю скрипт он сначало выдаёт это и в папке появляется 01. Transe Amazônico.apl, но совершенно пустой, затем я жму ок и он обрабатывает все остальные файлы нормлально.

P.S. Win 7 Enterprise SP1 EN но system codepage русская. 1.vbs имеет кодировку ANSI.

SendMessage 18-09-2011 17:58 1755520

Jahnhoy,
Цитата:

Цитата Jahnhoy
SendMessage, у вас на скриншоте, имя самого апл файла без этой ô. »

Внимательней смотрите - на вкладке написано имя файла. А в заголовке окна просто не поддерживается.

Цитата:

Цитата Jahnhoy
Я когда запускаю скрипт он сначало выдаёт это »

Понятно. В семерке или нет файла oleprn.dll, или в нем нет соответствующей функции кодирования в utf-8.

Jahnhoy 18-09-2011 18:15 1755533

Вложений: 1
SendMessage, действительно извините пожалуйста. Но тут чертовщина какая твориться. Проверял щас как на Win7 en так и на WinXP SP3 rus, создал папочку и начинал переименовывать файлы со всякими разными символами и так, на символах ô и ê выдают ошибку, а вот é É à ошибку не выдают, но скрипт все равно делает с é É à не рабочие апл в кодировки ANSI :-( может выложите ваш скрипт которые правильно сработал, мож это как то не так скопировал, а то ничего не могу понять, почему такая избирательность не рабочих символов.

UPD: Прикрепил архив с тестовыми файлами (обычные txt переименованные в Mp3 c разными именами) + сам скрипт. Итог моего теста абсолютно одинаковый на Win7_Enterprise_SP1_ENG и на WinXP_Proffesional_SP3_RUS создаются без ошибок только 3 апл файла (1,2 и 7 трек), но и они с нерабочей кодировкой ANSI.

kiripanda 18-09-2011 19:22 1755571

Вложений: 1
Цитата:

Цитата Jahnhoy
Я когда запускаю скрипт он сначало выдаёт это и в папке появляется 01. Transe Amazônico.apl, но совершенно пустой »

Подтверждаю на WinXP SP3 rus
oleprn.dll ver. 5.1.2600.5512 (xpsp.080413-0852)

SendMessage 19-09-2011 13:21 1756065

Вложений: 1
Jahnhoy
Честно говоря, я в тупике. У меня никаких ошибок не выдает и создает все файлы нормально. Я прикрепил результат отработки по тестовой папке. Обрабатывалось присланным скриптом.
Все файлы notepad++ идентифицирует как "Encode in UTF-8 without BOM".

Ждите, когда прояснят ситуацию более компетентные люди.

Jahnhoy 19-09-2011 13:43 1756073

SendMessage, действительно все сделало как надо, скажите пожалуйста какая у вас система (и системная локализация) и версия этого oleprn.dll. Может это баг этой dll в новых версиях.

SendMessage 19-09-2011 14:33 1756111

Цитата:

Цитата Jahnhoy
скажите пожалуйста какая у вас система (и системная локализация) и версия этого oleprn.dll. »

win xp pro sp2 rus
oleprn.dll v.5.1.2600.2180

Jahnhoy 19-09-2011 17:39 1756260

Решил проблему. На сколько я понял проблема на моих системах вызывали эти куски
Код:

Set objOC = CreateObject("OlePrn.OleCvt.1")
objOC.ToUtf8

т.е. предложенный SendMessage'ом путь создавать текстовый файл в ansi и в него впихивать unicode символы почему у меня не сработал, я погугули и нашел решение котрое действует наооборот т.е. создает изначально UTF-8 а потом удаляет из него это чертов BOM, кстати нашел на этом же форуме, а тут есть решение с отдельной функцией, но уже не стал заморачиваться. Так, что вот версия которая у меня работает не отлично.
читать дальше »
Код:

' Запуск:
' wscript.exe маршрут_скрипта обрабатываемая_папка1 [обрабатываемая_папка2] [...]

Option Explicit

Const EXT_FILTER = "*.mp3; *.flac; *.ape; *.wv"

If WScript.Arguments.Length Then
  Dim objShApp
  Dim objFSO
  Dim objOC
  Dim i
    Set objShApp = CreateObject("Shell.Application")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objOC = CreateObject("OlePrn.OleCvt.1")
    For i = 0 To WScript.Arguments.Count - 1
      RecDirs objFSO.getfolder(WScript.Arguments.Item(i))
    Next
    Set objShApp = Nothing
    Set objFSO = Nothing
    Set objOC = Nothing 
End If

MsgBox "Скрипт отработал."

WScript.Quit

Sub RecDirs(sDir)
  Dim SubDir
  Dim arrFiles
  Dim i
    For Each SubDir In sDir.SubFolders
      RecDirs(SubDir)
    Next
    Set arrFiles = objShApp.NameSpace(sDir.Path).Items
    arrFiles.Filter 192, EXT_FILTER
    For i = 0 To arrFiles.Count - 1
      CreateAplFile arrFiles.Item(i).Path
    Next
End Sub

Sub CreateAplFile(fPath)
  Dim aplFileUTF8
  Dim aplFileWithoutBOM
  Dim aplFileName
    aplFileName = objFSO.GetParentFolderName(fPath) & "\" & objFSO.GetBaseName(fPath) & ".apl"
    If Not objFSO.FileExists(aplFileName) Then
                Set aplFileUTF8 = CreateObject("ADODB.Stream")
                        aplFileUTF8.Type=2
                        aplFileUTF8.Charset = "UTF-8"
                        aplFileUTF8.Open
                        aplFileUTF8.WriteText "[Monkey's Audio Image Link File]" & vbCrLf & _
                                                                        "Image File=" & objFSO.GetFileName(fPath) & vbCrLf & _
                                                                        "Start Block=0" & vbCrLf & vbCrLf & _
                                                                        "----- APE TAG (DO NOT TOUCH!!!) -----"
                        aplFileUTF8.Position=3
                Set aplFileWithoutBOM = CreateObject("ADODB.Stream")
                        aplFileWithoutBOM.Type=1
                        aplFileWithoutBOM.Open
                aplFileUTF8.CopyTo aplFileWithoutBOM
                aplFileWithoutBOM.SaveToFile(aplFileName)
    End If
End Sub


SendMessage еще раз вам говорю спасибо за помощь.


Время: 02:53.

Время: 02:53.
© OSzone.net 2001-2025