Показать полную графическую версию : мониторинг копирования файлов
Ingolder
09-12-2009, 14:17
День добрый :)
Вопрос такой: можно ли написать скриптик, чтобы при копировании файлов он показывал информацию о времени, оставшемся до завершения копирования и сколько процентов скопировано?
а то если пишешь copy ... ... он просто копирует и не ясно - какая скорость, это на пять минут или на пол дня...
Слышал, что виндовый Командир Нортон (не знаю, как он сейчас называется по-правильному) поддерживает командную строку. :dont-know
т.к. все скриптовые языки однопотоковые, то рассчитать скорость, проценты и т.п. можно только между копированием отдельных файлов, поэтому при копировании нескольких больших файлов такая затея теряет смысл... хотя в некоторых случаях (если есть поддержка API, как в AutoIT) для этого удается задействовать системные потоки, по графическому отображению процессов в CMD есть отдельная тема:
CMD/BAT - [решено] Графическая оболочка для CMD (индикатор состояния) (http://forum.oszone.net/showthread.php?t=145074)
А почему не Far Manager (http://www.farmanager.com/)? Тем паче, что версия 2.0 идёт под открытой лицензией (http://www.farmanager.com/opensource.php?l=ru).
P.S. Это ко 2-му посту.
т.к. все скриптовые языки однопотоковые »
Не говорите за всех ;) Для PowerShell это никогда не было проблемой.
Впрочем там можно легко получить нативный прогрессбар при копировании (а еще и докачку с приоритизацией трафика) используя модуль BitsTransfer (http://xaegr.wordpress.com/2009/10/14/bitstransfer/).
Для остальных языков вполне можно использовать стандартный Windows диалог копирования файлов. Делается это через COM-объект shell.application, и на PowerShell выглядит так (думаю сконвертировать на VBS не будет проблемой):
$yesToAll = 16
$shellApplication = new-object -com shell.application
$test1 = $shellApplication.NameSpace("D:\Scripts\temp\test1")
$test2 = $shellApplication.NameSpace("D:\Scripts\temp\test2")
$test2.CopyHere($test1,$yesToAll)
Ingolder
10-12-2009, 11:20
NiOl, нортон командир наверное не будет работать на 64битной винде..
конечно, это всё замечательно, Нортон командир или Фар, но я как-бы скриптик хотел а не софтину.
amel27, спасибо за тему, почитаю, отпишусь.
Xaegr, очень интересно что вы про повершелл :) но ваш скрипт у меня просто копирует и ничего более не происходит, никакого мониторинга... вообще ничего. Очень хочтелось бы и повершельное решение моей проблемы.
Xaegr, мы немного о разном, Вы - о возможности использовать готовые прогресс-бары сторонней разработки (COM, .NET, DLL, EXE и т.п.), а я - о возможности сваять свой собственный прогресс-бар, в API это обычно делается через определение своей CallBack - функции... Само собой, никто не мешает собрать в VisualStudio свой консольный EXE для копирования и вызывать его из CMD. :)
Xaegr, мы немного о разном, Вы - о возможности использовать готовые прогресс-бары сторонней разработки (COM, .NET, DLL, EXE и т.п.), »
Нет. Во первых я не упомянул ни одного компонента сторонней разработки - всё от MS. Во вторых, непонятно почему вы приписываете к сторонним компонентам COM, .NET, DLL? PowerShell сам основан на .NET (причем "насквозь"), и по сути состоит из нескольких .DLL :) Аналогично с VBS ([cw]script.exe, соотв. DLL) и т.д.
а я - о возможности сваять свой собственный прогресс-бар, в API это обычно делается через определение своей CallBack - функции... »
Ну во-первых, я честно говоря не вижу пока в условии необходимости использования ни нескольких потоков, ни callback функций. Если вы хотите нарисовать совсем свой бар - write-progress. Ну или $host (чтоб совсем на низком уровне). Но если что, в PS есть возможность использовать и callback кода, и многопоточности.
но ваш скрипт у меня просто копирует и ничего более не происходит, никакого мониторинга... »
Это второй вариант? Странно, он должен выводить графическое окно копирования файлов, стандартное как в Windows.
Если у вас Vista/2008 и выше, посмотрите справку к BitsTransfer. Там правда говориться в основном о веб, но файлы он качает тоже прекрасно. Возможность работы в отдельном потоке и прогрессбар встроены :)
import-module bitstransfer
get-command -module bitstransfer
man start-bitstransfer -full
Если не рекурсивно: ipmo bitstransfer; start-bitstransfer -soruce c:\src\* -dest d:\dst
Если рекурсивно, то сложнее:
Требования: PowerShell 2.0, BITS 4.0 (http://support.microsoft.com/kb/968929), Vista/2008 и выше (хотя может и на XP будет работать, но не уверен). На 7/2008R2 всё уже в комплекте.
Вызывать например так:
C:\Root\Copy-FileBITS.ps1 c:\src d:\dst -recurse -priority high
Copy-FileBits.ps1:
param ($Source, $Destination, [switch]$Asynchronous, [switch]$Recurse, $Priority="Normal")
Import-Module BitsTransfer -ea 0
$Script:Transfer = $null
function Copy-Directory (
[string] $SourceDirectory,
[string] $DestinationDirectory,
[switch] $recurse
)
{
if (-not (Test-Path $DestinationDirectory -PathType Container)) {
write-Verbose "Creating Directory '$DestinationDirectory'"
New-Item $DestinationDirectory -Type Directory -Force | Out-Null
}
if ($recurse) {
Get-ChildItem $SourceDirectory |
Where-Object {$_.PSIsContainer} |
Foreach-Object {
Copy-Directory $_.FullName (Join-Path $DestinationDirectory ($_.Name)) -recurse
}
}
if ($Script:Transfer)
{
Write-Verbose "Adding files to transfer from'$($SourceDirectory + "\*")' to '$DestinationDirectory'"
Add-BitsFile -BitsJob $Script:Transfer -Source ($SourceDirectory + "\*") -Destination $DestinationDirectory | out-null
}
else
{
Write-Verbose "Starting transfer from '$($SourceDirectory + "\*")' to '$DestinationDirectory'"
$Script:Transfer = Start-BitsTransfer -Source ($SourceDirectory + "\*") -Destination $DestinationDirectory -Priority $Priority -Asynchronous
}
}
copy-directory $Source $Destination -recurse:$Recurse
if ($Asynchronous)
{
$Script:Transfer
}
else
{
$Script:Transfer | Suspend-BitsTransfer | Resume-BitsTransfer -ea 0
}
А почему не Far Manager? Тем паче, что версия 2.0 идёт под открытой лицензией.
P.S. Это ко 2-му посту. »
У FAR`а даже 2.0 (предыдущий не "Опен", но бесплатен для xUSSR) нет ключей для команды копирования, хотя вроде есть сои скрипты и скрипты можно указывать через параметр... а на счет произведения Питера Нортона не знаю ничего - я его давно не видел, но где-то когда-то слышал, что вроде некие действия можно заставить делать через командную строку.
В принципе есть мысль, как реализовать хоть какой-то мониторинг, но могу только толкнуть мысль, а вот реализовывать реально влом - не стоит овчина выделки (на мой взгляд):
Копированием занимается естественно сам батник.
1. Командой dir /b /a /s (или даже /e ) получаем список того, что будет копироваться и подсчитываем общий объем (через %~z_) /кол-во файлов. Команда For /R не годиться из-за игнорирования системных файлов.
2. Со временем самый гимор - придется каждый раз переводить %time% в секунды, а может и в сотые доли секунд. Это тормоза. Время надо засекать перед каждым запуском (start /b xcopy [src] [dst] >log) и отслеживать постепенное увеличение размера копируемого файла * надеюсь он сразу целиком не резервируется на случай незавершенной операции копирования...
3. По текущему размеру и времени можно подсчитать текущую скорость копирования и сделать прогноз окончания.
Как вариант можно отправить на копирование сразу все и следить либо за лог-файлом (но он скорее всего будет пополняться по 4кб или близко к тому) или каждый раз сканируя каталог-получатель.
Приветствие. Хочу сделать для себя bat'ник, который копирует из одной папки в другую с отображением прогрессбара (собственно ради чего тут вся тема и затеяна), но по инструкции Xaegr что-то ничего не выходит:
ipmo bitstransfer; start-bitstransfer -soruce d:\Download\!Vid2CHG\* -dest \\DUNE\DuneHDD_dc4c66d24c66a6cc\!Serials\YT
Или тут не bat'ник нужен и команду надо как-то иначе прописывать? Извиняюсь за тупые вопросы.
Busla, извиняюсь за тупой вопрос, но как тогда правильно эту команду воплотить в исполняемый файл по типу bat?
upd. вроде сделал как в интернетах пишут. Создал bat с кодом:
powershell -file d:\Convert\YT_ch_LVL\move_PS_d-dune.ps1
del /Q d:\Download\Video\
powershell -file d:\Convert\YT_ch_LVL\move_PS_f-dune.ps1
del /Q f:\Download\Video\
Сами ps1 файлы:
move_PS_d-dune.ps1
ipmo bitstransfer; start-bitstransfer -soruce d:\Download\!Vid2CHG\* -dest \\DUNE\DuneHDD_dc4c66d24c66a6cc\!Serials\YT
move_PS_f-dune.ps1
ipmo bitstransfer; start-bitstransfer -soruce f:\Download\!Vid2CHG\* -dest \\DUNE\DuneHDD_dc4c66d24c66a6cc\!Serials\YT
Но ничего не происходит. Кое как сделал скрин:
https://i111.fastpic.ru/big/2020/0415/2d/c7faaec6d8d7bf578e8b6f86ac65532d.png
rider42, напишите имя параметра правильно — не «soruce».
Спасибо. Сделал и заработало.
Только подскажите пожалуйста по принципу работы bat'ника? Копируется исключительно со второй папки, а первую процесс почему-то пропускает. Но если первой строкой пустить пустую, то всё работает как надо:
powershell -file d:\Convert\YT_ch_LVL\move_PS_d-dune.ps1
del /Q d:\Download\Video\
del /Q D:\Download\!Vid2CHG\
powershell -file d:\Convert\YT_ch_LVL\move_PS_f-dune.ps1
del /Q f:\Download\Video\
del /Q F:\Download\!Vid2CHG\
Хотя когда я копирую простым bat'ником, то первую строку пустой делать не надо:
move d:\Download\!Vid2CHG\*.* \\DUNE\DuneHDD_dc4c66d24c66a6cc\!Serials\YT\
del /Q d:\Download\Video\
move f:\Download\!Vid2CHG\*.* \\DUNE\DuneHDD_dc4c66d24c66a6cc\!Serials\YT\
del /Q f:\Download\Video\
И вопрос вдогонку - можно добавить только графический статусбар? Оставшееся время и скорость копирования с именем копируемого файла добавить нельзя?
Приветствие.
Нужна помощь. Вчера при копировании при помощи выше описанных командах этот процесс завис и я просто закрыл окно консоли. Но проблема в том, что такое ощущение, что сам процесс где-то остался в системе и теперь в папке назначения с периодичность где-то час стали появляться tmp файлы, хотя исходная папка пустая. Комп после этого и перезагружался и выключался - и всё-равно tmp файлы всё так же появляются.
Serguei Kouzmine
09-05-2020, 17:50
Ingolder,
http://pyatilistnik.org/robocopy-and-examples-of-use-with-parameters/
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.