Copy-Item без исходного каталога - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь отразить несколько папок для простой системы резервного копирования.

Допустим, у меня есть следующая файловая структура:

c:\temp\a.txt
c:\temp\b.txt
c:\temp\sub\a.txt
c:\temp\sub\112233.txt
c:\temp\sub2\pictureofaduck.jpg

Моя цель - скопировать весь контентиз c: \ temp \ в новое место назначения (D: \ mybackup), например:

d:\mybackup\a.txt
d:\mybackup\b.txt
d:\mybackup\sub\a.txt
d:\mybackup\sub\112233.txt
d:\mybackup\sub2\pictureofaduck.jpg

Я ошибочно предположил, что это должно быть простой задачей для Copy-Item с использованием этой строки:

Copy-Item 'C:\temp\' -Destination 'D:\mybackup\' -Recurse

вопреки моим ожиданиям, Copy-Item действительно хочет сохранить эту временную папку в игре.потому что какие бы подстановочные знаки и -конечные комбинации я ни пробовал, я либо получаю следующий результат, либо скопированы только два файла a.txt & b.txt.

d:\mybackup\temp\a.txt
d:\mybackup\temp\b.txt
d:\mybackup\temp\sub\123.txt
d:\mybackup\temp\sub\112233.txt
d:\mybackup\temp\sub2\pictureofaduck.jpg

Пожалуйста, помогите мне, это смешно.PS Решение в этом вопросе здесь не работает - был там.Я получаю только корневые файлы: Копирование всей структуры папок в Powershell без повторного создания корневой папки

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Я нашел ответ благодаря вкладу @Avshalom.Я написал себе небольшую функцию для будущего использования:

function myCopyFolder([string] $sourceFolder, [string] $destFolder) {
    $i = 0
    Get-ChildItem $sourceFolder -Recurse | % {
        $destName = $_.FullName
        $destName = $destName.Replace($sourceFolder, '')
        Write-Host $_.FullName -Destination (Join-Path $destFolder $destName)
        $i = $i + 1
    }
    write-host $i 'files' copied
}

, теперь я получаю полную копию, как это сделал бы xcopy.Я также попытался реализовать фильтры, но с ними мне пришлось бы искать способ отдельно копировать папки, если это необходимо.- Он делает то, что я искал.

я добавил фильтрацию по типу файла: (пустые папки не будут скопированы с фильтром)

function myCopyFolder([string] $sourceFolder, [string] $destFolder, [string] $filter) {
    $i = 0
    Get-ChildItem $sourceFolder -Recurse -Filter $filter | % {
        $destName = $_.FullName
        $destName = $destName.Replace($sourceFolder, '')
        $subFolder = $destName.Replace($_.Name, '').Replace('\','')
        if ($subFolder -ne '') {
            if (-not (Test-Path (Join-Path $destFolder $subFolder))) {
                mkdir (Join-Path $destFolder $subFolder)
            }
        }
        Copy-Item $_.FullName -Destination (Join-Path $destFolder $destName)
        $i = $i + 1
    }
    write-host $i 'files' copied
}
0 голосов
/ 13 июня 2018

Другой обходной путь может заключаться в использовании Copy-Item, за которым следует Move-Item

Copy-Item 'C:\temp\' -Destination 'D:\' -Recurse
Move-Item 'D:\temp\' -Destination 'D:\mybackup'

. Здесь есть предостережения о том, что

  • D:\temp еще не существует.Если это произойдет, вы перестанете перезаписывать / перемещать другие файлы
  • D:\mybackup еще не существует
0 голосов
/ 13 июня 2018

Я действительно предпочитаю Xcopy или RoboCopy для этих заданий, но если вы действительно хотите использовать Copy-Item:

Get-ChildItem C:\temp -Recurse | % {Copy-Item $_.FullName D:\mybackup}

с использованием Xcopy:

xcopy C:\temp D:\mybackup /e

с использованием RoboCopy:

robocopy C:\temp D:\mybackup /e
...