<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript/WSH: Конвертация flac в mp3]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=4996</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4996&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript/WSH: Конвертация flac в mp3».]]></description>
		<lastBuildDate>Mon, 04 Oct 2010 14:28:53 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39876#p39876</link>
			<description><![CDATA[<p>OFF:</p><div class="quotebox"><cite>Высокий пишет:</cite><blockquote><p>…теги не сможете перенести…</p></blockquote></div><p>Да, ну, совсем не смогу <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />: <a href="http://api.farmanager.com/ru2/macro/macrocmd/functions.html">Функции</a>?!</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 04 Oct 2010 14:28:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39876#p39876</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39873#p39873</link>
			<description><![CDATA[<p>Как минимум, теги не сможете перенести и ручной работы многовато.</p>]]></description>
			<author><![CDATA[null@example.com (Высокий)]]></author>
			<pubDate>Mon, 04 Oct 2010 13:46:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39873#p39873</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39871#p39871</link>
			<description><![CDATA[<p>OFF: </p><div class="quotebox"><cite>Высокий пишет:</cite><blockquote><p>Как вы предлагаете делать конвертацию Far&#039;ом?</p></blockquote></div><p>Не Far&#039;ом, а с помощью Far&#039;а; например: поиск *.flac, помещение результатов во временную панель, выделение, обработка файлов по Ctrl-G (на каждую команду) или, лучше, через подготовленный пункт UserMenu (так же, как Вы делаете посредством «WshShell.Run»). Естественно, без транслитерации; если она понадобиться — будет транслитерация, то надо будет уже писать макрос.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 04 Oct 2010 12:46:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39871#p39871</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39869#p39869</link>
			<description><![CDATA[<p>Обновил. Изменения:<br />* Учтён рабочий каталог скрипта. Протестирован SendTo.<br />* Учтён регистр тегов. Это нужно тестировать, мой metaflac 1.2.1 создает их в верхнем регистре. Возможно зависит от файла.<br />* Добавлено предварительное сканирование на наличие файлов flac.</p><div class="codebox"><pre><code>&#039;*********************************************************************************
&#039;script        : flac_v_mp3.vbs
&#039;description    : Recode flac to mp3  
&#039;usage        : create a shortcut to this file in the &quot;SendTo&quot; folder or run with source path
&#039;date        : 04.10.2010
&#039;version    : 1.1
&#039;req        : flac.exe metaflac.exe http://flac.sourceforge.net/ lame.exe http://lame.sourceforge.net
&#039;author        : Ivan@Lapenkov.ru
&#039;    Описание    
&#039;    У вас есть папка вида    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    внутри которой папки и файлы, в том числе .flac :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.flac&quot;
&#039;    Запускаете     
&#039;        flac_v_mp3.vbs &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    Создается папка    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3&quot;
&#039;    внутри которой:    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.mp3&quot;
&#039;    или при запуске с настройкой RecodeRus=1 :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Mocart\01 - Malen&#039;kaja nochnaja serenada sol&#039; mazhor (KV 525) - Allegro.mp3&quot;
&#039;    Переносятся теги, высокое качество, VBR, стерео. Все настройки кодирования можно изменить. На посторонние файлы внимания не обращает.    
&#039;    Скрипт создает временный файл в %Temp%, из тегов удаляются символы &quot;?*\/|&lt;&gt;:
&#039;    Скрипт можно запускать повторно, уже созданные файлы пропускаются.
&#039;        
&#039;    Скрипт требует следующие компоненты в своей папке:    
&#039;    flac.exe metaflac.exe    
&#039;    Версия     1.2.1
&#039;    http://flac.sourceforge.net    
&#039;        
&#039;    lame.exe    
&#039;    Версия    3.98.4
&#039;    http://lame.sourceforge.net    
&#039;        
&#039;    Протестировано на WinXP Prof sp3 rus.    
&#039;    Автор программы разрешает её свободное распространение и использование любых её фрагментов.
&#039;*********************************************************************************

&#039;***********************************
&#039;Настройки
&#039;***********************************
Option Explicit

&#039; Настройки кодировщика LAME
Const LameKeys = &quot;-V 0 --vbr-new -m s -q 2 --add-id3v2 --ignore-tag-errors --nohist --quiet&quot; 

&#039; 1 - перекодировать имена файлов в транслит, 0 - нет. Удобно для устройств не поддерживающих кириллицу.
Const RecodeRus=0

&#039; Пауза на сообщениях о некритических ошибках, секунды
Const PauseSize = 5     

&#039; 0 - окна кодировщиков скрыты, 1 - показываются
Const WindowState = 0    

&#039; Будет добавлено к имени исходной папки при создании выходной папки
Const sPostfixFolder = &quot;-mp3&quot; 

&#039; Расширения файлов
Const sExtToGet = &quot;flac&quot;
Const sExtToSet = &quot;mp3&quot;

&#039; Название приложения
Const sAppName = &quot;Конвертер FLAC в mp3&quot;

&#039; Таблицы конвертации символов
Const tr=&quot;а б в г д е ё  ж  з и й  к л м н о п р с т у ф х  ц ч  ш  щ   ъ  ы ь э  ю  я  А Б В Г Д Е Ё  Ж  З И Й  К Л М Н О П Р С Т У Ф Х  Ц Ч  Ш  Щ   Ъ  Ы Ь Э  Ю  Я  &quot;
Const tl=&quot;аaбbвvгgдdеeёjoжzhзzиiйjjкkлlмmнnоoпpрrсsтtуuфfхkhцcчchшshщshhъ&#039;&#039;ыyь&#039;эehюjuяjaАAБBВVГGДDЕEЁJoЖZhЗZИIЙJjКKЛLМMНNОOПPРRСSТTУUФFХKhЦCЧChШShЩShhЪ&#039;&#039;ЫYЬ&#039;ЭEhЮJuЯJa&quot;

&#039;***********************************
&#039;Начало основной программы
&#039;***********************************
Dim fso, WshShell, Kav, cptTot, objArgs, arg, dicPath, TagKeys, ScriptPath
Dim sSourceFolder, sSavePath, sTempFolder
Dim FlacExeFile, MetaFlacExeFile, LameExeFile
Dim nTime

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)
Set dicPath = CreateObject(&quot;Scripting.Dictionary&quot;)
cptTot = 0 
nTime = Timer

sTempFolder = WshShell.ExpandEnvironmentStrings(&quot;%Temp%&quot;)

ScriptPath = FSO.GetParentFolderName(WScript.ScriptFullName)
FlacExeFile = FSO.BuildPath(ScriptPath, &quot;flac.exe&quot;)
MetaFlacExeFile = FSO.BuildPath(ScriptPath, &quot;metaflac.exe&quot;)
LameExeFile = FSO.BuildPath(ScriptPath, &quot;lame.exe&quot;)

If Not fso.FileExists(FlacExeFile) Then
    WshShell.Popup &quot;Не найден &quot; &amp; FlacExeFile, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(MetaFlacExeFile) Then
    WshShell.Popup &quot;Не найден &quot; &amp; MetaFlacExeFile, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(LameExeFile) Then
    WshShell.Popup &quot;Не найден &quot; &amp; LameExeFile, 0, sAppName, 48
    WScript.Quit
End If



Set objArgs = WScript.Arguments
if (objArgs.Count = 0) then
    WshShell.Popup &quot;В командной строке должен быть путь к исходным файлам. Need source path in arguments.&quot;, 0, sAppName, 48
    WScript.Quit
End If

&#039;-- Работа
Call startScanning()
Call endPopup()

&#039;-- Очистка
Set fso = nothing
Set WshShell = nothing                    
Set dicPath = nothing
&#039;***********************************
&#039;Конец основной программы
&#039;***********************************


&#039;***********************************
&#039;Функции
&#039;***********************************

Sub startScanning()

    Dim arg, fold, sSourceFoldName

    &#039; перебирает пути из командой строки
    For each arg in objArgs
        If fso.FolderExists(arg) Then
            
            Set sSourceFolder = fso.Getfolder(arg)

            &#039; Определимся с папкой для сохранения
            sSourceFoldName = sSourceFolder.Path
            sSavePath = sSourceFoldName &amp; sPostfixFolder
            dicPath.add sSavePath, sSavePath

            &#039;Обойдем папки, проверяя нужность конвертации
            Call DoCheck(sSourceFolder)

            If cptTot=0 Then
                WshShell.Popup &quot;Файлов для конвертации нет&quot;, PauseSize, sAppName, 48
                WScript.Quit
            Else
                &#039;WshShell.Popup &quot;Файлов для конвертации &quot; &amp; cptTot, PauseSize, sAppName, 64
            End If
            
            cptTot=0

            &#039; Создание папки для сохранения
            If Not fso.FolderExists(sSavePath) Then
                &#039;WshShell.Popup &quot;Создание папки &quot; &amp; sSavePath, PauseSize, sAppName, 64
                fso.CreateFolder(sSavePath)
            End If

            &#039;Обойдем папки, конвертируя
            Call DoIt(sSourceFolder)
        End If
    Next
End Sub 
&#039;*********************************************************************************

Sub DoIt(fold)
&#039; Рекурсия
    Dim sfold, sfoo
    Call ProceedFiles(fold)        &#039; обработывает все файлы в текущей папке
    Set sfold = fold.subfolders 
    for each sfoo in sfold        &#039; работа с подпапками
        Call DoIt(sfoo)
    Next
End Sub  

&#039;*********************************************************************************
&#039; Основная процедура обработки

Sub ProceedFiles(fold)

    Dim RetCode, strExt, mpFiles, objFile, strName, strNameNew, foldPath, cpt, f, mp3filename, mp3filepath, tempfilename, flacfilename, RunFlacCommand, RunLameCommand
    Dim temptagfile, temptagfilename, TagsText, TextLine

    tempfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    temptagfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    If fso.FileExists(tempfilename) Then
                  fso.DeleteFile tempfilename, 1
    End If
    If fso.FileExists(temptagfilename) Then
                  fso.DeleteFile temptagfilename, 1
    End If

    cpt = 0
    foldPath = fold.Path
    mp3filepath = Replace(foldPath, sSourceFolder.Path, &quot;&quot;)
    If RecodeRus = 1 Then
        mp3filepath=translit(mp3filepath)
    End If
    mp3filepath=sSavePath &amp; mp3filepath

    &#039; ***** Создание конечной папки 
    If Not fso.FolderExists(mp3filepath) Then
        fso.CreateFolder(mp3filepath)
    End If

    &#039; ***** обработаем все файлы в папке
    Set mpfiles = fold.Files
    
    For each f in mpfiles

        strName = f.Name
        strExt = LCase(fso.GetExtensionName(strName)) &#039; Получим расширение

        If strExt = sExtToGet Then

            &#039; ***** Подготовка имен файлов
            flacfilename = foldPath &amp;&quot;\&quot;&amp; strName
            strNameNew = Replace(strName, sExtToGet, sExtToSet)
            If RecodeRus = 1 Then
                strNameNew=translit(strNameNew)
            End If
                   mp3filename = mp3filepath &amp; &quot;\&quot; &amp; strNameNew

            &#039; ***** Проверка нужности конвертации
            If Not fso.FileExists(mp3filename) Then

            &#039; ***** Раскодирование во временный файл
            RunFlacCommand = FlacExeFile &amp;&quot; -d -F -f &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; -o &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If RetCode = 1 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunFlacCommand, PauseSize, sAppName, 48
            End If
            &#039; если у файла назначения есть атрибут ReadOnly, снимаем его
            If fso.FileExists(tempfilename) Then
                    Set objFile = FSO.GetFile(tempfilename)
                If objFile.Attributes And 1 Then
                    objFile.Attributes = objFile.Attributes - 1
                End If
                set objFile = nothing
            End If

            &#039; ***** теги
            TagKeys=&quot;&quot; &#039; главная переменная куда будут сохраняться ключи командной строки
            RunFlacCommand = MetaFlacExeFile &amp;&quot; --export-tags-to=&quot;&amp; temptagfilename &amp;&quot; &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If fso.FileExists(temptagfilename) Then
                Set temptagfile = FSO.GetFile(temptagfilename)
                Set TagsText = temptagfile.OpenAsTextStream(1,0)
                Do While Not TagsText.AtEndOfStream
                    ParseTagToKeys(TagsText.ReadLine)
                Loop
                TagsText.Close
                set temptagfile = nothing
                fso.DeleteFile temptagfilename, 1
                TagKeys = TagKeys &amp;&quot; --tv &quot;&quot;TENC=FLAC-&gt;LAME&quot;&quot;&quot;
            End If

            &#039; ***** Кодирование в mp3
            RunLameCommand = LameExeFile &amp;&quot; &quot;&amp; LameKeys &amp;&quot; &quot;&amp; TagKeys &amp;&quot; &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot;  &quot;&quot;&quot;&amp; mp3filename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunLameCommand, WindowState , true)
            If not RetCode = 0 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunLameCommand, PauseSize, sAppName, 48
            End If


            &#039; ***** Удаление временного файла
            If fso.FileExists(tempfilename) Then
                            fso.DeleteFile tempfilename, 1
            End If

            cpt = cpt + 1
                          
            End If
        End If
    Next

    cptTot = cptTot + cpt    &#039; общий счетчик файлов
End Sub
&#039;*********************************************************************************

Sub ParseTagToKeys(textline)

    ParseTag textline,&quot;TITLE&quot;, &quot;--tt&quot;
    ParseTag textline,&quot;DATE&quot;,&quot;--ty&quot;
    ParseTag textline,&quot;ARTIST&quot;,&quot;--ta&quot;
    ParseTag textline,&quot;ALBUM&quot;,&quot;--tl&quot;
    ParseTag textline,&quot;TRACKNUMBER&quot;,&quot;--tn&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TCOM=&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TPE2=&quot;
    ParseTag textline,&quot;COMMENT&quot;,&quot;--tc&quot;

&#039;    ParseTag textline,&quot;YEAR&quot;,&quot;--ty&quot;
    &#039;ParseTag textline,&quot;GENRE&quot;,&quot;--tg&quot;     &#039;&quot;genre&quot; нужно включать таблицу, но нет желания с ней возиться
    &#039;ParseTag textline,&quot;ENCODER&quot;,&quot;&quot;     &#039; FLAC-&gt;LAME

End Sub
&#039;*********************************************************************************

Sub ParseTag(textline,tag,cmdkey)
        Dim TagText, Pos, TagKey
    TagKey=&quot;&quot;
    Pos=0
    textline=trim(textline)
    tag=tag&amp;&quot;=&quot;
    
    Pos=InStr(UCase(textline), UCase(tag))

        If Not Pos=0 Then
        TagText=Mid(textline, len(tag)+1)
        TagText=StrConvert(TagText, &quot;windows-1251&quot;, &quot;cp866&quot;)
        TagText = Replace(TagText, &quot;&quot;&quot;&quot;, &quot;&#039;&quot;) 
        TagText = Replace(TagText, &quot;:&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;&lt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;&gt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;|&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;?&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;*&quot;, &quot;+&quot;)
        TagText = Replace(TagText, &quot;/&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;\&quot;, &quot; &quot;)
        If RecodeRus = 1 Then
            TagText=translit(TagText)
        End If
        If InStr(cmdkey, &quot;&quot;&quot;&quot;)=0 Then &#039; часть cmdkey идёт с открытыми кавычками
            TagKey=cmdkey &amp; &quot; &quot;&quot;&quot; &amp; TagText &amp; &quot;&quot;&quot;&quot;
        Else
            TagKey=cmdkey &amp; TagText &amp; &quot;&quot;&quot;&quot;
        End If
        TagKeys = TagKeys &amp;&quot; &quot;&amp; TagKey
    End If
End Sub
&#039;*********************************************************************************

&#039;=============================================================================
&#039; HKEY_CLASSES_ROOT\MIME\Database\Charset
&#039; cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
&#039;=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    
    
    With WScript.CreateObject(&quot;ADODB.Stream&quot;)
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = strSourceCharset
        .WriteText strText
        
        .Position  = 0
        .Charset   = strDestCharset
        StrConvert = .ReadText
        
        .Close
    End With
End Function

Function showTime(nTime)
    showTime = &quot;Затрачено времени : &quot; &amp; Round((Timer - nTime),2) &amp;&quot; секунд&quot;
End Function
&#039;*********************************************************************************

&#039; функция транслитерации строки по ГОСТ 7.79 2000
Function translit(ByVal sIncoming)
    Dim pos, findpos, sSymbol
    
    translit=&quot;&quot;

    For pos = 1 To len(sIncoming) Step 1

        sSymbol=mid(sIncoming,pos,1)
        findpos=InStr(1, tr, sSymbol)
        If findpos=0 or sSymbol=&quot; &quot; Then
            &#039; ***** В транслитерации не нуждается
            translit=translit+sSymbol
        Else
            &#039; ***** Первый символ
            translit=translit+mid(tl,findpos+1,1)
            &#039; ***** Второй символ
            If mid(tr,findpos+2,1)=&quot; &quot; Then
                translit=translit+mid(tl,findpos+2,1)
                &#039; ***** Третий символ
                If mid(tr,findpos+3,1)=&quot; &quot; Then
                    translit=translit+mid(tl,findpos+3,1)
                End If
            End If
        End If
    Next
End Function

&#039;*********************************************************************************
&#039; проверяет наличие файлов для конвертации
Sub DoCheck(fold)

    Dim sfold, sfoo
    Dim strExt, mpFiles, strName, strNameNew, foldPath, cpt, f, mp3filename, mp3filepath

    cpt = 0
    foldPath = fold.Path
    mp3filepath = Replace(foldPath, sSourceFolder.Path, &quot;&quot;)
    If RecodeRus = 1 Then
        mp3filepath=translit(mp3filepath)
    End If
    mp3filepath=sSavePath &amp; mp3filepath

    &#039; ***** обработаем все файлы в папке
    Set mpfiles = fold.Files
    
    For each f in mpfiles

        strName = f.Name
        strExt = LCase(fso.GetExtensionName(strName)) &#039; Получим расширение

        If strExt = sExtToGet Then

            strNameNew = Replace(strName, sExtToGet, sExtToSet)
            If RecodeRus = 1 Then
                strNameNew=translit(strNameNew)
            End If
                   mp3filename = mp3filepath &amp; &quot;\&quot; &amp; strNameNew

            &#039; ***** Проверка нужности конвертации
            If Not fso.FileExists(mp3filename) Then

                cpt = cpt + 1
    
            End If
                          
        End If
    Next

    cptTot = cptTot + cpt    &#039; общий счетчик файлов

    &#039; ***** обработаем все подпапки в папке
    Set sfold = fold.subfolders 
    for each sfoo in sfold
        Call DoCheck(sfoo) &#039; Рекурсия
    Next
End Sub  


Sub endPopup()
    WshShell.Popup &quot;Завершено. &quot;  &amp; chr(13) &amp; chr(13) &amp; cptTot &amp; _
                    &quot; файлов обработано в &quot; &amp; chr(13) &amp; _
                    Join(dicPath.items, vbCrLf) &amp; Chr(13) &amp; Chr(13) &amp; _
                    showTime(nTime), 0, sAppName, 64    
End Sub
&#039;*********************************************************************************</code></pre></div><div class="quotebox"><blockquote><p>я не вижу необходимости пользовать подобное при наличии Far&#039;а.</p></blockquote></div><p>Как вы предлагаете делать конвертацию Far&#039;ом?</p>]]></description>
			<author><![CDATA[null@example.com (Высокий)]]></author>
			<pubDate>Mon, 04 Oct 2010 12:33:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39869#p39869</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39864#p39864</link>
			<description><![CDATA[<p>OFF: Мне не то, чтобы лень, а:<br />* у меня нет ни одного *.flac (так что, я даже толком не знаю, каково оно на вкус <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />);<br />* я не вижу необходимости пользовать подобное при наличии Far&#039;а.</p><p>Могу сказать лишь, что такие конструкции:<br /></p><div class="codebox"><pre><code>If Not fso.FileExists(&quot;lame.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл lame.exe&quot;, 0, sAppName, 48
…</code></pre></div><p>красиво работают лишь до тех пор, пока рабочий каталог тождественен каталогу, содержащему скрипт. При попытке вызвать скрипт посредством ярлыка в SendTo или Drag-n-Drop на него:<br /></p><div class="quotebox"><blockquote><p>&#039;usage&nbsp; &nbsp; &nbsp; &nbsp; : create a shortcut to this file in the &quot;SendTo&quot; folder or drag-drop folders on it or…</p></blockquote></div><p>або вызвать из иного каталога с указанием полного пути к скрипту — последний закономерно отваливается на данной конструкции. Так делать нельзя.</p><p>P.S. Есть ли необходимость создавать выходную папку при отсутствии хотя бы одного сконвертированного файла?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 04 Oct 2010 08:22:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39864#p39864</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39862#p39862</link>
			<description><![CDATA[<p>Создал папку с хаотичной структурой с максимальной вложенностью 3 уровня. Все отлично сконвертилось. Получилось аналогичное зеркало mp3-шек.<br />НО! Теги не перенеслись.</p><p>Поковырял, оказалось что названия тегов во временном файле у меня получились строчными буквами.<br /></p><div class="codebox"><pre><code>artist=Ali Farka Toure
title=I Go Ka
album=The Source
date=1991
tracknumber=08
genre=World
comment=shared by pastafari cubensis</code></pre></div><p>У вас же в скрипте <br /></p><div class="codebox"><pre><code>    ParseTag textline,&quot;TITLE&quot;, &quot;--tt&quot;
    ParseTag textline,&quot;YEAR&quot;,&quot;--ty&quot;
    ParseTag textline,&quot;ARTIST&quot;,&quot;--ta&quot;
    ParseTag textline,&quot;ALBUM&quot;,&quot;--tl&quot;
    ParseTag textline,&quot;TRACKNUMBER&quot;,&quot;--tn&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TCOM=&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TPE2=&quot;
    ParseTag textline,&quot;COMMENT&quot;,&quot;--tc&quot;</code></pre></div><p>Я так понимаю, либо не хватает функции toLowerCase() (или какая она там в VBS) либо metaflac.exe другой версии.<br />Хотя проверил только что. v1.2.1, свеже скачанная.</p>]]></description>
			<author><![CDATA[null@example.com (DnsIs)]]></author>
			<pubDate>Mon, 04 Oct 2010 06:43:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39862#p39862</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39861#p39861</link>
			<description><![CDATA[<p>Прошу отписаться всех, кому не лень протестировать.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Mon, 04 Oct 2010 05:15:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39861#p39861</guid>
		</item>
		<item>
			<title><![CDATA[VBScript/WSH: Конвертация flac в mp3]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=39855#p39855</link>
			<description><![CDATA[<p>Написал скрипт конвертация flac в mp3. Описание в шапке.</p><div class="codebox"><pre><code>&#039;*********************************************************************************
&#039;script        : flac_v_mp3.vbs
&#039;description    : Recode flac to mp3  
&#039;usage        : create a shortcut to this file in the &quot;SendTo&quot; folder or drag-drop folders on it or run with source path
&#039;date        : 01.10.2010
&#039;version    : 1.0
&#039;req        : flac.exe metaflac.exe http://flac.sourceforge.net/ lame.exe http://lame.sourceforge.net
&#039;author        : Ivan@Lapenkov.ru
&#039;    Описание    
&#039;    У вас есть папка вида    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    внутри которой папки и файлы, в том числе .flac :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.flac&quot;
&#039;    Запускаете     
&#039;        flac_v_mp3.vbs &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    Создается папка    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3&quot;
&#039;    внутри которой:    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.mp3&quot;
&#039;    или при запуске с настройкой RecodeRus=1 :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Mocart\01 - Malen&#039;kaja nochnaja serenada sol&#039; mazhor (KV 525) - Allegro.mp3&quot;
&#039;    Переносятся теги, высокое качество, VBR, стерео. Все настройки кодирования можно изменить. На посторонние файлы внимания не обращает.    
&#039;    Скрипт создает временный файл в %Temp%, из тегов удаляются символы &quot;?*\/|&lt;&gt;:
&#039;    Скрипт можно запускать повторно, уже созданные файлы пропускаются.
&#039;        
&#039;    Скрипт требует следующие компоненты в своей папке:    
&#039;    flac.exe metaflac.exe    
&#039;    Версия     1.2.1
&#039;    http://flac.sourceforge.net    
&#039;        
&#039;    lame.exe    
&#039;    Версия    3.98.4
&#039;    http://lame.sourceforge.net    
&#039;        
&#039;    Протестировано на WinXP Prof sp3 rus.    
&#039;    Автор программы разрешает её свободное распространение и использование любых её фрагментов.
&#039;*********************************************************************************

&#039;***********************************
&#039;Настройки
&#039;***********************************
Option Explicit

&#039; Настройки кодировщика LAME
Const LameKeys = &quot;-V 0 --vbr-new -m s -q 2 --add-id3v2 --ignore-tag-errors --nohist --quiet&quot; 

&#039; 1 - перекодировать имена файлов в транслит, 0 - нет. Удобно для устройств не поддерживающих кириллицу.
Const RecodeRus=0

&#039; Пауза на сообщениях о некритических ошибках, секунды
Const PauseSize = 5     

&#039; 0 - окна кодировщиков скрыты, 1 - показываются
Const WindowState = 0    

&#039; Будет добавлено к имени исходной папки при создании выходной папки
Const sPostfixFolder = &quot;-mp3&quot; 

&#039; Расширения файлов
Const sExtToGet = &quot;flac&quot;
Const sExtToSet = &quot;mp3&quot;

&#039; Название приложения
Const sAppName = &quot;Конвертер FLAC в mp3&quot;

&#039; Таблицы конвертации символов
Const tr=&quot;а б в г д е ё  ж  з и й  к л м н о п р с т у ф х  ц ч  ш  щ   ъ  ы ь э  ю  я  А Б В Г Д Е Ё  Ж  З И Й  К Л М Н О П Р С Т У Ф Х  Ц Ч  Ш  Щ   Ъ  Ы Ь Э  Ю  Я  &quot;
Const tl=&quot;аaбbвvгgдdеeёjoжzhзzиiйjjкkлlмmнnоoпpрrсsтtуuфfхkhцcчchшshщshhъ&#039;&#039;ыyь&#039;эehюjuяjaАAБBВVГGДDЕEЁJoЖZhЗZИIЙJjКKЛLМMНNОOПPРRСSТTУUФFХKhЦCЧChШShЩShhЪ&#039;&#039;ЫYЬ&#039;ЭEhЮJuЯJa&quot;

&#039;***********************************
&#039;Начало основной программы
&#039;***********************************
Dim fso, WshShell, Kav, cptTot, objArgs, arg, dicPath, TagKeys
Dim sSourceFolder, sSavePath, sTempFolder
Dim nTime

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)
Set dicPath = CreateObject(&quot;Scripting.Dictionary&quot;)
cptTot = 0 
nTime = Timer

sTempFolder = WshShell.ExpandEnvironmentStrings(&quot;%Temp%&quot;)

If Not fso.FileExists(&quot;lame.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл lame.exe&quot;, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(&quot;flac.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл flac.exe&quot;, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(&quot;metaflac.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл metaflac.exe&quot;, 0, sAppName, 48
    WScript.Quit
End If


Set objArgs = WScript.Arguments
if (objArgs.Count = 0) then
    WshShell.Popup &quot;В командной строке должен быть путь к исходным файлам. Need source path in arguments.&quot;, 0, sAppName, 48
    WScript.Quit
End If

&#039;-- Работа
Call startScanning()
Call endPopup()

&#039;-- Очистка
Set fso = nothing
Set WshShell = nothing                    
Set dicPath = nothing
&#039;***********************************
&#039;Конец основной программы
&#039;***********************************


&#039;***********************************
&#039;Функции
&#039;***********************************

Sub startScanning()

    Dim arg, fold, sSourceFoldName

    &#039; перебирает пути из командой строки
    For each arg in objArgs
        If fso.FolderExists(arg) Then
            
            Set sSourceFolder = fso.Getfolder(arg)

            &#039; Определимся с папкой для сохранения
            sSourceFoldName = sSourceFolder.Path
            sSavePath = sSourceFoldName &amp; sPostfixFolder
            dicPath.add sSavePath, sSavePath

            &#039; Создание папки для сохранения
            If Not fso.FolderExists(sSavePath) Then
                &#039;WshShell.Popup &quot;Создание папки &quot; &amp; sSavePath, PauseSize, sAppName, 64
                fso.CreateFolder(sSavePath)
            End If

            &#039;Обойдем папки, конвертируя
            Call DoIt(sSourceFolder)        
        End If
    Next
End Sub 
&#039;*********************************************************************************

Sub DoIt(fold)
&#039; Рекурсия
    Dim sfold, sfoo
    Call ProceedFiles(fold)        &#039; обработывает все файлы в текущей папке
    Set sfold = fold.subfolders 
    for each sfoo in sfold        &#039; работа с подпапками
        Call DoIt(sfoo)
    Next
End Sub  

&#039;*********************************************************************************
&#039; Основная процедура обработки

Sub ProceedFiles(fold)

    Dim RetCode, strExt, mpFiles, objFile, strName, strNameNew, foldPath, cpt, f, mp3filename, mp3filepath, tempfilename, flacfilename, RunFlacCommand, RunLameCommand
    Dim temptagfile, temptagfilename, TagsText, TextLine

    tempfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    temptagfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    If fso.FileExists(tempfilename) Then
                  fso.DeleteFile tempfilename, 1
    End If
    If fso.FileExists(temptagfilename) Then
                  fso.DeleteFile temptagfilename, 1
    End If

    cpt = 0
    foldPath = fold.Path
    mp3filepath = Replace(foldPath, sSourceFolder.Path, &quot;&quot;)
    If RecodeRus = 1 Then
        mp3filepath=translit(mp3filepath)
    End If
    mp3filepath=sSavePath &amp; mp3filepath

    &#039; ***** Создание конечной папки 
    If Not fso.FolderExists(mp3filepath) Then
        fso.CreateFolder(mp3filepath)
    End If

    &#039; ***** обработаем все файлы в папке
    Set mpfiles = fold.Files
    
    For each f in mpfiles

        strName = f.Name
        strExt = LCase(fso.GetExtensionName(strName)) &#039; Получим расширение

        If strExt = sExtToGet Then

            &#039; ***** Подготовка имен файлов
            flacfilename = foldPath &amp;&quot;\&quot;&amp; strName
            strNameNew = Replace(strName, sExtToGet, sExtToSet)
            If RecodeRus = 1 Then
                strNameNew=translit(strNameNew)
            End If
                   mp3filename = mp3filepath &amp; &quot;\&quot; &amp; strNameNew

            &#039; ***** Проверка нужности конвертации
            If Not fso.FileExists(mp3filename) Then

            &#039; ***** Раскодирование во временный файл
            RunFlacCommand = &quot;flac -d -F -f &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; -o &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If RetCode = 1 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunFlacCommand, PauseSize, sAppName, 48
            End If
            &#039; если у файла назначения есть атрибут ReadOnly, снимаем его
            If fso.FileExists(tempfilename) Then
                    Set objFile = FSO.GetFile(tempfilename)
                If objFile.Attributes And 1 Then
                    objFile.Attributes = objFile.Attributes - 1
                End If
                set objFile = nothing
            End If

            &#039; ***** теги
            TagKeys=&quot;&quot; &#039; главная переменная куда будут сохраняться ключи командной строки
            RunFlacCommand = &quot;metaflac.exe --export-tags-to=&quot;&amp; temptagfilename &amp;&quot; &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If fso.FileExists(temptagfilename) Then
                Set temptagfile = FSO.GetFile(temptagfilename)
                Set TagsText = temptagfile.OpenAsTextStream(1,0)
                Do While Not TagsText.AtEndOfStream
                    ParseTagToKeys(TagsText.ReadLine)
                Loop
                TagsText.Close
                set temptagfile = nothing
                fso.DeleteFile temptagfilename, 1
                TagKeys = TagKeys &amp;&quot; --tv &quot;&quot;TENC=FLAC-&gt;LAME&quot;&quot;&quot;
            End If

            &#039; ***** Кодирование в mp3
            RunLameCommand = &quot;lame &quot;&amp; LameKeys &amp;&quot; &quot;&amp; TagKeys &amp;&quot; &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot;  &quot;&quot;&quot;&amp; mp3filename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunLameCommand, WindowState , true)
            If not RetCode = 0 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunLameCommand, PauseSize, sAppName, 48
            End If


            &#039; ***** Удаление временного файла
            If fso.FileExists(tempfilename) Then
                            fso.DeleteFile tempfilename, 1
            End If

            cpt = cpt + 1
                          
            End If
        End If
    Next

    cptTot = cptTot + cpt    &#039; общий счетчик файлов
End Sub
&#039;*********************************************************************************

Sub ParseTagToKeys(textline)

    ParseTag textline,&quot;TITLE&quot;, &quot;--tt&quot;
    ParseTag textline,&quot;YEAR&quot;,&quot;--ty&quot;
    ParseTag textline,&quot;ARTIST&quot;,&quot;--ta&quot;
    ParseTag textline,&quot;ALBUM&quot;,&quot;--tl&quot;
    ParseTag textline,&quot;TRACKNUMBER&quot;,&quot;--tn&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TCOM=&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TPE2=&quot;
    ParseTag textline,&quot;COMMENT&quot;,&quot;--tc&quot;

    &#039;ParseTag textline,&quot;GENRE&quot;,&quot;--tg&quot;     &#039;&quot;genre&quot; нужно включать таблицу, но нет желания с ней возиться
    &#039;ParseTag textline,&quot;ENCODER&quot;,&quot;&quot;     &#039; FLAC-&gt;LAME

End Sub
&#039;*********************************************************************************

Sub ParseTag(textline,tag,cmdkey)
        Dim TagText, Pos, TagKey
    TagKey=&quot;&quot;
    tag=tag&amp;&quot;=&quot;
    Pos=InStr(textline, tag)
        If Not Pos=0 Then
        TagText=Mid(textline, len(tag)+1)
        TagText=StrConvert(TagText, &quot;windows-1251&quot;, &quot;cp866&quot;)
        TagText = Replace(TagText, &quot;&quot;&quot;&quot;, &quot;&#039;&quot;) 
        TagText = Replace(TagText, &quot;:&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;&lt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;&gt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;|&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;?&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;*&quot;, &quot;+&quot;)
        TagText = Replace(TagText, &quot;/&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;\&quot;, &quot; &quot;)
        If RecodeRus = 1 Then
            TagText=translit(TagText)
        End If
        If InStr(cmdkey, &quot;&quot;&quot;&quot;)=0 Then &#039; часть cmdkey идёт с открытыми кавычками
            TagKey=cmdkey &amp; &quot; &quot;&quot;&quot; &amp; TagText &amp; &quot;&quot;&quot;&quot;
        Else
            TagKey=cmdkey &amp; TagText &amp; &quot;&quot;&quot;&quot;
        End If
        TagKeys = TagKeys &amp;&quot; &quot;&amp; TagKey
    End If
End Sub
&#039;*********************************************************************************

&#039;=============================================================================
&#039; HKEY_CLASSES_ROOT\MIME\Database\Charset
&#039; cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
&#039;=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    
    
    With WScript.CreateObject(&quot;ADODB.Stream&quot;)
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = strSourceCharset
        .WriteText strText
        
        .Position  = 0
        .Charset   = strDestCharset
        StrConvert = .ReadText
        
        .Close
    End With
End Function

Function showTime(nTime)
    showTime = &quot;Затрачено времени : &quot; &amp; Round((Timer - nTime),2) &amp;&quot; секунд&quot;
End Function
&#039;*********************************************************************************

&#039; функция транслитерации строки по ГОСТ 7.79 2000
Function translit(ByVal sIncoming)
    Dim pos, findpos, sSymbol
    
    translit=&quot;&quot;

    For pos = 1 To len(sIncoming) Step 1

        sSymbol=mid(sIncoming,pos,1)
        findpos=InStr(1, tr, sSymbol)
        If findpos=0 or sSymbol=&quot; &quot; Then
            &#039; ***** В транслитерации не нуждается
            translit=translit+sSymbol
        Else
            &#039; ***** Первый символ
            translit=translit+mid(tl,findpos+1,1)
            &#039; ***** Второй символ
            If mid(tr,findpos+2,1)=&quot; &quot; Then
                translit=translit+mid(tl,findpos+2,1)
                &#039; ***** Третий символ
                If mid(tr,findpos+3,1)=&quot; &quot; Then
                    translit=translit+mid(tl,findpos+3,1)
                End If
            End If
        End If
    Next
End Function

Sub endPopup()
    WshShell.Popup &quot;Завершено. &quot;  &amp; chr(13) &amp; chr(13) &amp; cptTot &amp; _
                    &quot; файлов обработано в &quot; &amp; chr(13) &amp; _
                    Join(dicPath.items, vbCrLf) &amp; Chr(13) &amp; Chr(13) &amp; _
                    showTime(nTime), 0, sAppName, 64    
End Sub
&#039;*********************************************************************************</code></pre></div><p>Если качество устраивает, то можете добавить в коллекцию.</p>]]></description>
			<author><![CDATA[null@example.com (Высокий)]]></author>
			<pubDate>Sun, 03 Oct 2010 20:51:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=39855#p39855</guid>
		</item>
	</channel>
</rss>
