PDA

Показать полную графическую версию : Совмещение прогресс бара и комманды xcopy


Страниц : [1] 2

siss
01-09-2010, 09:22
Добрый день, как совместить прогресс бар с коммандой Xcopy.
Мне необходимо что бы после запуска бат файла с коммандой xcopy, показывалась не только фраза: "скопировано *** файлов", а во время копирования шёл этот бар, возможно ли написать такое?
Вот сам прогресс бар:

@Echo Off
Setlocal EnableDelayedExpansion

rem Число символов в прогрессбаре
Set N_Col=79
rem Число иттераций (файлов в моем случае) на 100%
Set cntA=100

rem -----------------------------
Set cnt=0
Echo Обработка запущена
:loop
Call :Work
Call :Bar Обработано
If Not %cnt%==%cntA% GoTo :loop
rem -----------------------------
Echo.
Echo Обработка завершена
Pause>nul
Exit

:Bar
If %cnt%==0 (
For /L %%a In (1,1,%N_Col%) Do Set Line0=!Line0!░
For /L %%a In (1,1,%N_Col%) Do Set Line0=!Line0!
<Nul Set /p X=!Line0!
)
Set /a Inc=((%cnt%+1)*%N_Col%)/%cntA%-(%cnt%*%N_Col%)/%cntA%
If %Inc% GTR 0 For /L %%a In (1,1,%Inc%) Do <Nul Set /p X=█
Set /a cnt+=1
Set /a prsnt=cnt*100/cntA
Title %1 %prsnt%%% файлов: %cnt% из %cntA%
GoTo :EOF

:Work
rem Здесь собственно рабочая процедура

GoTo :EOF


Вот оригинал (форум отображает не все символы) (http://forum.oszone.net/attachment.php?attachmentid=29124&d=1247743664)

amel27
01-09-2010, 10:15
- обход файлов придется делать дважды: сначала для подсчета, потом для обработки;
- копировать файлы придется по одному (обновлять бар между копированием файлов)
- конкретная реализация зависит от условий копирования, пример (без процедуры :BAR):
@Echo Off
Setlocal EnableDelayedExpansion

rem Каталог откуда копируем файлы
Set FROM=C:\_\_
rem Маска копируемых файлов
Set MASK=*.*
rem Каталог куда копируем файлы
Set DEST=C:\~\_
rem Число символов в прогрессбаре
Set N_Col=79
rem Число иттераций (файлов в моем случае) на 100%
For /F "Delims=" %%i In ('DIR /B/S/A-D "%FROM%\%MASK%"^|Find /V /C ""') Do Set cntA=%%i
rem -----------------------------
Set cnt=0
Echo Обработка запущена
For /F "Delims=" %%i In ('DIR /B/S/A-D "%FROM%" 2^>Nul') Do (
Call :Work "%%i"
Call :Bar Обработано
)
rem -----------------------------
Echo.
Echo Обработка завершена
Pause>nul
Exit

:Work
Set "TO=%~1"
Call Set "TO=%%TO:%FROM%=%DEST%%%"
Echo F|XCopy /Q/Y "%~1" "%TO%" >Nul 2>>"%~dpn0.err"
GoTo :EOF

romrip
01-09-2010, 10:44
а возможно сделать прогресс при копировании одного файла?

amel27
01-09-2010, 12:02
прогресс при копировании одного файла »
- RoboCopy показывает индикатор копирования в процентах;
- вариант на VBS:
Function FileCopy(strFileFrom, strDirTo)
Dim objShell, objFolder

Set objShell = CreateObject("shell.Application")
Set objFolder = objShell.NameSpace(strDirTo)

If Not objFolder Is Nothing Then
objFolder.CopyHere strFileFrom, 16
End If

End Function
- тот же WSH, скомпонованный в CMD:
@set @x=0 /*
@set $f=C:\TEST1\FILE.ISO
@set $d=D:\TEST2

@cscript //nologo /e:jscript "%0" "%$f%" "%$d%"
@exit /b

*/new ActiveXObject("shell.Application").NameSpace(WScript.Arguments(1)).CopyHere(WScript.Arguments(0),16);
//

romrip
01-09-2010, 15:40
Код:
@set @x=0 /*
@set $f=C:\TEST1\FILE.ISO
@set $d=D:\TEST2
@cscript //nologo /e:jscript "%0" "%$f%" "%$d%"
@exit /b
*/new ActiveXObject("shell.Application").NameSpace(WScript.Arguments(1)).CopyHere(WScript.Arguments(0),16);
// »

что-то у меня ругается при выполнении, если можно поподробнее, весь текст.

просто закрывается окно, если вставить паузу перед @exit /b
то (1, 11) Ошибка компиляции Microsoft JScript: Предполагается наличие ';'
далее сразу закрывается

amel27
01-09-2010, 16:06
у меня ругается при выполнении, если можно поподробнее, весь текст »это весь текст, если можно поподробнее на что ругается


наткнулся на одну замечательную утилитку - порт никсовой DD (http://www.chrysocome.net/dd), которая может копировать файлы по частям, с её помощью можно организовать прогресс-бар для больших файлов:
@Echo Off
SetLocal EnableDelayedExpansion

Set $f=c:\DIR1\file1.iso
Set $d=d:\DIR2\file2.iso

If Exist "%$d%" DEL "%$d%"
For %%i In ("%$f%") Do Set $z=%%~zi
Set /A $z=$z/99

Set N_Col=79
Set cntA=100
Set cnt=0
rem -----------------------------
Echo Обработка запущена
for /l %%i in (0,1,99) do (
dd bs=%$z%c count=1 if="%$f%" of="%$d%" skip=%%i seek=%%i >nul 2>&1
Call :Bar
)
rem -----------------------------
Echo.
Echo Обработка завершена
Pause>nul
Exit

P.S. осталось текст процедуры :BAR привести в соответствие новому назначению )

romrip
01-09-2010, 17:19
@Echo Off
SetLocal EnableDelayedExpansion

Set $f=C:\1\2003.GDB
Set $d=C:\2\2003.GDB

If Exist "%$d%" DEL "%$d%"
For %%i In ("%$f%") Do Set $z=%%~zi
Set /A $z=$z/99

Set N_Col=79
Set cntA=100
Set cnt=0
rem -----------------------------
Echo Обработка запущена
for /l %%i in (0,1,99) do (
dd bs=%$z%c count=1 if="%$f%" of="%$d%" skip=%%i seek=%%i >nul 2>&1
Call :Bar
)
rem -----------------------------
Echo.
Echo Обработка завершена
Pause>nul
Exit

:Bar
If %cnt%==0 (
For /L %%a In (1,1,%N_Col%) Do Set Line0=!Line0!░
For /L %%a In (1,1,%N_Col%) Do Set Line0=!Line0!
<Nul Set /p X=!Line0!
)
Set /a Inc=((%cnt%+1)*%N_Col%)/%cntA%-(%cnt%*%N_Col%)/%cntA%
If %Inc% GTR 0 For /L %%a In (1,1,%Inc%) Do <Nul Set /p X=█
Set /a cnt+=1
Set /a prsnt=cnt*100/cntA
Title %1 %prsnt%%% файлов: %cnt% из %cntA%
GoTo :EOF

если так, то проценты бегут, но копирования файла нет, только визуальное отображение.

amel27
01-09-2010, 17:35
romrip, тогда для начала разобраться с копированием:

- закомментировать строку "Call :Bar"
- в строке DD отключить подавление вывода, убрать в конце " >nul 2>&1"
- добавить вывод командной строки:

@Echo Off
SetLocal EnableDelayedExpansion

Set $f=C:\1\2003.GDB
Set $d=C:\2\2003.GDB

If Exist "%$d%" DEL "%$d%"
For %%i In ("%$f%") Do Set $z=%%~zi
Set /A $z=$z/99

Set N_Col=79
Set cntA=100
Set cnt=0
rem -----------------------------
Echo Обработка запущена
for /l %%i in (0,1,99) do (
echo dd bs=%$z%c count=1 if="%$f%" of="%$d%" skip=%%i seek=%%i
dd bs=%$z%c count=1 if="%$f%" of="%$d%" skip=%%i seek=%%i
rem Call :Bar
)
rem -----------------------------
Echo.
Echo Обработка завершена
Pause>nul
Exit
- вызов:
test.cmd >test.log 2>&1
- смотреть лог "test.log"

P.S. постить процедуру BAR без толку - спецсимволы теряются

romrip
01-09-2010, 18:08
кажеться разобрался, нехотел понимать русские буквы в заголовке,

теперь лучше, а можно вывести прогресс в выполняемом окне в виде растущей полоски ?
и как спрятать выполение dd ? проценты в заголовке хорошо, но вот все окно забиваться работай dd - это не очень.

@set @x=0 /*;
@set $f=C:\1\2003.GDB;
@set $d=C:\2\2003.GDB;

@cscript //nologo /e:jscript "%0" "%$f%" "%$d%";
@exit /b

*/new ActiveXObject("shell.Application").NameSpace(WScript.Arguments(1)).CopyHere(WScript.Arguments(0),16);
//

после установки @set @x=0 /*;
новая ошибка: test1.cmd(8, 3) Ошибка выполнения Microsoft JScript: 'new ActiveXObject(...) .NameSpace(...)' - есть null или не является объектом.


так, а как прикрбтить вот такой :BAR
:BAR
Setlocal EnableDelayedExpansion
Rem Длина строки
Set len=45
Rem Строка
Set string="IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"

For /L %%a In (1,1,%len%) Do (
For %%I In (^| / - \) Do (
Set /p X=%%I<Nul
Call :Wait
)
Set /p X=!string:~%%a,1!<Nul
)

Echo.
Echo Копирование завершено
Pause>nul
Exit
что нужно поменять, чтобы копировался весь файл,почему-то копирует только часть файла размером 118 кб(dd отрабатывает только один цикл копирования), строка при этом наполняется как нужно, но не отрабатывает основной код.
неплохо еслиб бар выглядел так как в приклепленном батнике в архиве:

amel27
01-09-2010, 19:26
как спрятать выполение dd ? »
пост #6

romrip
02-09-2010, 15:49
все,разобрался, результат в прикрепленном архиве, единственное, не могу разобраться с кодировкой, вместо русских букв иероглифы, если ставить кирилицу, то нет полосы копирования, вместо неё буквы Ы, либо что-то иное.

amel27
02-09-2010, 18:46
romrip, текст батника должен быть в DOS-кодировке

CMD/BAT - [решено] Помогите с кодировкой. (http://forum.oszone.net/showthread.php?p=1327804)
CMD/BAT - Проблема с кодировками в cmd (http://forum.oszone.net/showthread.php?t=57327)

romrip
03-09-2010, 10:16
если текст в DOS кодировке, то он в блокноте(AkelPad, TigerPad) отображаеться нормально, а вот при выполнении вместо кирилицы иероглифы (для Dos ставил шрифт и terminal и fixedsys) ничего не помогает.

Думаю тему можно пометить как (РЕШЕНО), ибо основная задача решена, а скодировкой- это второстепенно.

romrip
14-09-2010, 10:27
появилась еще одна идея,:
возможно ли реализовать вывод в ЗАГОЛОВОК ОКНА того, что выводиться в командной строке (в данный момент времени) ??
например robocopy при копировании выводит % копирования, неплохо было бы увидеть их в заголовке окна.

amel27
15-09-2010, 05:11
возможно ли реализовать вывод в ЗАГОЛОВОК ОКНА того, что выводиться в командной строке »нельзя, только отдельной командой (TITLE), а команды в CMD запускаются последовательно (одна за другой)

AlexVong
22-01-2012, 17:03
можно ли как то прикрутить прогресс бар к такому батнику?

@echo off
SetLocal EnableDelayedExpansion
set fi=C:\IN\001.txt
set fi1=C:\IN\005.txt
set fi2=C:\IN\011.txt
set fi3=C:\IN\028.txt
set fo=C:\OUT\000.txt
(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:".* 0 .* 0 .* 0 .*" "%fi%"') do ( set /a $j=%%i-1& for /f "tokens=1* delims=[]" %%a in ( 'find /v /n ""^<"%fi%"^|findstr /bc:"[%%i]" /c:"[!$j!]"') do echo.001 %%b )) >"%fo%"
(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:".* 0 .* 0 .* 0 .*" "%fi1%"') do ( set /a $j=%%i-1& for /f "tokens=1* delims=[]" %%a in ( 'find /v /n ""^<"%fi1%"^|findstr /bc:"[%%i]" /c:"[!$j!]"') do echo.005 %%b )) >>"%fo%"
(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:".* 0 .* 0 .* 0 .*" "%fi2%"') do ( set /a $j=%%i-1& for /f "tokens=1* delims=[]" %%a in ( 'find /v /n ""^<"%fi2%"^|findstr /bc:"[%%i]" /c:"[!$j!]"') do echo.011 %%b )) >>"%fo%"
(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:".* 0 .* 0 .* 0 .*" "%fi3%"') do ( set /a $j=%%i-1& for /f "tokens=1* delims=[]" %%a in ( 'find /v /n ""^<"%fi3%"^|findstr /bc:"[%%i]" /c:"[!$j!]"') do echo.028 %%b )) >>"%fo%"

neprotiv
15-04-2013, 03:02
amel27,
а как можно заманить строку
For /F "Delims=" %%i In ('DIR /B/S/A-D "%FROM%\%MASK%"^|Find /V /C ""') Do Set cntA=%%i

чтоб можно было б делать подсчет из строк текстового файла?

делаю так
For /F "Delims=" %%i In ('Find /V /C "" "test.txt"') Do Set cntA=%%i

но как оставить только цыфры в выводе
---------- test.txt=12535


иначе процент вообще не прощитывается

neprotiv
15-04-2013, 03:34
нашел в принципе ответ тут
http://forum.oszone.net/post-1942317.html

сделал так
Set cntA=0
For /F "usebackq" %%L In (test.txt) Do (Set /A cntA+=1)
Set cnt=0
for /f "Tokens=*" %%i in (test.txt) do (
move "%%~nxi" "%%i"
Call :bar
)

вроди все правильно отображается и считает..но может есть решение попроще

Foreigner
16-04-2013, 07:03
For /F "usebackq" %%L In (test.txt) Do (Set /A cntA+=1)
Не считает пустые строки.

но может есть решение попроще

@echo off
setlocal

for /f "tokens=1 delims=:" %%i in (' findstr /n "^.*" "test.txt" ') do set "cnt=%%i"
echo %cnt%

firstarey
16-04-2013, 14:15
припозднился, но возможно поможет.
конструкция создает батник, который в свою очередь выведет стандартное окно копирования windows
(а там и прогресс бар и т.д. )

вставить можно в любом месте батника

echo @set @x=0 /*>>progress_bar.cmd
echo.>>progress_bar.cmd
echo @cscript //nologo /e:jscript "progress_bar.cmd" "что копируем" "куда копируем>>progress_bar.cmd
echo @exit /b>>progress_bar.cmd
echo.>>progress_bar.cmd
echo */new ActiveXObject("shell.Application").NameSpace(WScript.Arguments(1)).CopyHere(WScript.Arguments(0),16);>>progress_bar.cmd
echo //>>progress_bar.cmd
call progress_bar.cmd
ping -n 10 localhost>nul
del progress_bar.cmd




© OSzone.net 2001-2012