PowerShell - Перемещение определенного c расширения в папку года / месяца / расширения? - PullRequest
0 голосов
/ 27 мая 2020

У меня старый внешний диск (F :) с множеством папок и файлов внутри. Я хочу переместить все файлы на новый диск (G :).

Будет ли возможно достичь приведенной ниже структуры?

«Год \ Месяц \ по расширению» Он может использовать исходная дата создания ..

Итак, если у меня есть «Picture.jpg» из 15/01/2020 и, если у меня есть «Document.doc» из 15/01/2020, тогда оно должно go на:

G:\2020\01\JPG\Picture.jpg
G:\2020\01\DOC\Document.doc

И так далее?

Я попробовал следующее, и он смог переместиться в папку года и папку месяца, хотя я заметил, что имя папки месяца для января было 1 вместо из 01:

https://www.thomasmaurer.ch/2015/03/move-files-to-folder-sorted-by-year-and-month-with-powershell/

Любая помощь будет принята с благодарностью, большое спасибо.

-

Большое спасибо за помощь, он работает очень хорошо, и я смог легко скопировать все файлы.

Я смотрел данные, кажется, с помощью Copy, он перезаписывает, если есть два файла с одинаковым именем файла, поэтому я настроил команду копирования, чтобы переместить вместо этого. Некоторые другие изменения, которые я внес в пункт назначения: расширение \ год \ месяц формат:

# Get all files
Get-ChildItem F:\ -File -Recurse | ForEach-Object {
# Get the modified date
$dt = Get-Date $_.LastWriteTime
$year = $dt.Year
$month = $dt.Month

# This adds "0" in front of the 1-9 months
if($dt.Month -lt 10) {
$month = "0" + $dt.Month.ToString() 
} else {
$month = $dt.Month
}

# Remove leading '.' from the extension
$extension = $_.Extension.Replace(".", "")

# Where we want to move the file
$destinationFolder = "G:\$extension\$year\$month\"

# Ensure full folder path exists
if(!(Test-Path $destinationFolder)) {
New-Item -ItemType Directory -Force -Path $destinationFolder
}

# Copy/Move the item to it's new home
Move-Item $_.FullName $destinationFolder
}

Этот код пока замечательный, если можно добавить следующее - он будет полным:

Если "Picture.jpg" уже существует в папке назначения, можно ли его добавить, например, как "Picture_1.jpg, чтобы при просмотре я мог проверить, действительно ли это дубликат? Большое спасибо.

1 Ответ

1 голос
/ 27 мая 2020

Это может быть достигнуто довольно просто с помощью Get-ChildItem

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7

# Get all files
Get-ChildItem F:\ -File -Recurse | ForEach-Object {
  # Get the creation date
  $dt = Get-Date $_.CreationTime
  $year = $dt.Year
  $month = $dt.Month

  # Remove leading '.' from the extension
  $extenstion = $_.Extension.Replace(".", "")

  # Where we want to move the file
  $destinationFolder = "G:\$year\$month\$extension\ "

  # Ensure full folder path exists
  if(!(Test-Path $destinationFolder)) {
    New-Item -ItemType Directory -Force -Path $destinationFolder 
  }

  # Copy the item to it's new home
  Copy-Item $_.FullName $destinationFolder
}

Обратите внимание, что пробел в конце переменной $destinationFolder равен просто потому, что Stack Overflow без него отобразит остальную часть кода в виде красной строки. Удалите его в своей реализации.

Кроме того, если вам нужен ведущий 0 для одного di git месяцев, вы можете сделать что-то вроде:

if($dt.Month -lt 10) {
  $month = "0" + $dt.Month.ToString() 
} else {
  $month = $dt.Month
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...