2015-01-08 111 views
1

需要一个PowerShell脚本,将文件夹和文件从一个位置移动到另一个位置,然后是旧的x天,但某些文件夹是免费的。需要一个PowerShell脚本,将文件夹和文件从一个位置移动到另一个位置

还需要有能力通过电子邮件发送它移动的文件和文件夹的列表。

我可以移动文件夹中的文件,但我不确定如何移动整个文件夹。

下面是一些代码,到目前为止,我已经把任何建议将是巨大

Set-ExecutionPolicy RemoteSigned 

#----- define parameters -----# 
#----- get current date ----# 
$Now = Get-Date 
#----- define amount of days ----# 
$Days = "7" 
#----- define folder where files are located ----# 
$TargetFolder = "C:\test" 
$TargetPath = "C:\test5" 

#----- define extension ----# 
$Extension = "*.*" 
#----- define LastWriteTime parameter based on $Days ---# 
$LastWrite = $Now.AddDays(-$Days) 

#----Exclusion List ----# 
$exclude [email protected]('test1', 'test2') 


#----- get files based on lastwrite filter and specified folder ---# 
$Files = Get-Childitem -path $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime  -le "$LastWrite"} -and $_Name -ne $exclude | foreach ($_)} #- 


foreach ($File in $Files) 
    { 
    if ($File -ne $NULL) 
     { 
     write-host "Deleting File $File" -ForegroundColor "DarkRed" 
     Move-Item $File.FullName $TargetPath -force 
     } 
    else 
     { 
     Write-Host "No more files to delete!" -foregroundcolor "Green" 
     } 
    } 
+0

你选择基于文件的目录lastwrite时间或你是否需要查看文件夹本身的最后一次写入时间而不考虑内容? – Matt

+0

实际上,文件夹的lastwritetime本身与内容无关。 – user4432997

回答

0

支撑在PowerShell的V3或更高的简写。这将找到所有的文件夹,其中LastWriteTime比7天更旧,并移动它们。

$LastWrite = (Get-Date).AddDays(-7) 
gci c:\temp -Directory -Recurse | ?{$_.LastWriteTime -le $LastWrite} | select -expand fullname | %{Move-Item $_ $TargetPath} 

如果您只是查看文件夹时间以避免逻辑错误,那么文件排除就没有意义。同样的代码,但更易于阅读:

$LastWrite = (Get-Date).AddDays(-7) 
Get-ChildItem $TargetFolder | Where-Object{$_.LastWriteTime -le $LastWrite} | Select-Object -ExpandProperty FullName | ForEach-Object{ 
    Move-Item $_ $TargetPath 
} 

买者

有可能是你在哪里试图移动文件夹和家长可能先前已经被移动的问题。真的没有测试环境来检查现在。为了以防万一,可以在副本之前使用一点测试。

If(Test-Path $_){Move-Item $_ $TargetPath} 

为使用电子邮件电子邮件

的一个起点将是Send-MailMessage。还有其他方法。

文件夹排除

如果你想省略某些文件夹中有一对夫妇的方式来实现这一目标。如果您知道要删除的整个文件夹名称,则可以像您已有的那样添加此$exclude [email protected]('test1', 'test2'),并更改Where子句。

Where-Object{$_.LastWriteTime -le $LastWrite -and $exclude -notcontains $_.Name} 

如果您不知道全名,也许这$exclude只包含你可以这样做的部分名称使用,以及一点点的正则表达式

$exclude [email protected]('test1', 'test2') 
$exclude = "({0})" -f ($exclude -join "|") 

#..... other stuff happens 

Where-Object{$_.LastWriteTime -le $LastWrite -and $_.Name -notmatch $exclude} 
+0

谢谢,我将如何去为某些文件夹添加例外,而不是文件本身。例如,假设我有一个包含20个子文件夹的文件夹,并且我想移动20个文件夹。如何为我不想移动的文件夹添加例外列表? – user4432997

+0

@ user4432997请参阅更新 – Matt

+0

如果文件夹可能已存在于目标中。有没有办法将它设置为覆盖它。目前,如果该文件已存在于目标中,则该文件将失败,并且该文件已存在时无法创建文件。我知道你已经包含该测试If(Test-Path $ _){Move-Item $ _ $ TargetPath},但即使它存在,我也希望它能够继续并覆盖。 – user4432997

相关问题