Project, Convert-FlacToMp3
------------------------------------------------------------------------
D:\Projects\VS02\2606\FlacToMp3\Giga\FlacToMp3
D:\Projects\VS02\2606\FlacToMp3\Giga\FlacToMp3\Pws
-----------------------------------------------------------------------
https://gsffmpeg.blogspot.com/
https://gsmainprojects.blogspot.com/2026/07/install-winget-giga-ffmpeg-flac-mp3.html
https://gsffmpeg.blogspot.com/2026/07/install-winget-giga-ffmpeg-flac-mp3.html
https://gsffmpeg.blogspot.com/2026/07/ffmpeg-install-download.html
https://gsffmpeg.blogspot.com/2026/07/ffmpeg.html
-----------------------------------------------------------------------------------
https://giga.chat/link/gcsQTYxzeF
https://giga.chat/link/gcsKiQAIiI
-----------------------------------------------------------------------------------
Чтобы запустить скрипт в PowerShell, когда он и файлы находятся в одной папке, используй одну из этих команд:
.\Convert-FlacToMp3_v2.ps1
или (если хочешь явно указать путь):
.\Convert-FlacToMp3_v2.ps1 -Path .
Важные нюансы
- Точка и слэш (
.\) — обязательны. PowerShell не запускает скрипты из текущей директории без указания пути, даже если они там лежат. Без.\будет ошибка вроде «не является внутренней или внешней командой». - Политика выполнения у тебя уже настроена для текущего процесса (
Bypass), так что скрипт должен запуститься без дополнительных вопросов. - Если скрипт ожидает параметры (например, путь к файлам), проверь его заголовок или комментарии — возможно, он сам берёт файлы из текущей папки, если параметр не передан.
Если скажешь, какие параметры принимает твой скрипт (можно глянуть через Get-Help .\Convert-FlacToMp3_v2.ps1 или показать фрагмент кода), подскажу точную строку вызова.
Я
Алиса
Проблема в том, что ключевое слово using (в стиле C#) не работает в PowerShell — оно появилось в C# для гарантированного вызова Dispose(), а в PowerShell его нет.
У тебя в коде (в версии v2) как раз и стоит эта строчка:
using ($stream = [System.IO.File]::Open(...))
Отсюда и ошибка Missing using directive.
Что нового в твоих версиях
В первой (полной) версии (Convert-FlacToMp3.ps1)
- Логирование в КБ (а не в байтах).
- Защита от повторного запуска: если
.mp3уже есть и не пустой — пропускает. - Проверка битрейта через
ffprobe, а если он не сработал — резервный расчёт по размеру и длительности. - Обработка того, что файл может быть ещё заблокирован (цикл с
Open+Sleep). - Красивая статистика в конце.
Во второй (v2_compat.ps1)
- Добавлены параметры: можно явно указать пути к
ffmpegиffprobe. - Рекурсивный поиск FLAC-файлов (включая подпапки):
-Recurse. - Вынесена логика ожидания освобождения файла в отдельную функцию
Wait-FileReady. - Вместо
usingиспользуетсяtry/finallyс ручным.Dispose().
Именно эта вторая версия и должна работать на Windows PowerShell 5.1, но из‑за using она ломается.
Как исправить ошибку в v2
Тебе нужно заменить блок с using на try/finally. В твоём файле найди функцию, где есть using ($stream = ...) (примерно строка 52), и замени её на такой шаблон:
$stream = $null
try {
$stream = [System.IO.File]::Open($Path, 'Open', 'Read', 'None')
$length = $stream.Length
return $length
}
catch {
throw $_
}
finally {
if ($stream) {
$stream.Dispose()
}
}
Это как раз то, что делает твой v2_compat — он уже написан правильно.
Какой скрипт запускать прямо сейчас
Учитывая, что у тебя:
- файлы в одной папке (без подпапок),
ffmpegиffprobeуже в PATH,- нужна простая конвертация с логом и проверкой битрейта,
лучше всего запустить первую версию (Convert-FlacToMp3.ps1). Она не содержит using, работает на PowerShell 5.1 и делает всё, что тебе нужно.
Команда:
.\Convert-FlacToMp3.ps1
А v2_compat оставь как «универсальную» версию для случаев, когда:
- нужно искать FLAC-файлы рекурсивно,
ffmpegлежит не в PATH, а в конкретной папке.
Важные проверки перед запуском
FFmpeg и FFprobe должны быть установлены и доступны в PATH. Проверь:
powershellffmpeg -version ffprobe -versionЕсли выдаст версию — всё ок. Если «не является внутренней командой» — нужно добавить путь к ним в переменную среды
PATHили указать в скрипте явно (тогда лучшеv2_compatс параметром-ffmpegPath).Политика выполнения. У тебя уже стоит
Bypassдля текущего процесса — этого достаточно.Права на запись. Скрипт будет создавать
.mp3и дописыватьConversionLog.txtв текущей папке — убедись, что папка не только для чтения.
Если хочешь, могу взять твой код v2 и полностью переписать его без using, чтобы он был максимально совместим и чист. Что выбираешь? 😊
Я
Алиса
Отлично, PowerShell 7.6.4 — это даже лучше: он стабильнее и быстрее, чем 5.1. Но ключевое тут не версия, а то, что using (в стиле C#) в PowerShell всё равно не работает — ни в 5.1, ни в 7.x. Ошибка из-за него будет везде.
Что делать прямо сейчас
У тебя есть два рабочих варианта.
Вариант 1 (самый простой) — запусти первую версию
Твой скрипт Convert-FlacToMp3.ps1 (тот, что без using, с ручным циклом и Dispose() через finally) уже полностью совместим с PowerShell 7 и делает всё нужное: ищет FLAC в текущей папке, пропускает готовые MP3, проверяет битрейт, пишет лог.
Просто выполни:
.\Convert-FlacToMp3.ps1
Никаких параметров не нужно, если ffmpeg и ffprobe уже в PATH.
Вариант 2 — если хочешь именно «v2» (с рекурсией и параметрами)
Тогда бери Convert-FlacToMp3_v2_compat.ps1, потому что в нём нет using: там уже правильно сделано через try/finally и .Dispose().
Запуск:
.\Convert-FlacToMp3_v2_compat.ps1
Если ffmpeg не в PATH, укажи путь явно:
.\Convert-FlacToMp3_v2_compat.ps1 -ffmpegPath "C:\Путь\К\ffmpeg.exe" -ffprobePath "C:\Путь\К\ffprobe.exe"
Как быстро проверить, что всё готово
Выполни эти две команды в той же папке:
ffmpeg -version
ffprobe -version
- Если видишь версию — можно сразу запускать скрипт.
- Если пишет «не является внутренней командой» — значит,
ffmpegне добавлен в PATH. Тогда используй Вариант 2 с явным указанием путей.
Важное про твои предпочтения (в духе «не люблю кашу из компонентов»)
Твой текущий подход здесь идеален:
- Отдельный скрипт вместо «всё в одном монстре».
- Чёткое разделение ответственности: скрипт только конвертирует и логирует,
ffmpeg/ffprobeделают саму кодировку. - Минимум зависимостей: никаких лишних библиотек.
Это как раз тот случай, когда «три малых компонента» (скрипт + ffmpeg + ffprobe) работают лучше, чем одна огромная штука.
Если хочешь, могу взять твой «сломанный» v2 с using и выдать тебе сразу исправленную версию (полностью готовую к запуску в PS 7), где всё переписано на try/finally. Или, если первая версия устраивает — можно вообще ничего не править и просто запустить. Что ближе? 😊
Комментариев нет:
Отправить комментарий