2016-04-11 2 views
0

OK, пытаясь скопировать папки и содержимое из UNC-пути (общий диск) в другой UNC-путь (NAS) на основе даты (до 01 января 2015 г.). Да, я знаю, что код говорит 2017, но как только я получу его, работая над тестом, я изменил дату и запустил prod.Переместить папки и содержимое с помощью Powershell

#Original file path 
$path = "UNC Path" 
#Destination file path 
$destination = "Different UNC Path" 
#It makes a filelist of what's inside the $path path 
Foreach($file in (Get-ChildItem $path)) { 
#If the lastwrite time is before the given date 
If($file.LastWriteTime -lt "01/01/2017") { 
#It copies the file to the destination 
Copy-Item -Path $file.fullname -Destination $destination -Force } } 

Он копирует содержимое папок в порядке, но не в папки. Я думаю, что я пропустил -recurse, но поставил его после того, как путь Get-ChildItem $ не работал.

Я планирую эту работу, а затем добавьте строку «Удалить элемент», чтобы удалить все старые элементы с файлового сервера.

Мысли? Предложения о лучших способах достижения этого?

Спасибо,

+1

просто вызвать Robocopy –

ответ

0

Я думаю, вы просто отсутствует -Recurse от Get-ChildItem, но я бы сделал это так:

Get-ChildItem -Path $Path -Recurse ` 
| Where-Object { $_.LastWriteTime -lt '2017-01-01' } ` 
| ForEach-Object { 
    Copy-Item -Path $_.FullName -Destination ($_.FullName.Replace($source,$destination)) -Force; 
} 

Если у вас есть скрытые или системные файлы, копии, Также хочу указать параметр -Force на Get-ChildItem.

На самом деле, возможно, потребуется сделать следующее:

Get-ChildItem -Path $Path -Recurse ` 
| Where-Object { $_.LastWriteTime -lt '2017-01-01' } ` 
| ForEach-Object { 
    if ($_.PSIsContainer -and !(Test-Path($_.FullName.Replace($source,$destination)) { 
     mkdir ($_.FullName.Replace($source,$destination)); 
    } 
    else { 
     Copy-Item -Path $_.FullName -Destination ($_.FullName.Replace($source,$destination)) -Force; 
    } 
} 
+0

Это начало, но две вещи: Это уплощение структуру файла и есть несколько имен файлов, которые слишком долго. Имена файлов, на которые я не занимаюсь, не согласуются, но я бы предпочел не сгладить структуру папок. – tkiuntke

+0

@tkiuntke О, конечно. Я забыл эту часть! См. Мой исправленный код. Если вы слишком долго, вам придется использовать другой инструмент. PowerShell основан на C#, а C# ограничивается .Net Framework и не использует ни одного из длинного имени пути, которое позволяет WinAPI (т. Е. '\\? \ ....'). Вам нужно будет использовать Robocopy или какой-нибудь аналогичный инструмент, который поддерживает имена длинного пути. –

+0

@tkiuntke Я немного удивлен, что он бросает ошибки, если вы используете UNC-пути. Я думал, что они работали. –

Смежные вопросы