Скрипт Powershell для резервного копирования папок старше 7 дней - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть папка X: / EmpInfo, которая содержит много разных папок. Каждая из этих папок содержит около 5-10 файлов.

Мне нужно сделать резервную копию папок с датой изменения не более 7 дней назад. То есть изменение означает, что новые файлы были добавлены в папку или существующий файл был изменен.

Пример: если я запусту его сегодня (11/08), он создаст резервную копию всех папок в X: / EmpInfo с датой изменения от 11/01 до текущего времени сегодня (при запуске сценария). Следует переместить всю папку, а не только измененные файлы. Перезаписать любые существующие папки.

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Мой ответ - это комбинация ответов мистера Уоткинса и Эрика Николсона. В своем вопросе вы уточняете, что на самом деле вы хотите скопировать каталоги, в которые были добавлены новые файлы или скопированы существующие файлы. Поведение даты последней модификации для содержащей директории будет отличаться в разных файловых системах:

  • NTFS: в файловой системе NTFS дата изменения папки изменяется, если содержимое папки изменяется.
  • FAT: в файловой системе FAT дата изменения папки не изменяется при изменении содержимого папки.

Описание меток даты и времени NTFS для файлов и папок

Поэтому в идеале мы должны сначала проверить тип файловой системы исходного каталога, прежде чем принять решение о том, как определить, какие каталоги копировать:

function Copy-ModifiedSubdirectory {
  param ($sourcefolder, $destinationfolder, [DateTime] $modifieddate)

  # Escaping source folder for use in wmi query
  $escapedsourcefolder = $sourcefolder -replace "\\","\\"

  # Determine what filesystem our folder is on
  $FSName = (get-wmiobject -query "select FSName from CIM_Directory where name = '$escapedsourcefolder'").FSName

  if ($FSName -eq "NTFS") # The Eric Nicholson way
  {
    $FoldersToCopy = get-childitem $sourcefolder | where {$_.PSIsContainer} | where {$_.LastWriteTime -ge $modifieddate} 
  }
  elseif ($FSName -eq "FAT32") # The MrKWatkins way
  {
    $FoldersToCopy = get-childitem $sourcefolder | where {$_.PSIsContainer} | ? { Get-ChildItem $($_.fullname) -Recurse | ? { $_.LastWriteTime -ge $modifieddate } }
  }
  else 
  {
    Write-Error "Unable to Copy: File System of $sourcefolder is unknown"
  }

  # Actual copy
  $FoldersToCopy | % { copy $_.FullName $destinationfolder -Recurse -Force}
}

Для использования функции:

$sevendaysago = ((get-date).adddays(-7))
copy-modifiedsubdirectory  X:\EmpInfo Y:\Archive $sevendaysago
3 голосов
/ 08 ноября 2011

Возможно, это не «нечто по-настоящему похожее на Perl», но PowerShell справится с этим довольно легко.Это должно помочь вам начать:

$newFolders = dir X:\EmpInfo | ? {$_.PSIsContainer} | ? {$_.LastWriteTime -gt (Get-Date).AddDays(-7)} 
$newFolders | % { copy $_.FullName  c:\temp\archive -Recurse -Force}

Веселитесь с конвейером!

0 голосов
/ 08 ноября 2011

Вот примерный и готовый скрипт для начала работы. Я уверен, что есть и другие способы ...

$sevenDaysAgo = (Get-Date).AddDays(-7);

# Get the directories in X:\EmpInfo.
$directories = Get-ChildItem . | Where-Object { $_.PSIsContainer };

# Loop through the directories.
foreach($directory in $directories)
{
    # Check in the directory for a file within the last seven days.
    if (Get-ChildItem .\UnitTests -Recurse | Where-Object { $_.LastWriteTime -ge $sevenDaysAgo })
    {
        $directory
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...