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

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

Ingolder 09-12-2009 14:17 1290513

мониторинг копирования файлов
 
День добрый :)

Вопрос такой: можно ли написать скриптик, чтобы при копировании файлов он показывал информацию о времени, оставшемся до завершения копирования и сколько процентов скопировано?

а то если пишешь copy ... ... он просто копирует и не ясно - какая скорость, это на пять минут или на пол дня...

NiOl 09-12-2009 14:44 1290535

Слышал, что виндовый Командир Нортон (не знаю, как он сейчас называется по-правильному) поддерживает командную строку. :dont-know

amel27 09-12-2009 16:30 1290647

т.к. все скриптовые языки однопотоковые, то рассчитать скорость, проценты и т.п. можно только между копированием отдельных файлов, поэтому при копировании нескольких больших файлов такая затея теряет смысл... хотя в некоторых случаях (если есть поддержка API, как в AutoIT) для этого удается задействовать системные потоки, по графическому отображению процессов в CMD есть отдельная тема:

CMD/BAT - [решено] Графическая оболочка для CMD (индикатор состояния)

Iska 09-12-2009 16:31 1290649

А почему не Far Manager? Тем паче, что версия 2.0 идёт под открытой лицензией.

P.S. Это ко 2-му посту.

Xaegr 10-12-2009 10:34 1291342

Цитата:

Цитата amel27
т.к. все скриптовые языки однопотоковые »

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

NiOl, нортон командир наверное не будет работать на 64битной винде..
конечно, это всё замечательно, Нортон командир или Фар, но я как-бы скриптик хотел а не софтину.


amel27, спасибо за тему, почитаю, отпишусь.


Xaegr, очень интересно что вы про повершелл :) но ваш скрипт у меня просто копирует и ничего более не происходит, никакого мониторинга... вообще ничего. Очень хочтелось бы и повершельное решение моей проблемы.

amel27 10-12-2009 11:38 1291381

Xaegr, мы немного о разном, Вы - о возможности использовать готовые прогресс-бары сторонней разработки (COM, .NET, DLL, EXE и т.п.), а я - о возможности сваять свой собственный прогресс-бар, в API это обычно делается через определение своей CallBack - функции... Само собой, никто не мешает собрать в VisualStudio свой консольный EXE для копирования и вызывать его из CMD. :)

Xaegr 11-12-2009 10:17 1292302

Цитата:

Цитата amel27
Xaegr, мы немного о разном, Вы - о возможности использовать готовые прогресс-бары сторонней разработки (COM, .NET, DLL, EXE и т.п.), »

Нет. Во первых я не упомянул ни одного компонента сторонней разработки - всё от MS. Во вторых, непонятно почему вы приписываете к сторонним компонентам COM, .NET, DLL? PowerShell сам основан на .NET (причем "насквозь"), и по сути состоит из нескольких .DLL :) Аналогично с VBS ([cw]script.exe, соотв. DLL) и т.д.
Цитата:

Цитата amel27
а я - о возможности сваять свой собственный прогресс-бар, в API это обычно делается через определение своей CallBack - функции... »

Ну во-первых, я честно говоря не вижу пока в условии необходимости использования ни нескольких потоков, ни callback функций. Если вы хотите нарисовать совсем свой бар - write-progress. Ну или $host (чтоб совсем на низком уровне). Но если что, в PS есть возможность использовать и callback кода, и многопоточности.
Цитата:

Цитата Ingolder
но ваш скрипт у меня просто копирует и ничего более не происходит, никакого мониторинга... »

Это второй вариант? Странно, он должен выводить графическое окно копирования файлов, стандартное как в Windows.
Если у вас Vista/2008 и выше, посмотрите справку к BitsTransfer. Там правда говориться в основном о веб, но файлы он качает тоже прекрасно. Возможность работы в отдельном потоке и прогрессбар встроены :)
Код:

import-module bitstransfer
get-command -module bitstransfer
man start-bitstransfer -full


Xaegr 11-12-2009 11:48 1292373

Если не рекурсивно:
Код:

ipmo bitstransfer; start-bitstransfer -soruce c:\src\* -dest d:\dst
Если рекурсивно, то сложнее:

Требования: PowerShell 2.0, BITS 4.0, 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
}


NiOl 11-12-2009 16:01 1292624

Цитата:

Цитата Iska
А почему не 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кб или близко к тому) или каждый раз сканируя каталог-получатель.

rider42 15-04-2020 15:23 2917247

Приветствие. Хочу сделать для себя bat'ник, который копирует из одной папки в другую с отображением прогрессбара (собственно ради чего тут вся тема и затеяна), но по инструкции Xaegr что-то ничего не выходит:
Код:

ipmo bitstransfer; start-bitstransfer -soruce d:\Download\!Vid2CHG\* -dest \\DUNE\DuneHDD_dc4c66d24c66a6cc\!Serials\YT
Или тут не bat'ник нужен и команду надо как-то иначе прописывать? Извиняюсь за тупые вопросы.

Busla 15-04-2020 22:44 2917322

rider42, это PowerShell

rider42 15-04-2020 22:49 2917324

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
Но ничего не происходит. Кое как сделал скрин:

Iska 16-04-2020 11:06 2917386

rider42, напишите имя параметра правильно — не «soruce».

rider42 16-04-2020 12:24 2917417

Спасибо. Сделал и заработало.

Только подскажите пожалуйста по принципу работы 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\

И вопрос вдогонку - можно добавить только графический статусбар? Оставшееся время и скорость копирования с именем копируемого файла добавить нельзя?

rider42 09-05-2020 11:02 2920429

Приветствие.

Нужна помощь. Вчера при копировании при помощи выше описанных командах этот процесс завис и я просто закрыл окно консоли. Но проблема в том, что такое ощущение, что сам процесс где-то остался в системе и теперь в папке назначения с периодичность где-то час стали появляться tmp файлы, хотя исходная папка пустая. Комп после этого и перезагружался и выключался - и всё-равно tmp файлы всё так же появляются.

Serguei Kouzmine 09-05-2020 17:50 2920482

Ingolder,
http://pyatilistnik.org/robocopy-and...th-parameters/


Время: 05:08.

Время: 05:08.
© OSzone.net 2001-2025