none
Копирование файлов средствами PS RRS feed

  • Вопрос

  • Добрый день,

    Сделал небольшой инструмент для перемещения всех данных пользователя с одного компьютера на другой, с возможностью отследить прогресс.

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

    $sourcepc = (Read-Host "Имя компьютера источника").ToUpper()
    $destpc = (Read-Host "Имя компьютера назначения").ToUpper()
    [string]$user = (Read-Host "Учетная запись пользователя").ToUpper()

    $path1 = "\\$sourcepc\c$\Users\$user\" $path2 = "\\$destpc\c$\Users\" $getitem1 = Get-ChildItem -Path $path1 -Recurse $getitem2 = Get-ChildItem -Path $path2 -Recurse $getitem1 | ForEach-Object -Begin {$i=0} ` -Process {Copy-Item -Path $path1 -Destination $path2 -Force -verbose;$i=$i+1; Write-Progress -Activity "Upload" -Status "Progress:" -PercentComplete ($i/$getitem1.count*100)} `

    -End {Write-host "[SUCCESS]Desktop has been copied"} $getitem2 | ForEach-Object -Begin {$i=0} ` -Process {Copy-Item -Path $path3 -Destination $path2 -Force -verbose;$i=$i+1; Write-Progress -Activity "Upload" -Status "Progress:" -PercentComplete ($i/$getitem2.count*100)} `

    -End {Write-host "[SUCCESS]Documents has been copied"}

    Read-Host -Prompt "Press Enter to exit"



Ответы

  • и все же robocopy надежнее, так как есть проблема "длинных путей"

    (путей длина которых превышает 255 символов),

    ну да ладно, сейчас у вас еще есть какие-то вопросы?

    • Помечено в качестве ответа Arseniy Volobuev 8 мая 2015 г. 8:25
    Модератор

Все ответы

  • прогрессбар это круто но скорость вы на этом ооочень сильно теряете

    не вижу где у вас определена переменная $path3

    Почему бы просто не взять то что нужно и не скопировать туда куда нужно например при помощи robocopy

    Модератор
  • В общем Вы правы, прогресс бар красиво, но тормозит. Сделал рабочую версию без него в таком виде.

    #_______________ # SET VARIABLES #--------------- $sourcepc = (Read-Host "Имя компьютера источника").ToUpper() $destpc = (Read-Host "Имя компьютера назначения").ToUpper() $user = (Read-Host "Учетная запись пользователя").ToUpper() #______________________________________ # TEST-CONNECTIN TO REMOTE AND DEST PC #-------------------------------------- $checkuser = Get-Item -Path "\\$sourcepc\c$\Users\$user\" -ErrorAction SilentlyContinue |

    Select-Object -ExpandProperty Name $testdestpc = Test-Connection $destpc -Count 1 | Select-Object -ExpandProperty StatusCode $testsourcepc = Test-Connection $sourcepc -Count 1 | Select-Object -ExpandProperty StatusCode $y = "0" if ($checkuser -eq $user) { Write-Host "[SUCCESS]$user folder found on $sourcepc" } Else { Write-Host "[ERROR]$user folder not found on $sourcepc" Read-Host -Prompt "Press Enter to exit" Exit } if ($testsourcepc -ge $y -and $testdestpc -ge $y) { Write-Host "[SUCCESS]$sourcepc and $destpc Ping Succesful" Read-Host -Prompt "Press enter to continue script" } else { Write-Host "[ERROR]$sourcepc or $destpc is unavailable now, try later" Read-Host -Prompt "Press Enter to exit" Exit } #___________________________________ # CHECK FOR BIG FILES AND SHOW LIST #----------------------------------- $findbigfile = Get-ChildItem -Path "\\$sourcepc\c$\Users\$user\Desktop" -Recurse |

    Where-Object {$_.Length -ge 100mb} $exclude = $findbigfile | Select-Object -ExpandProperty name $checkfilesize = $findbigfile | Select-Object -Property name,PSParentPath,@{n='SIZE OF FILES';e={$_.Length / 1mb -as [int]}} if ($checkfilesize.count -gt "0"){ $checkfilesize | Format-Table -AutoSize -wrap Read-Host -Prompt "[WARNING] DETECTED BIG FILES, press enter for continue" } Else { Write-Host "[SUCCESS]BIG FILES NOT FOUND" } #_________________________________________ # COPY FOLDER AND FILES TO DESTINATION PC #----------------------------------------- Copy-Item -Path "\\$sourcepc\c$\Users\$user\Desktop" `

    -Destination "\\$destpc\c$\Users\$user\" `

    -Recurse -Exclude $exclude -Force -Verbose Copy-Item -Path "\\$sourcepc\c$\Users\$user\Documents" `

    -Destination "\\$destpc\c$\Users\$user\" `

    -Recurse -Force -Verbose if (!(Test-Path "\\$destpc\c$\Users\$user\Documents\Файлы Outlook\")) ` {New-Item -Path "\\$destpc\c$\Users\$user\Documents\Файлы Outlook\" `

    -ItemType Directory -Verbose} Copy-Item -Path "\\$sourcepc\c$\Users\$user\AppData\Local\Microsoft\Outlook\*.pst" `

    -Destination "\\$destpc\c$\Users\$user\Documents\Файлы Outlook\" -Force -Verbose Read-Host -Prompt "Press Enter to exit" Exit


  • и все же robocopy надежнее, так как есть проблема "длинных путей"

    (путей длина которых превышает 255 символов),

    ну да ладно, сейчас у вас еще есть какие-то вопросы?

    • Помечено в качестве ответа Arseniy Volobuev 8 мая 2015 г. 8:25
    Модератор
  • Больше вопрос нет, спасибо Вам за наводку на robocopy, будем-с тестировать :-)