需要一个 powershell 脚本,将文件夹和文件从一个位置移动到另一个位置
Need a powershell script that will moved folders and files from a location to another location
需要一个 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 或更高版本支持的 shorthand 版本。这将找到 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 =@('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}
需要一个 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 或更高版本支持的 shorthand 版本。这将找到 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 =@('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}