Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Совмещение прогресс бара и комманды xcopy (http://forum.oszone.net/showthread.php?t=184374)

siss 01-09-2010 09:22 1486222

Совмещение прогресс бара и комманды xcopy
 
Добрый день, как совместить прогресс бар с коммандой 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

Вот оригинал (форум отображает не все символы)

amel27 01-09-2010 10:15 1486244

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

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

amel27 01-09-2010 12:02 1486312

Цитата:

Цитата 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);
//


romrip 01-09-2010 15:40 1486460

Цитата:

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

amel27 01-09-2010 16:06 1486489

Цитата:

Цитата 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 привести в соответствие новому назначению )

romrip 01-09-2010 17:19 1486568

Код:

@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 1486582

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 1486610

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

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

Цитата:

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

пост #6

romrip 02-09-2010 15:49 1487231

Вложений: 1
все,разобрался, результат в прикрепленном архиве, единственное, не могу разобраться с кодировкой, вместо русских букв иероглифы, если ставить кирилицу, то нет полосы копирования, вместо неё буквы Ы, либо что-то иное.

amel27 02-09-2010 18:46 1487348

romrip, текст батника должен быть в DOS-кодировке

CMD/BAT - [решено] Помогите с кодировкой.
CMD/BAT - Проблема с кодировками в cmd

romrip 03-09-2010 10:16 1487680

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

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

romrip 14-09-2010 10:27 1494964

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

amel27 15-09-2010 05:11 1495599

Цитата:

Цитата romrip
возможно ли реализовать вывод в ЗАГОЛОВОК ОКНА того, что выводиться в командной строке »

нельзя, только отдельной командой (TITLE), а команды в CMD запускаются последовательно (одна за другой)

AlexVong 22-01-2012 17:03 1841902

можно ли как то прикрутить прогресс бар к такому батнику?
Код:

@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 2132750

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 2132752

нашел в принципе ответ тут
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 2133453

Цитата:

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 2133704

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


sov44 09-01-2014 10:17 2285324

Цитата:

Цитата firstarey
конструкция создает батник, который в свою очередь выведет стандартное окно копирования windows
(а там и прогресс бар и т.д. ) »

Не работает. Ищу решение для копирования файлов и папок с вызовом батником стандартного окна копирования Windows.

Iska 09-01-2014 10:27 2285328

Никак. Разве что извращаться совмещением cmd и JScript в одном флаконе, либо использовать «mshta.exe», передавая ему в командной строке сформированный JScript-код. Проще перейти на WSH.

Впрочем, нет: есть ещё вариант с использованием команды «shellcopy» утилиты NirCmd.

sov44 09-01-2014 12:57 2285400

Цитата:

Цитата Iska
Разве что извращаться совмещением cmd и JScript в одном флаконе »

Было бы очень не плохо. Как вариант, запуск батника с аргументами что и куда :)

Iska 09-01-2014 14:50 2285470

Цитата:

Цитата sov44
Было бы очень не плохо. Как вариант, запуск батника с аргументами что и куда »

Делайте ;).

sov44 09-01-2014 15:38 2285494

Цитата:

Цитата Iska
Делайте ;) »

:lol: :good:
К сожалению моих познаний на это пока не хватает :)

Iska 09-01-2014 16:32 2285522

Цитата:

Цитата sov44
К сожалению моих познаний на это пока не хватает »

Цитата:

Цитата Iska
Проще перейти на WSH. »


icq99999999 09-02-2014 09:53 2305803

Цитата:

Цитата firstarey
Код: »

а как сделать чтоб если конечная папка уже содержит файлы то пропустить копирование этих файлов?(без запроса у пользователя)

Ruboard 24-08-2020 17:50 2932000

Цитата:

Цитата amel27
наткнулся на одну замечательную утилитку - порт никсовой DD, которая может копировать файлы по частям, с её помощью можно организовать прогресс-бар для больших файлов »

Почему-то более 2 гб она не копирует. Каким образом можно копировать один файл больше 10 гб?

Iska 24-08-2020 18:03 2932003

Цитата:

Цитата Ruboard
Каким образом можно копировать один файл больше 10 гб? »

Взять исходники, поправить, перекомпилировать и пользовать.

Busla 24-08-2020 18:11 2932004

Цитата:

Цитата Ruboard
Почему-то более 2 гб она не копирует. Каким образом можно копировать один файл больше 10 гб? »

10 лет прошло - может вам стоит озвучить исходную задачу?

вы можете использовать robocopy


Время: 16:49.

Время: 16:49.
© OSzone.net 2001-