Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Совмещение прогресс бара и комманды xcopy

Ответить
Настройки темы
CMD/BAT - Совмещение прогресс бара и комманды xcopy

Новый участник


Сообщения: 8
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день, как совместить прогресс бар с коммандой 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
Вот оригинал (форум отображает не все символы)

Отправлено: 09:22, 01-09-2010

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


- обход файлов придется делать дважды: сначала для подсчета, потом для обработки;
- копировать файлы придется по одному (обновлять бар между копированием файлов)
- конкретная реализация зависит от условий копирования, пример (без процедуры :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

Отправлено: 10:15, 01-09-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:44, 01-09-2010 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата romrip:
прогресс при копировании одного файла »
- 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);
//
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 01-09-2010 | #4


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата amel27:
Код:
@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: Предполагается наличие ';'
далее сразу закрывается

Последний раз редактировалось romrip, 01-09-2010 в 16:57.


Отправлено: 15:40, 01-09-2010 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата romrip:
у меня ругается при выполнении, если можно поподробнее, весь текст »
это весь текст, если можно поподробнее на что ругается


наткнулся на одну замечательную утилитку - порт никсовой 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 привести в соответствие новому назначению )

Отправлено: 16:06, 01-09-2010 | #6


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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
если так, то проценты бегут, но копирования файла нет, только визуальное отображение.

Отправлено: 17:19, 01-09-2010 | #7


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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 без толку - спецсимволы теряются
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:35, 01-09-2010 | #8


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: 7z Progress_bar.7z
(597 байт, 96 просмотров)

кажеться разобрался, нехотел понимать русские буквы в заголовке,

теперь лучше, а можно вывести прогресс в выполняемом окне в виде растущей полоски ?
и как спрятать выполение 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 отрабатывает только один цикл копирования), строка при этом наполняется как нужно, но не отрабатывает основной код.
неплохо еслиб бар выглядел так как в приклепленном батнике в архиве:

Последний раз редактировалось romrip, 02-09-2010 в 00:23.


Отправлено: 18:08, 01-09-2010 | #9


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата romrip:
как спрятать выполение dd ? »
пост #6

Отправлено: 19:26, 01-09-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Совмещение прогресс бара и комманды xcopy

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Вставка прогресс бара в функцию Medic84 AutoIt 52 07-04-2014 00:19
Графика - [addon] z-Runss - модификация прогресс-бара установки sLiDeR-X Наборы обновлений для Windows XP/2003/Windows 7 152 18-11-2011 11:34
[решено] Вписывание прогресс-бара в гуи-форму saavaage AutoIt 9 09-08-2010 22:16
CMD/BAT - [решено] нельзя назвать батник делающий xcopy, xcopy.bat почему ? foxbat Скриптовые языки администрирования Windows 3 17-09-2009 05:33
Комманды из bat fedww Программное обеспечение Windows 0 25-06-2007 13:44




 
Переход