需要一个powershell脚本,将文件夹和文件从一个位置移动到另一个位置

时间:2015-01-08 14:18:38

标签: powershell directory

需要一个powershell脚本,它会将文件夹和文件从一个位置移动到另一个位置,这个位置早于x天,但某些文件夹是免除的。

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

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

到目前为止,我已将这些代码放在一起,任何建议都很棒

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 =@('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"
        }
    }

1 个答案:

答案 0 :(得分:0)

PowerShell v3或更高版本支持的速记版本。这将找到7天内LastWriteTime较旧的所有文件夹并移动它们。

$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 =@('test1', 'test2')并更改Where子句。

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

如果您不知道整个名称,并且$exclude只包含部分名称,您也可以使用一点正则表达式

$exclude =@('test1', 'test2')
$exclude = "({0})" -f ($exclude -join "|")

#..... other stuff happens

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