Powershell脚本备份超过7天的文件夹



我有一个包含许多不同文件夹的文件夹X:/EmpInfo。每个文件夹大约包含5-10个文件。

我需要备份修改日期小于7天的文件夹。也就是说,修改意味着将新文件添加到文件夹中,或者修改了现有文件。

示例:如果我今天(11/08)运行它,它将备份X:/EmpInfo中所有的文件夹,修改日期为11/01到今天的当前时间(当脚本运行时)。它应该移动整个文件夹,而不仅仅是修改后的文件。覆盖所有现有文件夹

它可能不是"像Perl那样真正的东西",但是PowerShell可以很容易地处理它。这应该可以让你开始:

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

享受管道的乐趣!

我的回答综合了kwatkins先生和Eric Nicholson先生的回答。在您的问题中,您澄清了您实际想要复制的是添加新文件或复制现有文件的目录。包含目录的最后修改日期的行为在不同的文件系统上是不同的:

  • 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

这是一个粗略的脚本,可以让您开始。我相信有更好的方法来解决这些问题……

$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
    }
}

最新更新