Переместить файлы старше 31 дня на другой диск

Function Move {
  #Moves all files older than 31 days old from the Source folder to the Target 
  Get-Childitem -Path "E:\source" | Where-Object { $_.LastWriteTime -lt (get-date).AddDays(-31)} |
  ForEach {
    Move-Item $_.FullName -destination "F:\target" -force -ErrorAction:SilentlyContinue
  }
}

в исходном каталоге лежат файлы старше 2-3 лет, но при запуске скрипта ничего не перемещается в целевой каталог?! что случилось ?


person Maurizio Schmidt    schedule 06.05.2011    source источник
comment
Если вы уберете ErrorAction, он выдаст какие-либо ошибки?   -  person Matthew Steeples    schedule 06.05.2011
comment
Ваши файлы находятся именно в E:\source или в его подкаталогах? В последнем случае используйте Get-Childitem -Recurse   -  person Roman Kuzmin    schedule 06.05.2011
comment
К вашему сведению, это не будет перемещать файлы в подкаталогах.   -  person JasonMArcher    schedule 06.05.2011
comment
Предлагаю использовать в скрипте команду robocopy с флагами /mov и /minage:.   -  person CB.    schedule 06.05.2011


Ответы (2)


Я не знаю, имеет ли это большое значение, но вместо $. это должно быть $_.

Я попробовал этот скрипт, и он отлично работает для меня:

get-childitem -Path "E:\source" |
    where-object {$_.LastWriteTime -lt (get-date).AddDays(-31)} | 
    move-item -destination "F:\target"

Обратите внимание, что вам не нужен цикл foreach, потому что объекты будут «перенаправлены» в команду перемещения элемента.

person Matthew Steeples    schedule 06.05.2011
comment
get-currentitem вы имеете в виду Get-Childitem ? - person JPBlanc; 06.05.2011
comment
почему у меня не работает... очень странно. я думал о foreach, чтобы избежать проблем, потому что у нас есть файлы 20k+ в некоторых каталогах.... - person Maurizio Schmidt; 06.05.2011
comment
@JPBlanc: Большое спасибо, да, я имею в виду get-childitem. Я привык писать gci. Обновил мой пост - person Matthew Steeples; 07.05.2011
comment
@Maurizio Schmidt: Если у вас есть файлы в подпапках, это не сработает. Вам нужно будет использовать флаг -Recurse для get-childitem, и, кроме того, вам нужно будет решить, как перейти в нужную папку в пунктах назначения. - person Matthew Steeples; 07.05.2011
comment
@ Мэтью: Теперь все работает отлично, спасибо. я думал, что foreach и т. д. необходимы, чтобы избежать проблем с потреблением памяти, вызванных тем фактом, что в некоторых каталогах у нас более 30 000 файлов. - person Maurizio Schmidt; 09.05.2011
comment
@Maurizio Schmidt: я не знаю, каковы будут ограничения для памяти, но если у вас слишком много файлов, я думаю, вы столкнетесь с проблемой метода get-childitem (поскольку он загрузит их все до начинать с). - person Matthew Steeples; 10.05.2011

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

person Matias    schedule 06.06.2012