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

需要将文件夹和文件从一个位置移动到另一个位置的powershell脚本,powershell,directory,Powershell,Directory,需要一个powershell脚本,该脚本将文件夹和文件从一个位置移动到另一个位置,该位置的时间早于x天,但某些文件夹可以免除 还需要能够通过电子邮件发送其移动的文件和文件夹列表 我可以移动文件夹中的文件,但我不知道如何移动整个文件夹 这里是我到目前为止整理的一些代码,任何建议都会很好 Set-ExecutionPolicy RemoteSigned #----- define parameters -----# #----- get current date ----# $Now = Get-

需要一个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"
        }
    }

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}
电子邮件

处理电子邮件的起点是。还有其他方法

文件夹排除

如果您想省略某些文件夹,有几种方法可以实现。如果您知道要省略的整个文件夹名称,可以像已经知道的那样添加此
$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}

您是根据文件的上次写入时间选择目录,还是需要查看文件夹本身的上次写入时间而不考虑其内容?实际上,最好是文件夹的上次写入时间本身而不考虑其内容。谢谢,我将如何为某些文件夹而不是文件本身添加例外。例如,假设我有一个文件夹,其中有20个子文件夹我想保留,还有20个子文件夹我想移动。如何为我不想移动的文件夹添加例外列表?如果目标中可能已经存在该文件夹。有没有一种方法可以将其设置为太多覆盖它。当前,如果该文件已存在于目标位置,则它将失败,并且当该文件已存在时无法创建该文件。我知道如果(测试路径$\{Move Item$\$TargetPath}您已经包含了该测试,但即使它存在,我也希望它能够继续并覆盖。我决定使用复制项,然后删除项,以满足这一需求,这似乎已经奏效。只需要做一点进一步的测试这是当前的代码Get ChildItem$TargetFolder |其中对象{$$\.LastWriteTime-le$LastWrite-和$exclude-notcontains$\.Name}|选择对象-ExpandProperty FullName |为每个对象{write host“在$today上将文件$\\移动到$TargetPath”-ForegroundColor“DarkRed”复制项目$\u$TargetPath-recurse-force删除项目$\ur-force-confirm:$false
Move Item-force
应该像在原始代码中那样解决这个问题。那么这个解决方案对您有效吗?