我有一个文件夹X:/ EmpInfo,其中包含许多不同的文件夹。每个文件夹包含大约5-10个文件。
我需要备份修改日期比7天前更新的文件夹。也就是说,修改意味着将新文件添加到文件夹或修改现有文件。
示例:如果我今天(11/08)运行它,它将备份X:/ EmpInfo中的所有文件夹,修改日期为11/01到今天的当前时间(运行脚本时)。它应该移动整个文件夹,而不仅仅是修改过的文件。覆盖任何现有文件夹。
答案 0 :(得分:3)
它可能不是“像Perl一样真实的东西”,但PowerShell可以很容易地处理它。这应该让你开始:
$newFolders = dir X:\EmpInfo | ? {$_.PSIsContainer} | ? {$_.LastWriteTime -gt (Get-Date).AddDays(-7)}
$newFolders | % { copy $_.FullName c:\temp\archive -Recurse -Force}
享受管道乐趣!
答案 1 :(得分:3)
我的回答是MrKWatkins和Eric Nicholson的答案。在您的问题中,您澄清了您真正想要的是复制添加了新文件或复制现有文件的目录。包含目录的最后修改日期的行为在不同的文件系统上会有所不同:
Description of NTFS date and time stamps for files and folders
因此,理想情况下,在决定如何确定要复制的目录之前,我们应首先测试源目录的文件系统类型:
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
答案 2 :(得分:0)
这是一个粗略的准备好的脚本,可以帮助您入门。我相信有很多方法可以解决这个问题......
$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
}
}