Преместете файлове, по-стари от 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
FYI, това няма да премества файлове в поддиректории.   -  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