powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Windows [игнор отключен] [закрыт для гостей] / как копировать файлы порционно (например, по три) через powershell
10 сообщений из 10, страница 1 из 1
как копировать файлы порционно (например, по три) через powershell
    #40053792
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Стоит задача, переместить 20 файлов *.bak с одной машины на другую. Дело в том, что при перемещении есть ограничение, на объём передаваемых файлов (файл должен быть не больше 1000 мб, за один раз перемещения нельзя превышать объём в 3ГБ). Каждый мой *.bak весит ~900 мб. Задумка такая, чтобы написать powershell скрипт, который будет класть 3 файла *.back , дождётся, когда они переместятся, потом следующие три файла и т.д., пока не переместятся все 20. в powershell не силён, прошу помощи:

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#папка из которой берём бекапы:
$s = get-childitem D:\Sql_backup\ -recurse '*.bak' 
$s.length

#папка в которую кладём бекапы (порционно, по 3 штуки):
$w = get-childitem D:\Temp2\ -recurse '*.bak'
$w.length


FOR ([int]$TestVar = 1; $TestVar -lt 21;$TestVar++){       
  WHILE ($w.length -lt 4){
       FOREACH ($var In $s){           
           IF ($var.name -match "$TestVar") { #копирую по 1 бекапу в зависимости от имени, отбирая через регулярку
                           Copy-Item -Path D:\Sql_backup\$var -Destination D:\Temp2 
            }
       }
   }
}



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

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40053848
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail__174,

сказка о тройке.

осталось непонятным, почему нельзя последовательно скопировать по одному .bak файлу, имеющего размер 900mb, все 20 файлов?
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40053861
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
cls
[Array]$data=@(1..20)
[Int]$size=3
for([Int]$i=1;$i -le [Math]::Ceiling($data.Length/$size);$i++)
{
"pack: $i"
$data[(($i-1)*$size)..(($i*$size)-1)]
}
Remove-Variable * -ea 0
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40053877
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это ежедневные полные бэкапы одних и тех же БД, то можно посмотреть в сторону rsync
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40053995
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv, спасибо за идею!

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

Объясню: копирование происходит складыванием файлов в определённую папку, в которую если положишь больше, чем дозволено, то копирования не будет :-) Флагом окончания копирования будет то событие, что файлы из папки пропали, которые мы в эту папку положили.

Сделал на Вашей основе такой код:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
#папка в которую кладём бекапы :
$data = get-childitem D:\Temp2\ -recurse '*.bak'
$data.length
for([Int]$i=1;$i -le [Math]::Ceiling($data.Length/$size);$i++){
"pack: $i"
    While ($data.length -lt 3) {
    copy-item -path <папка из которой берем бекапы> $data[(($i-1)*$size)..(($i*$size)-1)] - Destination D:\Temp2\
    }
}



И получается какая то фигня :-)
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40054111
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail__174
копирование происходит складыванием файлов в определённую папку, в которую если положишь больше, чем дозволено, то копирования не будет :-) Флагом окончания копирования будет то событие, что файлы из папки пропали, которые мы в эту папку положили.

Файлы удаляются по мере копирования, или все сразу по завершении копирования?

А то тупо мониторим папку, и если там файлов меньше трёх - копируем в неё ещё один...
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40054117
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

Файлы удаляются по мере копирования, или все сразу по завершении копирования?

По мере копирования

Akina
А то тупо мониторим папку, и если там файлов меньше трёх - копируем в неё ещё один...

Прошу прощения, но не получается реализовать такой "тупой" сценарий. Не могу сделать так, чтобы Powershell "отпустил" уже три скопированных файла, он их бесконечно обновляет. А если и удаётся их удалить (в промежутках между обновлениями) , то копируются те же самые файлы, которые я только что удалил
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40054190
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: powershell
1.
2.
3.
4.
5.
6.
7.
Get-ChildItem .\SourceDir -r |
ForEach-Object {$i = 0} {New-Object psobject -p @{index=$i++; file=$_.FullName}} |
Group-Object -p { [Math]::Floor($_.index / 3) } |
ForEach-Object {
    $_.Group | Select-Object -exp file | Copy-Item -d .\DestDir
    while(Test-Path .\DestDir\*) {Start-Sleep -Seconds 3}
}
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40054272
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, спасибо, Ваше решение красивое, с Вашего позволения выложу и своё ))
...
Рейтинг: 0 / 0
как копировать файлы порционно (например, по три) через powershell
    #40054274
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, алгоритм такой (за идею спасибо vikkiv ):

Копируем по одному файлу, если файлов в папке больше чем 3, зацикливаем внутренний цикл, пока файлов не станет 2, затем докладываем ещё 1 и так до конца коллекции.
Раньше я писал, что powershell блокирует файлы, а потом при удалении, начинает копировать те же файлы, которые были удалены - это вылечилось после отладки кода: я неправильно смотрел на количество файлов в папке:

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#папка с бекапами
$s = get-childitem D:\Sql_backup\ -recurse '*.bak'

[Int]$size=1

for([Int]$i=1;$i -le [Math]::Ceiling($s.Length/$size);$i++){
    IF ((get-childitem D:\Temp2\ -recurse '*.bak').Count -lt 3) {
         copy-item -path   $s[(($i-1)*$size)..(($i*$size)-1)] -Destination D:\Temp2  
             }
    ELSE {WHILE (((get-childitem D:\Temp2\ -recurse '*.bak').Count -eq 3)) {continue} 
                          copy-item -path   $s[(($i-1)*$size)..(($i*$size)-1)] -Destination D:\Temp2 }  
}
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Windows [игнор отключен] [закрыт для гостей] / как копировать файлы порционно (например, по три) через powershell
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]