Обновление информации без создания новой строки в партии - PullRequest
0 голосов
/ 08 января 2020

Сценарий, над которым я работал, читает все папки на дисководе компакт-дисков "i" и ищет mp3-файлы, копируя их в место назначения "e: \ MP3 \ new".

@ECHO off

setlocal enabledelayedexpansion

cd /d "i:\"
set count=1
for /r %%d in (*.mp3) do (
     set /a count+=1
     )
echo There were %count% files found

set countb=1
for /r %%g in (*.mp3) do (
     set /a countb+=1 
     echo|set /p = File: !countb!/%count% 
     copy "%%g" "e:\MP3\new" > nul
)

endlocal

Предположим в этом примере, что найдено 115 файлов.

Что я получаю из приведенного выше кода:

Найдено 115 файлов Файл: 1/115 Файл: 2/115 Файл: 3/115 Файл: 4/115 Файл: 5/115 (...) Файл: 115/115

Что я хочу:

Найдено 115 файлов Файл: X / 115

, где X будет постоянно обновляться на экране при каждом успешном копировании mp3-файла

Любая помощь, чтобы это исправить?

1 Ответ

2 голосов
/ 08 января 2020

Во-первых, вы неправильно инициализируете свои счетчики, для получения правильных чисел они должны быть установлены на ноль (например, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...