Во-первых, вы неправильно инициализируете свои счетчики, для получения правильных чисел они должны быть установлены на ноль (например, set count=0
), а не на единицу.
Во-вторых, вы должны заменить echo|set /p =
на < nul set /P =
, поскольку канал (|
) медленнее простого перенаправления (ввода) (<
), поскольку он создает новые экземпляры cmd
для любой из сторон.
Чтобы переместить курсор в окне командной строки Возвращаясь к началу текущей строки, сначала нужно написать символ возврата каретки. Однако вы не можете использовать этот символ в качестве первого с set /P
, поскольку он будет удален вместе с другими ведущими пробельными символами. Таким образом, вам нужен еще один невидимый символ, предшествующий возврату каретки, который не будет удален; давайте выберем символ пробела.
Поэтому фиксированный код может выглядеть следующим образом, например:
@echo off
setlocal EnableDelayedExpansion
rem // Gather the back-space character:
for /F %%B in ('prompt $H ^& for %%Z in ^(.^) do rem') do set "BS=%%B"
rem // Gather the carriage-return character:
for /F %%C in ('copy /Z "%~f0" nul') do set "CR=%%C"
cd /D "I:\"
set /A "count=0"
for /R %%d in ("*.mp3") do (
set /A "count+=1"
)
echo There were %count% files found.
set /A "index=0"
for /R %%g in ("*.mp3") do (
set /A "index+=1"
< nul set /P ="%BS%!CR!File: !index!/%count%"
copy "%%~g" "E:\MP3\new\" > nul
)
endlocal