Трикове в Командния ред на Windows (cmd)


32 мнения в тази тема

Отговорено

А за uefi?
Ето пример:
 

select disk 0
clean
convert gpt
rem == 1. Windows RE tools partition ===============
create partition primary size=300
format quick fs=ntfs label="Windows RE tools"
assign letter="T"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
rem == 2. System partition =========================
create partition efi size=100
rem    ** NOTE: For Advanced Format 4Kn drives,
rem               change this value to size = 260 ** 
format quick fs=fat32 label="System"
assign letter="S"
rem == 3. Microsoft Reserved (MSR) partition =======
create partition msr size=128
rem == 4. Windows partition ========================
rem ==    a. Create the Windows partition ==========
create partition primary 
rem ==    b. Create space for the recovery image ===
shrink minimum=15000
rem       ** NOTE: Update this size to match the size
rem                of the recovery image           **
rem ==    c. Prepare the Windows partition ========= 
format quick fs=ntfs label="Windows"
assign letter="W"
rem === 5. Recovery image partition ================
create partition primary
format quick fs=ntfs label="Recovery image"
assign letter="R"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
list volume
exit

Изтрива диск 0 и създава 5 дяла (в това число и дял за възстановяване)

Ето и вариант с 2 дяла
 

select disk 0
clean
convert gpt
create partition primary size=300
format quick fs=ntfs label="Windows RE tools"
assign letter="T"
create partition efi size=100
rem == Note: for Advanced Format Generation One drives, change to size=260.

format quick fs=fat32 label="System"
assign letter="S"
create partition msr size=128
create partition primary
format quick fs=ntfs label="Windows"
assign letter="W"
list volume
exit

 

4

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Отговорено (Редактирано)

Как да създадем ISO файл чрез команден ред - CMD


Ето една команда чрез, която може да се създаде ISO файл.

OSCDIMG -n -d -m E:\00_iso_folder E:\GeneratedISO.iso

E:\00_iso_folder  - Е името на папката и къде се намира. В случая в E:

GeneratedISO - GeneratedISO е името на новосъздаденото ISO


Ако в папката има файлове несъвместими с Windows NT 3.51 ще се появи съобщението:

ПРЕДУПРЕЖДЕНИЕ: Това изображение съдържа имена на файлове и/или директории, които НЕ СА СЪВМЕСТИМИ с Windows NT 3.51. Ако се изисква съвместимост с Windows NT 3.51, използвайте превключвателя -nt, а не -n.

В този случай използвайте -nt  а не  -n

OSCDIMG -nt -m E:\00_iso_folder E:\GeneratedISO.iso

В този случай -d  не се използва, защото ще ви излезе ГРЕШКА и предупреждение, че -nt  не може да се използва заедно с  -d

Ако добавите  -a към реда...

OSCDIMG -nt -m -a E:\00_iso_folder E:\GeneratedISO.iso

 ...ще ви излезе следната информация.

hcaz6ZX.jpeg

 

ISO 9660 Primary Volume Descriptor
The ISO 9660 data structure follows the skipped block with a series of volume descriptors, detailing the contents and types of information contained on the disk.

The ISO 9660 primary volume descriptor describes the characteristics of the ISO standard file system information present on a given CD-ROM.

The ISO 9660 primary volume descriptor acts much like the superblock of the the Unix File System, providing details on the ISO 9660 compliant portion of the disk. Contained within the primary volume descriptor is the root directory record describing the location of the contiguous root directory.

Directory entries are successively stored within this region. Evaluation of the ISO 9660 filenames is begun at this location. The root directory is stored as an extent, or sequential series of sectors, that contains each of the directory entries appearing in the root.

Since ISO 9660 works by segmenting the CD-ROM into logical blocks, the size of these blocks is found in the primary volume descriptor as well.

A CD-ROM is only compliant to the ISO 9660 file system standard if there is a primary descriptor, and when there is an ending descriptor available (the volume descriptor constitute a variable length table which contains information on how many other descriptors are present).

It is possible to have many kind of file systems and information arrangements on a single CD-ROM. However, while many other kinds of descriptors can be used to optionally record non-ISO defined information contents, the primary volume descriptor is always present.

It is even possible to have a Mixed Mode disc, containing audio tracks and data tracks on the same disc. The most common type of Mixed Mode discs is one where the first track on the disc is Mode 1 data (ISO 9660 or non-ISO 9660), and the remaining tracks on the disc are audio tracks.

Another possibility is the so called Hybrid disc, which contains an ISO 9660 part and a non-ISO 9660 part.

Referring back to this picture, the first entry is the Volume Descriptor Type (type), where it can have the following values:

Number 0: the Volume Descriptor is a Boot Record

Number 1: the Volume Descriptor is a Primary Volume Descriptor

Number 2: the Volume Descriptor is a Supplementary Volume Descriptor

Number 3: the Volume Descriptor is a Volume Partition Descriptor

Number 4-254: are reserved

Number 255: the Volume Descriptor is a Volume Descriptor Set Terminator.

The second entry is called the Standard Identifier ( id) and is set to CD001 for a CD-ROM compliant to the ISO 9660 standard.

Another interesting field is the Volume Space Size ( volume_space_size) which contains the amount of data available on the CD-ROM.

Може да си направите BAT файл за стартиране с администраторски права по следния начин:

@echo off

:: Get ADMIN Privs
:-------------------------------------
mkdir "%windir%\BatchGotAdmin"
if '%errorlevel%' == '0' (
  rmdir "%windir%\BatchGotAdmin" & goto gotAdmin 
) else ( goto UACPrompt )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute %0, "", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"      
    CD /D "%~dp0"
:-------------------------------------
:: End Get ADMIN Privs

OSCDIMG -nt -m -a E:\00_iso_folder E:\GeneratedISO.iso

pause

 

Записвате горния текст с текстов редактор с разширение .bat  или  .cmd

 

Редактирано от Неделев
6

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Отговорено (Редактирано)

Рязане - Разделяне на MP3 дълги аудио файлове на равни части.

Два скрипта, които изрязват дълги MP3 аудио файлове на равни части (Предимно се ползват за много дълги аудио книги — 1 - 2  - 15, 20… часа). Работят в папката, където се намира аудио файла. За целта в същата папка трябва да имате и ffmpeg.exe, аз ползвам EXE-то от тази версия. Не съм пробвал с други.

https://www.mediafire.com/file/dhx46n8m14hst23/ffmpeg-7.x-essentials_build.rar/file

Скрипта се записва с разширение .bat — НЕ .cmd. Стартирате в папката с файла и в отворилия се прозорец избирате време — 5, 10, 12, 15… минути. Това е.
Единият скрипт изрязва файловете със прекодиране (Има леко прекодиране за по-голяма точност във времето при рязане). Другият реже без прекодиране. Новите файлове се създават в папка Output в същата папка където е изходния файл.
И при двата разликата може да е съвсем минимална ± секунда-две и не е от кой знае какво значение. най-накрая се създава лог файл в папката източник.

 

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

set "FFMPEG=%~dp0ffmpeg.exe"
set "INPUT=%~dp0"
set "OUTPUT=%~dp0Output"
set "FAILED=%~dp0Failed"
set "LOG=%~dp0log.txt"

if not exist "%OUTPUT%" mkdir "%OUTPUT%"
if not exist "%FAILED%" mkdir "%FAILED%"

echo ==============================>> "%LOG%"
echo Date: %date% %time%>> "%LOG%"
echo Script: %~nx0>> "%LOG%"
echo ==============================>> "%LOG%"

if not exist "%FFMPEG%" (
    echo ERROR: ffmpeg.exe not found!>> "%LOG%"
    echo ERROR: ffmpeg.exe not found!
    pause
    exit /b 1
)

:: =========================
:: CHECK INPUT FILES
:: =========================
dir /b "%INPUT%*.mp3" >nul 2>&1
if errorlevel 1 (
    echo ERROR: No MP3 files found>> "%LOG%"
    echo ERROR: No MP3 files found
    pause
    exit /b 1
)

set /p MINUTES=Minutes per part (5,10,15...):
set /a DUR=MINUTES*60

echo START>> "%LOG%"
echo Segment: !DUR! seconds>> "%LOG%"

echo.
echo START
echo.

for %%F in ("%INPUT%*.mp3") do (

    if not exist "%%F" (
        echo SKIP missing file %%F>> "%LOG%"
        echo SKIP %%F
        goto :next_file
    )

    echo -------------------------------->> "%LOG%"
    echo Processing: %%~nxF>> "%LOG%"
    echo Processing: %%~nxF

    set "BASENAME=%%~nF"

    :: =========================
    :: TRY 1
    :: =========================
    call :RUN_FFMPEG "%%F" "!BASENAME!" "!DUR!"
    if errorlevel 1 (
        echo RETRY: %%~nxF>> "%LOG%"
        call :RUN_FFMPEG "%%F" "!BASENAME!" "!DUR!"
    )

    :: =========================
    :: VALIDATION
    :: =========================
    dir "%OUTPUT%\!BASENAME!_*.mp3" >nul 2>&1
    if errorlevel 1 (
        echo FAILED: no output %%~nxF>> "%LOG%"
        echo FAILED %%~nxF
        move "%%F" "%FAILED%\" >nul 2>&1
    ) else (

        for %%A in ("%OUTPUT%\!BASENAME!_*.mp3") do (
            if %%~zA LSS 100 (
                echo CORRUPT FILE: %%A>> "%LOG%"
                del "%%A" >nul 2>&1
                move "%%F" "%FAILED%\" >nul 2>&1
            )
        )

        echo DONE: %%~nxF>> "%LOG%"
        echo DONE %%~nxF
    )

    :next_file
    echo.>> "%LOG%"
)

echo FINISHED>> "%LOG%"
echo ==============================>> "%LOG%"

pause
exit /b

:: =========================
:: FFMPEG FUNCTION
:: =========================
:RUN_FFMPEG
set "IN=%~1"
set "BASE=%~2"
set "DUR=%~3"

"%FFMPEG%" -y -i "%IN%" ^
-vn ^
-acodec libmp3lame ^
-b:a 48k ^
-f segment ^
-segment_time %DUR% ^
-reset_timestamps 1 ^
"%OUTPUT%\%BASE%_%%03d.mp3"

exit /b %errorlevel%

 

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

set "FFMPEG=%~dp0ffmpeg.exe"
set "INPUT=%~dp0"
set "OUTPUT=%~dp0Output"
set "LOG=%~dp0log.txt"

if not exist "%OUTPUT%" mkdir "%OUTPUT%"

echo ==============================>> "%LOG%"
echo Date: %date% %time%>> "%LOG%"
echo Script: %~nx0>> "%LOG%"
echo ==============================>> "%LOG%"

echo START>> "%LOG%"

:: =========================
:: CHECK FFMPEG
:: =========================
if not exist "%FFMPEG%" (
    echo ERROR: ffmpeg.exe not found>> "%LOG%"
    echo ERROR: ffmpeg.exe not found
    pause
    exit /b
)

:: =========================
:: CHECK FILES
:: =========================
dir /b "%INPUT%*.mp3" >nul 2>&1
if errorlevel 1 (
    echo ERROR: No MP3 files found>> "%LOG%"
    echo ERROR: No MP3 files found
    pause
    exit /b
)

set /p MINUTES=Minutes per part (5,10,15...):
set /a DUR=MINUTES*60

echo Segment: !DUR! seconds>> "%LOG%"

echo.
echo START
echo.

:: =========================
:: MAIN LOOP (SAFE)
:: =========================
for %%F in ("%INPUT%*.mp3") do (

    if not exist "%%F" (
        echo SKIP missing file: %%F>> "%LOG%"
        echo SKIP %%F
    ) else (

        echo -------------------------------->> "%LOG%"
        echo Processing: %%~nxF>> "%LOG%"
        echo Processing: %%~nxF

        "%FFMPEG%" -y -i "%%F" ^
        -vn ^
        -acodec libmp3lame ^
        -b:a 48k ^
        -f segment ^
        -segment_time !DUR! ^
        -reset_timestamps 1 ^
        "%OUTPUT%\%%~nF_%%03d.mp3"

        set "ERR=!errorlevel!"

        if !ERR! NEQ 0 (
            echo ERROR CODE !ERR! >> "%LOG%"
            echo FAIL %%~nxF
        ) else (
            echo DONE: %%~nxF >> "%LOG%"
            echo DONE %%~nxF
        )

        echo.>> "%LOG%"
    )
)

echo FINISHED>> "%LOG%"
echo ==============================>> "%LOG%"

pause

split_reencode_CBR

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

set "FFMPEG=%~dp0ffmpeg.exe"
set "INPUT=%~dp0"
set "OUTPUT=%~dp0Output"
set "LOG=%~dp0log.txt"

if not exist "%OUTPUT%" mkdir "%OUTPUT%"

:: лог начало
echo ============================== >> "%LOG%"
echo Date: %date% %time% >> "%LOG%"
echo Script: %~nx0 >> "%LOG%"
echo ============================== >> "%LOG%"

if not exist "%FFMPEG%" (
    echo ERROR: ffmpeg.exe not found! >> "%LOG%"
    echo Expected location: %FFMPEG% >> "%LOG%"
    echo ERROR: ffmpeg.exe not found!
    echo Expected location:
    echo %FFMPEG%
    pause
    exit /b
)

set /p MINUTES=Minutes per part (5,10,15...):
set /a DUR=MINUTES*60

echo START >> "%LOG%"
echo Segment: !DUR! seconds >> "%LOG%"

echo.
echo START
echo.

for %%F in ("%INPUT%*.mp3") do (

    echo -------------------------------- >> "%LOG%"
    echo Processing: %%~nxF >> "%LOG%"

    echo Processing: %%~nxF

    "%FFMPEG%" -y -i "%%F" ^
    -vn ^
    -acodec libmp3lame ^
    -b:a 48k ^
    -f segment ^
    -segment_time !DUR! ^
    -reset_timestamps 1 ^
    "%OUTPUT%\%%~nF_%%03d.mp3"

    if errorlevel 1 (
        echo ERROR: %%~nxF >> "%LOG%"
        echo ERROR processing %%~nxF
    ) else (
        echo DONE: %%~nxF >> "%LOG%"
        echo DONE: %%~nxF
    )

    echo. >> "%LOG%"
)

echo FINISHED >> "%LOG%"
echo ============================== >> "%LOG%"

pause

Ако искате да промените битрейта променете следния ред

-b:a 48k ^

където 48 е битрейта

 

split_reencode_VBR

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

set "FFMPEG=%~dp0ffmpeg.exe"
set "INPUT=%~dp0"
set "OUTPUT=%~dp0Output"
set "LOG=%~dp0log.txt"

if not exist "%OUTPUT%" mkdir "%OUTPUT%"

:: лог начало
echo ============================== >> "%LOG%"
echo Date: %date% %time% >> "%LOG%"
echo Script: %~nx0 >> "%LOG%"
echo ============================== >> "%LOG%"

if not exist "%FFMPEG%" (
    echo ERROR: ffmpeg.exe not found! >> "%LOG%"
    echo Expected location: %FFMPEG% >> "%LOG%"
    echo ERROR: ffmpeg.exe not found!
    echo Expected location:
    echo %FFMPEG%
    pause
    exit /b
)

set /p MINUTES=Minutes per part (5,10,15...):
set /a DUR=MINUTES*60

echo START >> "%LOG%"
echo Segment: !DUR! seconds >> "%LOG%"

echo.
echo START
echo.

for %%F in ("%INPUT%*.mp3") do (

    echo -------------------------------- >> "%LOG%"
    echo Processing: %%~nxF >> "%LOG%"

    echo Processing: %%~nxF

    "%FFMPEG%" -y -i "%%F" ^
    -vn ^
    -acodec libmp3lame ^
    -q:a 2 ^
    -f segment ^
    -segment_time !DUR! ^
    -reset_timestamps 1 ^
    "%OUTPUT%\%%~nF_%%03d.mp3"

    if errorlevel 1 (
        echo ERROR: %%~nxF >> "%LOG%"
        echo ERROR processing %%~nxF
    ) else (
        echo DONE: %%~nxF >> "%LOG%"
        echo DONE: %%~nxF
    )

    echo. >> "%LOG%"
)

echo FINISHED >> "%LOG%"
echo ============================== >> "%LOG%"

pause

Ако искате да промените битрейта променете следния ред

 -q:a 2 ^

променяте 2 със съответната стойност

Най-високо                       -q:a 0
Много добро                     -q:a 2
Добро                                -q:a 4
За аудиокниги                   -q:a 7
Максимална компресия -q:a 9

 

И още един скрипт за проверка на файловете, той се поставя във папка Output и се записва с разширение .ps1

$folder = Split-Path -Parent $MyInvocation.MyCommand.Path
$log = Join-Path $folder "check_log.txt"

"==============================" | Out-File $log
"CHECK START $(Get-Date)" | Out-File $log -Append
"==============================" | Out-File $log -Append

Get-ChildItem $folder -Filter "*_000.mp3" | ForEach-Object {

    $base = $_.BaseName -replace "_000$",""

    # събира наличните номера
    $files = Get-ChildItem $folder -Filter "$base`_*.mp3" |
        ForEach-Object {
            if ($_.BaseName -match "_(\d+)$") {
                [int]$matches[1]
            }
        } | Sort-Object

    if ($files.Count -eq 0) {
        "$base -> ERROR (no files)" | Tee-Object -FilePath $log -Append
        return
    }

    $max = ($files | Measure-Object -Maximum).Maximum

    for ($i = 0; $i -le $max; $i++) {
        if ($files -notcontains $i) {
            "$base -> MISSING $i" | Tee-Object -FilePath $log -Append
        }
    }

    "$base -> CHECKED ($($files.Count) parts)" | Tee-Object -FilePath $log -Append
}

"==============================" | Out-File $log -Append
"FINISHED" | Out-File $log -Append

Стартира се по следния начин:
Отваряте текстовия редактор и поставяте следния ред вътре

powershell -ExecutionPolicy Bypass -File check.ps1

После записвате с разширение .bat
И двата скрипта трябва да са поставени в папка Output

 

 

 

 

Редактирано от Неделев
4

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Отговорено (Редактирано)

В последно време започнах да се заигравам със скриптове. Винаги има какво ново да научиш. Когато се регистрирах тук за първи път не знаех как безопасно да изключа компютъра. Хората в този сайт ми помогнаха много, като казвам много наистина имам предвид МНОГО. От тогава научих много неща, но не всичко и не ме е срам да попитам за нещо ако не го знам. Това не е точно по Windows-ки проблеми свързани със OS, но в много сайтове срещнах въпроси свързани  с такъв скрипт, а точни отговори няма. Надявам се по някакъв начин сайта да стане популярен. Винаги когато имам възможност давам връзка към сайта, не за моя облага, а за това този сайт да стане популярен. Надявам се това да стане.

Редактирано от Неделев
6

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Отговорено (Редактирано)

Това са два скрипта за промяна на скоростта на mp3 файлове, които работят независимо, където и да ги поставите.
В папката заедно с mp3 файловете трябва да се поставят и

ffmpeg.exe
ffprobe.exe
Те са взети от този пакет

ffmpeg-2026-05-28-git-7b46c6a2a3-essentials_build

Може и да работят с други такива, но не съм пробвал с други.

можете да запазите скрипта в текстов редактор с разширение .bat със ANSI кодиране.
При стартиране ще ви подкани да въведете стойност за скорост и след това за битрейт.
При VBR стойностите са от 0-9 като нула е най-високо качество.
Прави проверка за повредени файлове и ако има такива ги пропуска. Накрая ще ви запише лог с повредените файлове ако има такива.

MP3_Speed_CBR

@echo off
chcp 1251 >nul
setlocal EnableDelayedExpansion

REM ==========================================
REM MP3 Speed Changer - CBR
REM ==========================================

set "FFMPEG=%~dp0ffmpeg.exe"
set "baseDir=%~dp0"

REM ==========================================
REM Проверка за ffmpeg.exe
REM ==========================================

if not exist "%FFMPEG%" (
    echo.
    powershell -NoProfile -Command "Write-Host 'FFmpeg не е намерен.' -ForegroundColor Red"
    echo Поставете ffmpeg.exe в същата папка.
    echo.
    pause
    exit /b
)

REM ==========================================
REM Въвеждане на процент
REM ==========================================

echo.
set /p "percent=Въведете процент (1-100): "

if "%percent%"=="" goto invalidPercent

echo(%percent%| findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 goto invalidPercent

set /a percentNum=%percent% >nul 2>&1

if %percentNum% LSS 1 goto invalidPercent
if %percentNum% GTR 100 goto invalidPercent

REM ==========================================
REM Въвеждане на CBR битрейт
REM ==========================================

echo.
set /p "bitrate=Въведете CBR битрейт (например 128, 192, 256, 320): "

if "%bitrate%"=="" goto invalidBitrate

echo(%bitrate%| findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 goto invalidBitrate

set /a bitrateNum=%bitrate% >nul 2>&1

if %bitrateNum% LSS 8 goto invalidBitrate
if %bitrateNum% GTR 320 goto invalidBitrate

REM ==========================================
REM Изчисляване на скоростта
REM ==========================================

for /f %%A in ('powershell -NoProfile -Command "$tempo=1+(%percentNum%/100); ('{0:N2}' -f $tempo).Replace(',','.')"') do set "tempo=%%A"

set "tempoFilter=atempo=%tempo%"

REM ==========================================
REM Изходна папка
REM ==========================================

set "outDir=%baseDir%Speed %percentNum% CBR %bitrateNum%k"

if not exist "%outDir%" mkdir "%outDir%"

REM ==========================================
REM Проверка за MP3 файлове
REM ==========================================

set "found="

for %%F in ("%baseDir%*.mp3") do set "found=1"

if not defined found (
    echo.
    powershell -NoProfile -Command "Write-Host 'Няма MP3 файлове.' -ForegroundColor Yellow"
    echo.
    pause
    exit /b
)

REM ==========================================
REM Броячи
REM ==========================================

set /a ok=0
set /a skip=0
set /a err=0
set /a bad=0

REM ==========================================
REM Списък с повредените файлове
REM ==========================================

set "badList=%baseDir%Повредени файлове.txt"

if exist "%badList%" del /q "%badList%" >nul 2>&1

REM ==========================================
REM Начало
REM ==========================================

echo.
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'ОБРАБОТКАТА ЗАПОЧВА' -ForegroundColor Cyan"
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"

echo.
echo Увеличение : %percentNum%%%
powershell -NoProfile -Command "Write-Host 'Режим       : CBR' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'Битрейт     : %bitrateNum% kbps' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'Скорост     : %tempoFilter%' -ForegroundColor DarkGray"

REM ==========================================
REM Обработка
REM ==========================================

for %%F in ("%baseDir%*.mp3") do (

    echo.
    powershell -NoProfile -Command "Write-Host 'Проверка: %%~nxF' -ForegroundColor Cyan"

    set "checkError=%TEMP%\mp3_check_error_%%~nF.txt"

    if exist "!checkError!" del /q "!checkError!" >nul 2>&1

    REM ==========================================
    REM Проверка на MP3 файла
    REM ==========================================

    "%FFMPEG%" ^
        -hide_banner ^
        -v error ^
        -i "%%F" ^
        -f null NUL ^
        2>"!checkError!" >nul

    REM ==========================================
    REM Проверяваме текста за грешки
    REM ==========================================

    set "fileBad="

    if exist "!checkError!" (

        findstr /i /c:"Header missing" ^
                         /c:"Invalid data found" ^
                         /c:"Error decoding" ^
                         /c:"Error while decoding" ^
                         /c:"Invalid frame" ^
                         /c:"corrupt" ^
                         /c:"corrupted" ^
                         /c:"damaged" ^
                         /c:"error" ^
                         "!checkError!" >nul 2>&1

        if not errorlevel 1 set "fileBad=1"
    )

    REM ==========================================
    REM Резултат от проверката
    REM ==========================================

    if defined fileBad (

        powershell -NoProfile -Command "Write-Host 'ПОВРЕДЕН ФАЙЛ' -ForegroundColor Red"

        >>"%badList%" echo %%~nxF

        set /a bad+=1

        if exist "!checkError!" del /q "!checkError!" >nul 2>&1

    ) else (

        if exist "!checkError!" del /q "!checkError!" >nul 2>&1

        powershell -NoProfile -Command "Write-Host 'Проверка: OK' -ForegroundColor Green"

        powershell -NoProfile -Command "Write-Host 'Обработка: %%~nxF' -ForegroundColor Cyan"
        powershell -NoProfile -Command "Write-Host 'Скорост : !tempoFilter!' -ForegroundColor DarkGray"

        set "outFile=%outDir%\%%~nxF"
        set "errorFile=%TEMP%\ffmpeg_error_%%~nF.txt"

        if exist "!outFile!" (

            powershell -NoProfile -Command "Write-Host 'Вече съществува.' -ForegroundColor Yellow"
            set /a skip+=1

        ) else (

            REM ==========================================
            REM Обработка - CBR
            REM ==========================================

            "%FFMPEG%" ^
                -hide_banner ^
                -loglevel error ^
                -y ^
                -i "%%F" ^
                -map_metadata 0 ^
                -af "!tempoFilter!" ^
                -c:a libmp3lame ^
                -b:a %bitrateNum%k ^
                -minrate %bitrateNum%k ^
                -maxrate %bitrateNum%k ^
                -bufsize %bitrateNum%k ^
                "!outFile!" ^
                2>"!errorFile!" >nul

            if errorlevel 1 (

                if exist "!outFile!" del /q "!outFile!"

                powershell -NoProfile -Command "Write-Host 'ГРЕШКА ПРИ ОБРАБОТКАТА' -ForegroundColor Red"

                set /a err+=1

            ) else (

                powershell -NoProfile -Command "Write-Host 'OK' -ForegroundColor Green"
                set /a ok+=1

            )

            if exist "!errorFile!" del /q "!errorFile!" >nul 2>&1
        )
    )
)

REM ==========================================
REM КРАЙ
REM ==========================================

echo.
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'ОБРАБОТКАТА ПРИКЛЮЧИ' -ForegroundColor Cyan"
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"

echo.
powershell -NoProfile -Command "Write-Host 'Успешни          : %ok%' -ForegroundColor Green"
powershell -NoProfile -Command "Write-Host 'Пропуснати       : %skip%' -ForegroundColor Yellow"
powershell -NoProfile -Command "Write-Host 'Повредени файлове: %bad%' -ForegroundColor Red"
powershell -NoProfile -Command "Write-Host 'Грешки           : %err%' -ForegroundColor Red"

if %bad% GTR 0 (
    echo.
    powershell -NoProfile -Command "Write-Host 'Повредени файлове:' -ForegroundColor Red"
    type "%badList%"
    echo.
    powershell -NoProfile -Command "Write-Host 'Списъкът е записан в:' -ForegroundColor Yellow"
    echo %badList%
)

echo.
powershell -NoProfile -Command "Write-Host 'Готовите файлове са в:'"
powershell -NoProfile -Command "Write-Host '%outDir%' -ForegroundColor Cyan"

echo.
pause
exit /b

:invalidPercent
echo.
powershell -NoProfile -Command "Write-Host 'Невалиден процент. Допустими стойности: 1-100.' -ForegroundColor Red"
echo.
pause
exit /b

:invalidBitrate
echo.
powershell -NoProfile -Command "Write-Host 'Невалиден CBR битрейт. Използвайте стойност между 8 и 320 kbps.' -ForegroundColor Red"
echo.
pause
exit /b

 

MP3_Speed_VBR_v6

@echo off
chcp 1251 >nul
setlocal EnableDelayedExpansion

REM ==========================================
REM MP3 Speed Changer - VBR
REM ==========================================

set "FFMPEG=%~dp0ffmpeg.exe"
set "baseDir=%~dp0"

REM ==========================================
REM Проверка за ffmpeg.exe
REM ==========================================

if not exist "%FFMPEG%" (
    echo.
    powershell -NoProfile -Command "Write-Host 'FFmpeg не е намерен.' -ForegroundColor Red"
    echo Поставете ffmpeg.exe в същата папка.
    echo.
    pause
    exit /b
)

REM ==========================================
REM Въвеждане на процент
REM ==========================================

echo.
set /p "percent=Въведете процент (1-100): "

if "%percent%"=="" goto invalidPercent

echo(%percent%| findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 goto invalidPercent

set /a percentNum=%percent% >nul 2>&1

if %percentNum% LSS 1 goto invalidPercent
if %percentNum% GTR 100 goto invalidPercent

REM ==========================================
REM Въвеждане на VBR качество
REM ==========================================

echo.
set /p "quality=Въведете VBR качество (0-9): "

if "%quality%"=="" goto invalidQuality

echo(%quality%| findstr /r "^[0-9]$" >nul
if errorlevel 1 goto invalidQuality

set /a qualityNum=%quality%

REM ==========================================
REM Изчисляване на скоростта
REM ==========================================

for /f %%A in ('powershell -NoProfile -Command "$tempo=1+(%percentNum%/100); ('{0:N2}' -f $tempo).Replace(',','.')"') do set "tempo=%%A"

set "tempoFilter=atempo=%tempo%"

REM ==========================================
REM Изходна папка
REM ==========================================

set "outDir=%baseDir%Speed %percentNum% VBR q%qualityNum%"

if not exist "%outDir%" mkdir "%outDir%"

REM ==========================================
REM Проверка за MP3 файлове
REM ==========================================

set "found="

for %%F in ("%baseDir%*.mp3") do set "found=1"

if not defined found (
    echo.
    powershell -NoProfile -Command "Write-Host 'Няма MP3 файлове.' -ForegroundColor Yellow"
    echo.
    pause
    exit /b
)

REM ==========================================
REM Броячи
REM ==========================================

set /a ok=0
set /a skip=0
set /a err=0
set /a bad=0

REM ==========================================
REM Списък с повредените файлове
REM ==========================================

set "badList=%baseDir%Повредени файлове.txt"

if exist "%badList%" del /q "%badList%" >nul 2>&1

REM ==========================================
REM Начало
REM ==========================================

echo.
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'ОБРАБОТКАТА ЗАПОЧВА' -ForegroundColor Cyan"
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"

echo.
echo Увеличение : %percentNum%%%
powershell -NoProfile -Command "Write-Host 'Режим       : VBR' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'Качество    : q%qualityNum%' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'Скорост     : %tempoFilter%' -ForegroundColor DarkGray"

REM ==========================================
REM Обработка
REM ==========================================

for %%F in ("%baseDir%*.mp3") do (

    echo.
    powershell -NoProfile -Command "Write-Host 'Проверка: %%~nxF' -ForegroundColor Cyan"

    set "checkError=%TEMP%\mp3_check_error_%%~nF.txt"

    if exist "!checkError!" del /q "!checkError!" >nul 2>&1

    REM ==========================================
    REM Проверка на MP3 файла
    REM Записваме целия FFmpeg изход във файл
    REM ==========================================

    "%FFMPEG%" ^
        -hide_banner ^
        -v error ^
        -i "%%F" ^
        -f null NUL ^
        2>"!checkError!" >nul

    REM ==========================================
    REM Проверяваме текста за грешки
    REM ==========================================

    set "fileBad="

    if exist "!checkError!" (

        findstr /i /c:"Header missing" ^
                         /c:"Invalid data found" ^
                         /c:"Error decoding" ^
                         /c:"Error while decoding" ^
                         /c:"Invalid frame" ^
                         /c:"corrupt" ^
                         /c:"corrupted" ^
                         /c:"damaged" ^
                         /c:"error" ^
                         "!checkError!" >nul 2>&1

        if not errorlevel 1 set "fileBad=1"
    )

    REM ==========================================
    REM Резултат от проверката
    REM ==========================================

    if defined fileBad (

        powershell -NoProfile -Command "Write-Host 'ПОВРЕДЕН ФАЙЛ' -ForegroundColor Red"

        >>"%badList%" echo %%~nxF

        set /a bad+=1

        if exist "!checkError!" del /q "!checkError!" >nul 2>&1

    ) else (

        if exist "!checkError!" del /q "!checkError!" >nul 2>&1

        powershell -NoProfile -Command "Write-Host 'Проверка: OK' -ForegroundColor Green"

        powershell -NoProfile -Command "Write-Host 'Обработка: %%~nxF' -ForegroundColor Cyan"
        powershell -NoProfile -Command "Write-Host 'Скорост : !tempoFilter!' -ForegroundColor DarkGray"

        set "outFile=%outDir%\%%~nxF"
        set "errorFile=%TEMP%\ffmpeg_error_%%~nF.txt"

        if exist "!outFile!" (

            powershell -NoProfile -Command "Write-Host 'Вече съществува.' -ForegroundColor Yellow"
            set /a skip+=1

        ) else (

            REM ==========================================
            REM Обработка - VBR
            REM ==========================================

            "%FFMPEG%" ^
                -hide_banner ^
                -loglevel error ^
                -y ^
                -i "%%F" ^
                -map_metadata 0 ^
                -af "!tempoFilter!" ^
                -c:a libmp3lame ^
                -q:a !qualityNum! ^
                "!outFile!" ^
                2>"!errorFile!" >nul

            if errorlevel 1 (

                if exist "!outFile!" del /q "!outFile!"

                powershell -NoProfile -Command "Write-Host 'ГРЕШКА ПРИ ОБРАБОТКАТА' -ForegroundColor Red"

                set /a err+=1

            ) else (

                powershell -NoProfile -Command "Write-Host 'OK' -ForegroundColor Green"
                set /a ok+=1

            )

            if exist "!errorFile!" del /q "!errorFile!" >nul 2>&1
        )
    )
)

REM ==========================================
REM КРАЙ
REM ==========================================

echo.
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"
powershell -NoProfile -Command "Write-Host 'ОБРАБОТКАТА ПРИКЛЮЧИ' -ForegroundColor Cyan"
powershell -NoProfile -Command "Write-Host '==========================================' -ForegroundColor DarkGray"

echo.
powershell -NoProfile -Command "Write-Host 'Успешни          : %ok%' -ForegroundColor Green"
powershell -NoProfile -Command "Write-Host 'Пропуснати       : %skip%' -ForegroundColor Yellow"
powershell -NoProfile -Command "Write-Host 'Повредени файлове: %bad%' -ForegroundColor Red"
powershell -NoProfile -Command "Write-Host 'Грешки           : %err%' -ForegroundColor Red"

if %bad% GTR 0 (
    echo.
    powershell -NoProfile -Command "Write-Host 'Повредени файлове:' -ForegroundColor Red"
    type "%badList%"
    echo.
    powershell -NoProfile -Command "Write-Host 'Списъкът е записан в:' -ForegroundColor Yellow"
    echo %badList%
)

echo.
powershell -NoProfile -Command "Write-Host 'Готовите файлове са в:'"
powershell -NoProfile -Command "Write-Host '%outDir%' -ForegroundColor Cyan"

echo.
pause
exit /b

:invalidPercent
echo.
powershell -NoProfile -Command "Write-Host 'Невалиден процент. Допустими стойности: 1-100.' -ForegroundColor Red"
echo.
pause
exit /b

:invalidQuality
echo.
powershell -NoProfile -Command "Write-Host 'VBR качеството трябва да бъде число от 0 до 9.' -ForegroundColor Red"
echo.
pause
exit /b

Прозореца изглежда горе-долу така:

1F4drlW.jpeg

 

Редактирано от Неделев
1

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Отговорено (Редактирано)

MP3 Loudness Normalizator _2-PASS + ANTI-CLIPPING  v4

Скрипт за нормализиране силата на звука, за MP3 файлове.
Със двупроходна проверка и проверка за повредени файлове.
В папката трябва да присъства и ffmpeg.exe
Дава избор за loudness и формат VBR-CBR и въвеждане на битрейт (Нещо важно за битрейта. Ако битрейта на mp3 файла е 128, дори и да изберете 192, 256, 320 качеството на звука няма да се подобри):
Качеството си остава същото:
Когато един аудио файл веднъж е компресиран до примерно 80-90 kbps, голяма част от оригиналните звукови данни (особено високите честоти) се изтриват завинаги. Компютърът не може да "измисли" липсващата информация, затова звукът ще си остане лош, заглъхнал или изкривен дори да конвертирате до 320 kbps. Така файла става само по-голям а качеството си остава ниско.

  1 - -19 LUFS
  2 - -18 LUFS
  3 - -16 LUFS
  4 - Собствена стойност

I=-23 LUFS   телевизионен стандарт
I=-20 LUFS   аудиокнига
I=-16 LUFS   подкаст
I=-14 LUFS   YouTube / стрийминг

@echo off
chcp 1251 >nul
setlocal EnableDelayedExpansion
title MP3 Loudness Normalizer - 2 Pass + Anti-Clipping + Check

cd /d "%~dp0"

if not exist "%~dp0ffmpeg.exe" (
    echo.
    echo ==========================================
    echo   ffmpeg.exe НЕ Е НАМЕРЕН!
    echo ==========================================
    echo.
    echo Постави ffmpeg.exe в същата папка като този BAT.
    echo.
    pause
    exit /b
)

echo.
echo ==========================================
echo   MP3 LOUDNESS NORMALIZER
echo   2-PASS + ANTI-CLIPPING + ПРОВЕРКА
echo ==========================================
echo.

echo Избери целева loudness:
echo.
echo   1 - -19 LUFS
echo   2 - -18 LUFS
echo   3 - -16 LUFS
echo   4 - Собствена стойност
echo.

set "targetChoice="
set /p "targetChoice=Избор (1-4): "

if "%targetChoice%"=="1" goto TARGET19
if "%targetChoice%"=="2" goto TARGET18
if "%targetChoice%"=="3" goto TARGET16
if "%targetChoice%"=="4" goto TARGETCUSTOM

echo.
echo Невалиден избор.
pause
exit /b


:TARGET19
set "target=-19"
goto FORMAT


:TARGET18
set "target=-18"
goto FORMAT


:TARGET16
set "target=-16"
goto FORMAT


:TARGETCUSTOM
echo.
set "target="
set /p "target=Въведи целева стойност в LUFS (например -17.5): "

if not defined target (
    echo.
    echo Не е въведена стойност.
    pause
    exit /b
)

goto FORMAT


:FORMAT

echo.
echo Целева loudness: %target% LUFS
echo.

echo Избери формат:
echo.
echo   1 - CBR
echo   2 - VBR
echo.

set "formatChoice="
set /p "formatChoice=Избор (1-2): "

if "%formatChoice%"=="1" goto CBR
if "%formatChoice%"=="2" goto VBR

echo.
echo Невалиден избор.
pause
exit /b


:CBR

echo.
set "bitrateNum="
set /p "bitrateNum=Въведи CBR bitrate (например 128, 192, 256, 320): "

if not defined bitrateNum (
    echo.
    echo Няма въведен bitrate.
    pause
    exit /b
)

set "outdir=Normalized %target% LUFS CBR %bitrateNum%k"
goto START


:VBR

echo.
set "qualityNum="
set /p "qualityNum=Въведи VBR качество (0-9): "

if not defined qualityNum (
    echo.
    echo Няма въведено качество.
    pause
    exit /b
)

set "outdir=Normalized %target% LUFS VBR q%qualityNum%"
goto START


:START

if not exist "%outdir%" mkdir "%outdir%"

set /a success=0
set /a skipped=0
set /a corrupt=0
set /a errors=0
set /a checkOK=0
set /a checkProblems=0

if exist "Повредени файлове.txt" del /q "Повредени файлове.txt"
if exist "Проблеми след нормализация.txt" del /q "Проблеми след нормализация.txt"

if exist "_loudnorm_check.txt" del /q "_loudnorm_check.txt"
if exist "_loudnorm_measure.txt" del /q "_loudnorm_measure.txt"
if exist "_loudnorm_values.txt" del /q "_loudnorm_values.txt"
if exist "_final_check.txt" del /q "_final_check.txt"
if exist "_final_values.txt" del /q "_final_values.txt"

echo.
echo ==========================================
echo        НАЧАЛО НА ОБРАБОТКАТА
echo ==========================================
echo.
echo Цел: %target% LUFS
echo Изходна папка: %outdir%
echo.
echo Допълнителна защита от clipping: ON
echo True Peak лимит: -1.5 dBTP
echo Limiter: -1.5 dB
echo.
echo След всеки файл ще се прави проверка.
echo.

for %%F in (*.mp3) do (
    call :PROCESS_FILE "%%F"
)

if exist "_loudnorm_check.txt" del /q "_loudnorm_check.txt"
if exist "_loudnorm_measure.txt" del /q "_loudnorm_measure.txt"
if exist "_loudnorm_values.txt" del /q "_loudnorm_values.txt"
if exist "_final_check.txt" del /q "_final_check.txt"
if exist "_final_values.txt" del /q "_final_values.txt"

echo.
echo ==========================================
echo          ОБРАБОТКАТА ЗАВЪРШИ
echo ==========================================
echo.
echo Успешно обработени : %success%
echo Пропуснати         : %skipped%
echo Повредени файлове  : %corrupt%
echo Грешки             : %errors%
echo.
echo Проверка на готовите файлове:
echo   Без проблеми      : %checkOK%
echo   С установен проблем: %checkProblems%
echo.

if exist "Повредени файлове.txt" (
    echo Списъкът с повредените файлове е:
    echo Повредени файлове.txt
    echo.
)

if exist "Проблеми след нормализация.txt" (
    echo ВНИМАНИЕ: Има файлове с проблем при финалната проверка.
    echo Списъкът е:
    echo Проблеми след нормализация.txt
    echo.
)

echo Резултатите са в:
echo %outdir%
echo.
pause
exit /b


:PROCESS_FILE

set "currentFile=%~1"

echo.
echo ------------------------------------------
echo Проверка: %currentFile%
echo ------------------------------------------

if exist "%outdir%\%currentFile%" (
    echo Файлът вече съществува - пропуска се.
    set /a skipped+=1
    exit /b
)

rem ==================================================
rem ПРОВЕРКА ЗА ПОВРЕДЕН MP3
rem ==================================================

"%~dp0ffmpeg.exe" -hide_banner -v error -i "%currentFile%" -f null NUL 2>"_loudnorm_check.txt"

set "bad="

findstr /i /c:"Header missing" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"Invalid data found" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"Error decoding" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"Error while decoding" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"Invalid frame" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"corrupt" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"corrupted" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"damaged" "_loudnorm_check.txt" >nul && set "bad=1"
findstr /i /c:"Error" "_loudnorm_check.txt" >nul && set "bad=1"

if defined bad (
    echo ПОВРЕДЕН ФАЙЛ - пропуска се.
    echo %currentFile%>>"Повредени файлове.txt"
    set /a corrupt+=1
    exit /b
)

rem ==================================================
rem ПЪРВИ ПРОХОД - ИЗМЕРВАНЕ
rem ==================================================

echo Първи проход - измерване...

"%~dp0ffmpeg.exe" -hide_banner -i "%currentFile%" ^
    -af "loudnorm=I=%target%:TP=-1.5:LRA=11:print_format=json" ^
    -f null NUL 2>"_loudnorm_measure.txt"

if errorlevel 1 (
    echo Грешка при измерването - пропуска се.
    set /a errors+=1
    exit /b
)

rem ==================================================
rem ИЗВЛИЧАНЕ НА ИЗМЕРЕНИТЕ СТОЙНОСТИ
rem ==================================================

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$t=Get-Content -Raw '_loudnorm_measure.txt';" ^
    "$m=[regex]::Match($t,'(?s)\{.*\}');" ^
    "if(-not $m.Success){exit 1};" ^
    "$j=$m.Value | ConvertFrom-Json;" ^
    "$c=[Globalization.CultureInfo]::InvariantCulture;" ^
    "$a=@($j.input_i,$j.input_tp,$j.input_lra,$j.input_thresh,$j.target_offset);" ^
    "($a | ForEach-Object {([double]$_).ToString('0.############',$c)}) -join '|' | Set-Content '_loudnorm_values.txt'"

if errorlevel 1 (
    echo Неуспешно извличане на измерените стойности.
    set /a errors+=1
    exit /b
)

set "input_i="
set "input_tp="
set "input_lra="
set "input_thresh="
set "offset="

set "values="
set /p "values="<"_loudnorm_values.txt"

for /f "tokens=1-5 delims=|" %%A in ("!values!") do (
    set "input_i=%%A"
    set "input_tp=%%B"
    set "input_lra=%%C"
    set "input_thresh=%%D"
    set "offset=%%E"
)

if not defined input_i (
    echo Липсват измерени стойности.
    set /a errors+=1
    exit /b
)

echo.
echo Измерено:
echo   Input LUFS      = !input_i!
echo   True Peak       = !input_tp!
echo   LRA             = !input_lra!
echo   Threshold       = !input_thresh!
echo   Target Offset   = !offset!

rem ==================================================
rem ВТОРИ ПРОХОД
rem LOUDNORM + ANTI-CLIPPING LIMITER
rem ==================================================

echo.
echo Втори проход - нормализация + защита от clipping...

if "%formatChoice%"=="1" goto PROCESS_CBR
goto PROCESS_VBR


:PROCESS_CBR

"%~dp0ffmpeg.exe" -hide_banner -i "%currentFile%" ^
    -af "loudnorm=I=%target%:TP=-1.5:LRA=11:measured_I=!input_i!:measured_TP=!input_tp!:measured_LRA=!input_lra!:measured_thresh=!input_thresh!:offset=!offset!:linear=true,alimiter=limit=0.8414:level=0:latency=1" ^
    -map_metadata 0 ^
    -c:a libmp3lame ^
    -b:a %bitrateNum%k ^
    -minrate %bitrateNum%k ^
    -maxrate %bitrateNum%k ^
    -bufsize %bitrateNum%k ^
    "%outdir%\%currentFile%"

goto CHECK_RESULT


:PROCESS_VBR

"%~dp0ffmpeg.exe" -hide_banner -i "%currentFile%" ^
    -af "loudnorm=I=%target%:TP=-1.5:LRA=11:measured_I=!input_i!:measured_TP=!input_tp!:measured_LRA=!input_lra!:measured_thresh=!input_thresh!:offset=!offset!:linear=true,alimiter=limit=0.8414:level=0:latency=1" ^
    -map_metadata 0 ^
    -c:a libmp3lame ^
    -q:a %qualityNum% ^
    "%outdir%\%currentFile%"


:CHECK_RESULT

if errorlevel 1 (
    echo ГРЕШКА при обработката.
    if exist "%outdir%\%currentFile%" del /q "%outdir%\%currentFile%"
    set /a errors+=1
    exit /b
)

echo Успешно нормализиран.

rem ==================================================
rem ФИНАЛНА ПРОВЕРКА НА ГОТОВИЯ MP3
rem ==================================================

echo.
echo Проверка на готовия MP3...

"%~dp0ffmpeg.exe" -hide_banner -i "%outdir%\%currentFile%" ^
    -af "loudnorm=print_format=json" ^
    -f null NUL 2>"_final_check.txt"

if errorlevel 1 (
    echo ГРЕШКА при финалната проверка.
    echo %currentFile% - грешка при проверка>>"Проблеми след нормализация.txt"
    set /a checkProblems+=1
    set /a errors+=1
    set /a success+=1
    exit /b
)

rem ==================================================
rem ИЗВЛИЧАНЕ НА ФИНАЛНИ LUFS / TRUE PEAK
rem ==================================================

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$t=Get-Content -Raw '_final_check.txt';" ^
    "$m=[regex]::Match($t,'(?s)\{.*\}');" ^
    "if(-not $m.Success){exit 1};" ^
    "$j=$m.Value | ConvertFrom-Json;" ^
    "$c=[Globalization.CultureInfo]::InvariantCulture;" ^
    "$a=@($j.input_i,$j.input_tp,$j.input_lra,$j.input_thresh);" ^
    "($a | ForEach-Object {([double]$_).ToString('0.###',$c)}) -join '|' | Set-Content '_final_values.txt'"

if errorlevel 1 (
    echo Неуспешно извличане на финалните стойности.
    echo %currentFile% - неуспешно извличане на финалните стойности>>"Проблеми след нормализация.txt"
    set /a checkProblems+=1
    set /a success+=1
    exit /b
)

set "final_i="
set "final_tp="
set "final_lra="
set "final_thresh="

set "final_values="
set /p "final_values="<"_final_values.txt"

for /f "tokens=1-4 delims=|" %%A in ("!final_values!") do (
    set "final_i=%%A"
    set "final_tp=%%B"
    set "final_lra=%%C"
    set "final_thresh=%%D"
)

echo.
echo Финален резултат:
echo   LUFS            = !final_i!
echo   True Peak       = !final_tp!
echo   LRA             = !final_lra!

rem ==================================================
rem ПРОВЕРКА ЗА CLIPPING
rem ==================================================

set "finalBad="

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$tp=[double]'!final_tp!';" ^
    "if($tp -gt 0){exit 1}else{exit 0}"

if errorlevel 1 (
    set "finalBad=1"
    echo   !!! CLIPPING / TRUE PEAK НАД 0 dBTP !!!
    echo %currentFile% - LUFS=!final_i! - True Peak=!final_tp! dBTP - ВЪЗМОЖЕН CLIPPING>>"Проблеми след нормализация.txt"
)

if not defined finalBad (
    echo   Проверка clipping: OK
    set /a checkOK+=1
) else (
    set /a checkProblems+=1
)

set /a success+=1

exit /b

 

Запишете с разширение .bat  със ANSI кодиране.

BAT файла и ffmpeg.exe трябва да са във същата папка заедно със mp3 файловете.

Новите преработени файлове се създават в отделна папка вътре в главната папка.

ПП.

MP3 Loudness Normalizator _2-PASS + ANTI-CLIPPING  v4

След обработката:

Ако бъде открит True Peak над 0 dBTP, ще се получи предупреждение и файлът ще бъде записан в:
Проблеми след нормализация.txt

Редактирано от Неделев
3

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Отговорено (Редактирано)

Duplicate_Finder

Това е един скрипт за търсене на дублирани файлове. Поддържани алгоритми на хеширане
BLAKE2b-256 SHA256 SHA512
едни от най-добрите и много бързи за големи файлове.
Може да търси само по един от алгоритмите или и трите наведнъж. Прави начална проверка на началото и края на файловете и така работи много по-бързо от доста по-скъпо платени програми. А BLAKE2b-256 SHA256 SHA512 алгоритмите са много по-надеждни от CRC32 или CRC64, MD5, SHA-1

Понеже повечето програми които съм ползвал работят със CRC32 или CRC64, MD5, SHA-1 алгоритми затова реших да си направя собствена програма, която да прави точно каквото на мен ми трябва, без излишни глупости и щуротии.

Обърнете внимание в началото на
# -*- coding: utf-8 -*-
трябва да запишете с разширение .py и utf-8 кодиране.

Направете си една папка на работния плот с име Desktop_Test

# -*- coding: utf-8 -*-

import os
import hashlib
import threading
import ctypes
from ctypes import wintypes
import tkinter as tk
from tkinter import ttk, filedialog, messagebox


VERSION = "1.2.3"


duplicate_groups = []
file_vars = []
selected_folder = ""


# ============================================================
# Helpers
# ============================================================

def format_size(size):
    if size < 1024:
        return f"{size} B"

    if size < 1024 ** 2:
        return f"{size / 1024:.2f} KB"

    if size < 1024 ** 3:
        return f"{size / (1024 ** 2):.2f} MB"

    return f"{size / (1024 ** 3):.2f} GB"


def calculate_hashes(path, algorithms):
    hashers = []

    for algorithm in algorithms:
        if algorithm == "BLAKE2b-256":
            hashers.append(
                hashlib.blake2b(digest_size=32)
            )

        elif algorithm == "SHA-256":
            hashers.append(
                hashlib.sha256()
            )

        elif algorithm == "SHA-512":
            hashers.append(
                hashlib.sha512()
            )

    with open(path, "rb") as f:
        while True:
            data = f.read(1024 * 1024)

            if not data:
                break

            for h in hashers:
                h.update(data)

    return tuple(
        h.hexdigest()
        for h in hashers
    )


# ============================================================
# Folder selection
# ============================================================

def choose_folder():
    global selected_folder

    folder = filedialog.askdirectory(
        title="Изберете папка за проверка"
    )

    if folder:
        selected_folder = folder
        folder_var.set(folder)
        status_var.set(
            "Избрана папка. Готово за проверка."
        )


# ============================================================
# Scanning
# ============================================================

def start_scan():
    global duplicate_groups

    if not selected_folder:
        messagebox.showwarning(
            "Няма избрана папка",
            "Първо изберете папка за проверка."
        )
        return

    algorithms = []

    if blake_var.get():
        algorithms.append("BLAKE2b-256")

    if sha256_var.get():
        algorithms.append("SHA-256")

    if sha512_var.get():
        algorithms.append("SHA-512")

    if not algorithms:
        messagebox.showwarning(
            "Няма избран алгоритъм",
            "Изберете поне един алгоритъм."
        )
        return

    clear_results_only()

    set_buttons(False)

    progress["value"] = 0

    status_var.set(
        "Сканиране..."
    )

    thread = threading.Thread(
        target=scan_worker,
        args=(
            selected_folder,
            algorithms
        ),
        daemon=True
    )

    thread.start()


def scan_worker(folder, algorithms):
    try:
        size_groups = {}

        total_files = 0
        inaccessible = 0

        for root, dirs, files in os.walk(folder):

            for filename in files:

                path = os.path.join(
                    root,
                    filename
                )

                # Допълнителна защита:
                # сканираме само реални файлове.
                if not os.path.isfile(path):
                    continue

                try:
                    size = os.path.getsize(path)

                except (OSError, IOError):
                    inaccessible += 1
                    continue

                total_files += 1

                size_groups.setdefault(
                    size,
                    []
                ).append(path)

                root_window.after(
                    0,
                    update_scan_status,
                    total_files
                )

        candidates = [
            (size, paths)
            for size, paths in size_groups.items()
            if len(paths) > 1
        ]

        candidate_count = sum(
            len(paths)
            for size, paths in candidates
        )

        duplicates = {}

        processed = 0

        for size, paths in candidates:

            hash_groups = {}

            for path in paths:

                try:
                    hashes = calculate_hashes(
                        path,
                        algorithms
                    )

                    hash_groups.setdefault(
                        hashes,
                        []
                    ).append(path)

                except (
                    OSError,
                    IOError,
                    PermissionError
                ):
                    inaccessible += 1

                processed += 1

                root_window.after(
                    0,
                    update_hash_progress,
                    processed,
                    candidate_count
                )

            for hashes, same_paths in hash_groups.items():

                if len(same_paths) > 1:

                    duplicates[
                        (size, hashes)
                    ] = list(same_paths)

        root_window.after(
            0,
            scan_finished,
            total_files,
            candidate_count,
            duplicates,
            inaccessible,
            algorithms
        )

    except Exception as exc:

        root_window.after(
            0,
            scan_error,
            str(exc)
        )


def update_scan_status(total_files):
    status_var.set(
        f"Намерени файлове: {total_files}"
    )


def update_hash_progress(processed, total):

    if total:
        progress["value"] = (
            processed / total
        ) * 100

        status_var.set(
            f"Проверка на файловете: "
            f"{processed} / {total}"
        )


def scan_finished(
    total_files,
    candidate_count,
    duplicates,
    inaccessible,
    algorithms
):
    global duplicate_groups

    duplicate_groups = []

    for (size, hashes), paths in duplicates.items():

        duplicate_groups.append({
            "size": size,
            "paths": list(paths),
            "hashes": tuple(hashes),
            "algorithms": list(algorithms)
        })

    rebuild_results()

    progress["value"] = 100

    status = (
        f"Проверката приключи. "
        f"Файлове: {total_files} | "
        f"Кандидати: {candidate_count} | "
        f"Дублирани групи: {len(duplicate_groups)}"
    )

    if inaccessible:
        status += (
            f" | Недостъпни: {inaccessible}"
        )

    status_var.set(status)

    set_buttons(True)

    update_selected_info()


def scan_error(error):

    set_buttons(True)

    status_var.set(
        "Възникна грешка."
    )

    messagebox.showerror(
        "Грешка",
        "Възникна грешка при проверката:\n\n"
        + error
    )


# ============================================================
# Results
# ============================================================

def clear_results_only():
    global file_vars

    file_vars = []

    for widget in results_frame.winfo_children():
        widget.destroy()

    update_selected_info()


def clear_all_results():
    global duplicate_groups
    global file_vars

    duplicate_groups = []
    file_vars = []

    for widget in results_frame.winfo_children():
        widget.destroy()

    progress["value"] = 0

    status_var.set(
        "Резултатите са изчистени."
    )

    update_selected_info()

    clear_button.config(
        state="disabled"
    )

    select_all_button.config(
        state="disabled"
    )

    deselect_button.config(
        state="disabled"
    )

    select_except_first_button.config(
        state="disabled"
    )

    delete_button.config(
        state="disabled"
    )


def rebuild_results():
    global file_vars

    file_vars = []

    for widget in results_frame.winfo_children():
        widget.destroy()

    if not duplicate_groups:

        label = tk.Label(
            results_frame,
            text="Не са намерени дублирани файлове.",
            anchor="w"
        )

        label.pack(
            fill="x",
            padx=10,
            pady=20
        )

        update_selected_info()

        return

    for group_no, group in enumerate(
        duplicate_groups,
        start=1
    ):

        size = group["size"]
        paths = group["paths"]
        hashes = group["hashes"]
        algorithms = group["algorithms"]

        group_frame = tk.LabelFrame(
            results_frame,
            text=(
                f"ГРУПА {group_no} — "
                f"{len(paths)} еднакви файла — "
                f"{format_size(size)}"
            )
        )

        group_frame.pack(
            fill="x",
            padx=5,
            pady=8
        )

        hash_text = ""

        for i, algorithm in enumerate(
            algorithms
        ):

            hash_text += (
                f"{algorithm}: {hashes}\n"
            )

        tk.Label(
            group_frame,
            text=hash_text,
            justify="left",
            anchor="w"
        ).pack(
            fill="x",
            padx=8,
            pady=5
        )

        for path in paths:

            var = tk.BooleanVar(
                value=False
            )

            file_vars.append(var)

            tk.Checkbutton(
                group_frame,
                text=path,
                variable=var,
                anchor="w",
                justify="left",
                wraplength=850,
                command=update_selected_info
            ).pack(
                fill="x",
                padx=8,
                pady=1
            )

    update_selected_info()


def update_selected_info():

    selected_count = 0
    selected_size = 0
    index = 0

    for group in duplicate_groups:

        for path in group["paths"]:

            if (
                index < len(file_vars)
                and file_vars[index].get()
            ):

                selected_count += 1
                selected_size += group["size"]

            index += 1

    selected_var.set(
        f"Избрани: {selected_count} файла — "
        f"{format_size(selected_size)}"
    )


# ============================================================
# Selection
# ============================================================

def select_all():

    for var in file_vars:
        var.set(True)

    update_selected_info()


def deselect_all():

    for var in file_vars:
        var.set(False)

    update_selected_info()


def select_all_except_first():

    index = 0

    for group in duplicate_groups:

        for path_index in range(
            len(group["paths"])
        ):

            if index >= len(file_vars):
                break

            file_vars[index].set(
                path_index != 0
            )

            index += 1

    update_selected_info()


# ============================================================
# Windows Recycle Bin
# ============================================================

class SHFILEOPSTRUCTW(
    ctypes.Structure
):

    _fields_ = [
        (
            "hwnd",
            wintypes.HWND
        ),
        (
            "wFunc",
            wintypes.UINT
        ),
        (
            "pFrom",
            wintypes.LPCWSTR
        ),
        (
            "pTo",
            wintypes.LPCWSTR
        ),
        (
            "fFlags",
            wintypes.WORD
        ),
        (
            "fAnyOperationsAborted",
            wintypes.BOOL
        ),
        (
            "hNameMappings",
            wintypes.LPVOID
        ),
        (
            "lpszProgressTitle",
            wintypes.LPCWSTR
        )
    ]


FO_DELETE = 0x0003

FOF_SILENT = 0x0004

FOF_NOCONFIRMATION = 0x0010

FOF_ALLOWUNDO = 0x0040


# ------------------------------------------------------------
# Move ONE file to Recycle Bin
# ------------------------------------------------------------

def move_single_file_to_recycle_bin(path):

    # Абсолютен път
    path = os.path.abspath(path)

    # КРИТИЧНА ЗАЩИТА:
    # Никога не подаваме директория.
    if not os.path.isfile(path):
        return False

    # Допълнителна защита срещу странни пътища.
    if "\x00" in path:
        return False

    # SHFileOperationW очаква:
    #
    # path\0\0
    #
    # За един файл.
    source = path + "\0\0"

    # Създаваме истински wchar_t буфер.
    source_buffer = ctypes.create_unicode_buffer(
        source
    )

    operation = SHFILEOPSTRUCTW()

    operation.hwnd = root_window.winfo_id()

    operation.wFunc = FO_DELETE

    # Подаваме указател към буфера.
    operation.pFrom = ctypes.cast(
        source_buffer,
        wintypes.LPCWSTR
    )

    operation.pTo = None

    operation.fFlags = (
        FOF_ALLOWUNDO
        |
        FOF_NOCONFIRMATION
        |
        FOF_SILENT
    )

    operation.fAnyOperationsAborted = False

    operation.hNameMappings = None

    operation.lpszProgressTitle = None

    try:

        result = (
            ctypes.windll.shell32
            .SHFileOperationW(
                ctypes.byref(operation)
            )
        )

    except Exception:
        return False

    # Windows връща 0 при успех.
    if result != 0:
        return False

    if operation.fAnyOperationsAborted:
        return False

    # Най-важната последна проверка:
    # ако файлът вече не съществува,
    # приемаме, че е преместен.
    if not os.path.exists(path):
        return True

    return False


# ------------------------------------------------------------
# Move selected files
# ------------------------------------------------------------

def move_to_recycle_bin(paths):

    moved_paths = []
    failed_paths = []

    if not paths:
        return (
            moved_paths,
            failed_paths
        )

    # Премахваме дубликати от списъка,
    # без да променяме реда.
    unique_paths = []
    seen = set()

    for path in paths:

        normalized = os.path.normcase(
            os.path.abspath(path)
        )

        if normalized in seen:
            continue

        seen.add(normalized)

        unique_paths.append(path)

    # Всеки файл се обработва ОТДЕЛНО.
    for path in unique_paths:

        normalized_path = os.path.abspath(
            path
        )

        # Не допускаме директории.
        if not os.path.isfile(
            normalized_path
        ):
            failed_paths.append(
                normalized_path
            )
            continue

        success = (
            move_single_file_to_recycle_bin(
                normalized_path
            )
        )

        if success:

            moved_paths.append(
                normalized_path
            )

        else:

            failed_paths.append(
                normalized_path
            )

    return (
        moved_paths,
        failed_paths
    )


# ============================================================
# Delete selected
# ============================================================

def delete_selected():

    global duplicate_groups

    selected_paths = []

    index = 0

    # Събираме САМО отметнатите файлове.
    for group in duplicate_groups:

        for path in group["paths"]:

            if index < len(file_vars):

                if file_vars[index].get():

                    selected_paths.append(
                        path
                    )

            index += 1

    if not selected_paths:

        messagebox.showinfo(
            "Няма избрани файлове",
            "Няма избрани файлове за изтриване."
        )

        return

    # --------------------------------------------------------
    # Предварителна проверка
    # --------------------------------------------------------

    valid_selected_paths = []

    invalid_paths = []

    for path in selected_paths:

        absolute_path = os.path.abspath(
            path
        )

        # Само файлове.
        if os.path.isfile(
            absolute_path
        ):

            valid_selected_paths.append(
                absolute_path
            )

        else:

            invalid_paths.append(
                absolute_path
            )

    if not valid_selected_paths:

        messagebox.showerror(
            "Грешка",
            "Нито един от избраните обекти "
            "не е валиден файл."
        )

        return

    # --------------------------------------------------------
    # Размер
    # --------------------------------------------------------

    total_size = 0

    for path in valid_selected_paths:

        try:

            total_size += os.path.getsize(
                path
            )

        except OSError:
            pass

    # --------------------------------------------------------
    # Confirmation
    # --------------------------------------------------------

    answer = messagebox.askyesno(
        "Потвърждение",
        f"Избрани файлове: "
        f"{len(valid_selected_paths)}\n"
        f"Общ размер: "
        f"{format_size(total_size)}\n\n"
        "Файловете ще бъдат преместени "
        "в Кошчето на Windows.\n\n"
        "Оригиналните файлове, които НЕ са "
        "избрани, няма да бъдат засегнати.\n\n"
        "Да продължа ли?"
    )

    if not answer:
        return

    # --------------------------------------------------------
    # Move
    # --------------------------------------------------------

    (
        moved_paths,
        failed_paths
    ) = move_to_recycle_bin(
        valid_selected_paths
    )

    # --------------------------------------------------------
    # Update results
    # Само реално преместените файлове се махат.
    # --------------------------------------------------------

    moved_set = set(
        os.path.normcase(
            os.path.abspath(path)
        )
        for path in moved_paths
    )

    new_groups = []

    for group in duplicate_groups:

        remaining = []

        for path in group["paths"]:

            normalized = os.path.normcase(
                os.path.abspath(path)
            )

            # Ако е преместен успешно -> махаме
            # от резултатите.
            if normalized in moved_set:
                continue

            # Всички останали остават.
            remaining.append(path)

        # Групата е дубликатна само ако
        # са останали поне 2 файла.
        if len(remaining) > 1:

            new_groups.append({
                "size": group["size"],
                "paths": remaining,
                "hashes": group["hashes"],
                "algorithms": group["algorithms"]
            })

    duplicate_groups = new_groups

    rebuild_results()

    update_selected_info()

    # --------------------------------------------------------
    # Result message
    # --------------------------------------------------------

    if failed_paths:

        message = (
            f"Успешно преместени в Кошчето: "
            f"{len(moved_paths)} файла.\n\n"
            f"Неуспешни: "
            f"{len(failed_paths)} файла."
        )

        if invalid_paths:

            message += (
                f"\n\nНевалидни обекти: "
                f"{len(invalid_paths)}."
            )

        messagebox.showwarning(
            "Резултат",
            message
        )

    else:

        messagebox.showinfo(
            "Готово",
            f"{len(moved_paths)} файла "
            "са преместени в Кошчето."
        )


# ============================================================
# Buttons
# ============================================================

def set_buttons(enabled):

    state = (
        "normal"
        if enabled
        else "disabled"
    )

    choose_button.config(
        state=state
    )

    start_button.config(
        state=state
    )

    clear_button.config(
        state=state
    )

    if enabled and duplicate_groups:

        select_all_button.config(
            state="normal"
        )

        deselect_button.config(
            state="normal"
        )

        select_except_first_button.config(
            state="normal"
        )

        delete_button.config(
            state="normal"
        )

    else:

        select_all_button.config(
            state="disabled"
        )

        deselect_button.config(
            state="disabled"
        )

        select_except_first_button.config(
            state="disabled"
        )

        delete_button.config(
            state="disabled"
        )


# ============================================================
# GUI
# ============================================================

root_window = tk.Tk()

root_window.title(
    f"Duplicate Finder v{VERSION}"
)

root_window.geometry(
    "950x700"
)

root_window.minsize(
    700,
    500
)


# ============================================================
# Top
# ============================================================

top_frame = tk.Frame(
    root_window
)

top_frame.pack(
    fill="x",
    padx=10,
    pady=10
)


choose_button = tk.Button(
    top_frame,
    text="Избери папка",
    command=choose_folder
)

choose_button.pack(
    side="left"
)


folder_var = tk.StringVar()


tk.Entry(
    top_frame,
    textvariable=folder_var,
    state="readonly"
).pack(
    side="left",
    fill="x",
    expand=True,
    padx=8
)


start_button = tk.Button(
    top_frame,
    text="Започни проверка",
    command=start_scan
)

start_button.pack(
    side="right"
)


# ============================================================
# Algorithms
# ============================================================

algorithm_frame = tk.LabelFrame(
    root_window,
    text="Алгоритми за проверка"
)

algorithm_frame.pack(
    fill="x",
    padx=10,
    pady=5
)


blake_var = tk.BooleanVar(
    value=True
)

sha256_var = tk.BooleanVar(
    value=False
)

sha512_var = tk.BooleanVar(
    value=False
)


tk.Checkbutton(
    algorithm_frame,
    text="BLAKE2b-256",
    variable=blake_var
).pack(
    side="left",
    padx=10
)


tk.Checkbutton(
    algorithm_frame,
    text="SHA-256",
    variable=sha256_var
).pack(
    side="left",
    padx=10
)


tk.Checkbutton(
    algorithm_frame,
    text="SHA-512",
    variable=sha512_var
).pack(
    side="left",
    padx=10
)


# ============================================================
# Selection buttons
# ============================================================

selection_frame = tk.Frame(
    root_window
)

selection_frame.pack(
    fill="x",
    padx=10,
    pady=5
)


select_all_button = tk.Button(
    selection_frame,
    text="Избери всички",
    command=select_all,
    state="disabled"
)

select_all_button.pack(
    side="left",
    padx=2
)


deselect_button = tk.Button(
    selection_frame,
    text="Премахни отметките",
    command=deselect_all,
    state="disabled"
)

deselect_button.pack(
    side="left",
    padx=2
)


select_except_first_button = tk.Button(
    selection_frame,
    text="Избери всички освен първия",
    command=select_all_except_first,
    state="disabled"
)

select_except_first_button.pack(
    side="left",
    padx=2
)


delete_button = tk.Button(
    selection_frame,
    text="Изтрий избраните",
    command=delete_selected,
    state="disabled"
)

delete_button.pack(
    side="right",
    padx=2
)


# ============================================================
# Selected information
# ============================================================

selected_var = tk.StringVar(
    value="Избрани: 0 файла — 0 B"
)


tk.Label(
    root_window,
    textvariable=selected_var,
    anchor="w"
).pack(
    fill="x",
    padx=10,
    pady=2
)


# ============================================================
# Results
# ============================================================

results_container = tk.Frame(
    root_window
)

results_container.pack(
    fill="both",
    expand=True,
    padx=10,
    pady=5
)


results_canvas = tk.Canvas(
    results_container
)


results_scrollbar = ttk.Scrollbar(
    results_container,
    orient="vertical",
    command=results_canvas.yview
)


results_frame = tk.Frame(
    results_canvas
)


results_window = (
    results_canvas.create_window(
        (0, 0),
        window=results_frame,
        anchor="nw"
    )
)


def update_scroll_region(event=None):

    results_canvas.configure(
        scrollregion=(
            results_canvas.bbox("all")
        )
    )


def update_canvas_width(event):

    results_canvas.itemconfig(
        results_window,
        width=event.width
    )


results_frame.bind(
    "<Configure>",
    update_scroll_region
)


results_canvas.bind(
    "<Configure>",
    update_canvas_width
)


results_canvas.configure(
    yscrollcommand=results_scrollbar.set
)


results_canvas.pack(
    side="left",
    fill="both",
    expand=True
)


results_scrollbar.pack(
    side="right",
    fill="y"
)


# ============================================================
# Progress
# ============================================================

progress = ttk.Progressbar(
    root_window,
    orient="horizontal",
    mode="determinate"
)

progress.pack(
    fill="x",
    padx=10,
    pady=5
)


# ============================================================
# Status
# ============================================================

status_var = tk.StringVar(
    value="Готово."
)


tk.Label(
    root_window,
    textvariable=status_var,
    anchor="w"
).pack(
    fill="x",
    padx=10,
    pady=5
)


# ============================================================
# Clear
# ============================================================

clear_button = tk.Button(
    root_window,
    text="Изчисти резултатите",
    command=clear_all_results,
    state="disabled"
)

clear_button.pack(
    pady=5
)


# ============================================================
# Start
# ============================================================

root_window.mainloop()

Ако искате да направите скрипта DuplicateFinder_v1.2.3.py да работи като самостоятелно EXE, направете следното:

 Отворете команден прозорец вътре в папка - Desktop_Test
и стартирайте следната команда

py -3.8 -m PyInstaller --onefile --windowed --clean DuplicateFinder_v1.2.3.py

Ще се появят 2 папки- build и dist. Готовото EXE ще намерите в папка dist

Ако терминалът не е в тази папка -> прозореца на CMD

Може първо да изпълните:

cd /d C:\Users\ВАШЕТО ИМЕ\Desktop\Desktop_Test

и после:

py -3.8 -m PyInstaller --onefile --windowed --clean DuplicateFinder_v1.2.3.py

Или да си направите BAT файл със съдържание

py -3.8 -m PyInstaller --onefile --windowed --clean DuplicateFinder_v1.2.3.py

да го поставите в папката и да го стартирате.

Примерно с име PyInstaller.bat
За целта трябва да имате инсталиран
python-3.8.9
на компютъра.

8nGON0v.jpeg

 

 

 

 

 

 

 

 

 

 

 

Редактирано от Неделев
4

Сподели публикацията


Адрес на коментара
Сподели в други сайтове

Създайте нов акаунт или се впишете, за да коментирате

За да коментирате, трябва да имате регистрация

Създайте акаунт

Присъединете се към нашата общност. Регистрацията става бързо!


Регистрация на нов акаунт

Вход

Имате акаунт? Впишете се оттук.


Вписване