powershell move/delete 目录不包含某些文件夹
powershell move/delete directories not containing certain folders
假设我们有一个包含多个子文件夹的文件夹,在每个子文件夹中都有不同数量的文件夹,这些文件夹以开始日期和结束日期命名。所有文件夹都包含一组不同的 "year folders".
例如:
C:\Test\A050101-20051231
C:\Test\A060101-20061231
C:\Test\A070101-20071231
C:\Test\B140101-20141231
C:\Test\B150101-20151231
C:\Test\B160101-20161231
C:\Test\C090101-20091231
C:\Test\C100101-20101231
C:\Test\C110101-20111231
我需要帮助创建一个 powershell 脚本来搜索这些文件夹,然后移动根文件夹,在这个例子中 "C:\A",它没有从 2009 年到 2016 年的任何年份文件夹。不幸的是我可以'使用时间戳。
尝试从这个开始,但它只会从结果中排除子文件夹。
Get-ChildItem -Depth 1 | ?{ $_.PSIsContainer } | where {$_.name -notlike "2013"}| Select-Object FullName
谢谢
您需要遍历年份并将它们与子文件夹名称进行比较。
您可以在 Where-Object
表达式中执行此操作:
Get-ChildItem -Depth 1 -Directory |Where-Object {
$Subfolders = Get-ChildItem $_.FullName |Select -Expand Name
foreach($year in 2009..2016){
if($Subfolders -contains $year){
return $false
}
}
return $true
}
如果文件夹结构始终相同,这将有效。
Get-ChildItem -Path C:\Test -Directory | Where-Object -FilterScript {
-not (
Get-ChildItem -Path $_.FullName -Directory |
Where-Object -Property Name -In -Value (2009..2016)
)
}
Returns 每个文件夹的文件系统对象,在 2009 年和 2016 年之间没有年份,在最后一个 }
旁边添加 | Remove-Item -Recurse
以删除文件夹。
编辑:
thanks! just noticed the folders are in this format, 20090101-20091231, 20100101-20101231. how do I go about it then?
稍微改了一下。使用 Get-ChildItem
的 Name
参数并切换内部 where 语句的两侧,以便我们可以使用 like
运算符并在名称后附加通配符。 没关系完全错了。只需切换到 FilterScript
即可使用 SubString()
方法。
Get-ChildItem -Path C:\Test -Directory | Where-Object -FilterScript {
-not (
Get-ChildItem -Path $_.FullName -Directory -Name |
Where-Object -FilterScript { $_.SubString(0,4) -in (2009..2016) }
)
}
其他解决方案(PowerShell V5)
Get-ChildItem "c:\test\*" -directory | % {
$currentdir=$_.FullName
$listcurrentdir=gci $currentdir -Directory | % {$_.name.Substring(0, 4)}
2009..2016 | % { if ($_ -notin $listcurrentdir) {[pscustomobject]@{Dir=$currentdir; Year=$_}} }
}
Get-ChildItem "c:\test\*\*" |
select @{N="YearDir";E={[int]$_.Name.substring(0, 4)}} , @{N="ParentDir";E={$_.Parent.fullname}} |
group ParentDir |
%{ $year=$_.Group.YearDir; $dir=$_.Name; 2009..2016 | % { if ($_ -notin $year) {[pscustomobject]@{Dir=$dir;Year=$_}}} }
#explication:
#list dir with date
Get-ChildItem "c:\test\*\*" |
#build lisrt with extract year and parent dir
select @{N="YearDir";E={[int]$_.Name.substring(0, 4)}} , @{N="ParentDir";E={$_.Parent.fullname}} |
#group by parent dir
group ParentDir |
#filter between 2009 and 2016
%{ $year=$_.Group.YearDir; $dir=$_.Name; 2009..2016 | % { if ($_ -notin $year) {[pscustomobject]@{Dir=$dir;Year=$_}}} }
假设我们有一个包含多个子文件夹的文件夹,在每个子文件夹中都有不同数量的文件夹,这些文件夹以开始日期和结束日期命名。所有文件夹都包含一组不同的 "year folders".
例如:
C:\Test\A050101-20051231
C:\Test\A060101-20061231
C:\Test\A070101-20071231
C:\Test\B140101-20141231
C:\Test\B150101-20151231
C:\Test\B160101-20161231
C:\Test\C090101-20091231
C:\Test\C100101-20101231
C:\Test\C110101-20111231
我需要帮助创建一个 powershell 脚本来搜索这些文件夹,然后移动根文件夹,在这个例子中 "C:\A",它没有从 2009 年到 2016 年的任何年份文件夹。不幸的是我可以'使用时间戳。
尝试从这个开始,但它只会从结果中排除子文件夹。
Get-ChildItem -Depth 1 | ?{ $_.PSIsContainer } | where {$_.name -notlike "2013"}| Select-Object FullName
谢谢
您需要遍历年份并将它们与子文件夹名称进行比较。
您可以在 Where-Object
表达式中执行此操作:
Get-ChildItem -Depth 1 -Directory |Where-Object {
$Subfolders = Get-ChildItem $_.FullName |Select -Expand Name
foreach($year in 2009..2016){
if($Subfolders -contains $year){
return $false
}
}
return $true
}
如果文件夹结构始终相同,这将有效。
Get-ChildItem -Path C:\Test -Directory | Where-Object -FilterScript {
-not (
Get-ChildItem -Path $_.FullName -Directory |
Where-Object -Property Name -In -Value (2009..2016)
)
}
Returns 每个文件夹的文件系统对象,在 2009 年和 2016 年之间没有年份,在最后一个 }
旁边添加 | Remove-Item -Recurse
以删除文件夹。
编辑:
thanks! just noticed the folders are in this format, 20090101-20091231, 20100101-20101231. how do I go about it then?
稍微改了一下。使用 没关系完全错了。只需切换到 Get-ChildItem
的 Name
参数并切换内部 where 语句的两侧,以便我们可以使用 like
运算符并在名称后附加通配符。FilterScript
即可使用 SubString()
方法。
Get-ChildItem -Path C:\Test -Directory | Where-Object -FilterScript {
-not (
Get-ChildItem -Path $_.FullName -Directory -Name |
Where-Object -FilterScript { $_.SubString(0,4) -in (2009..2016) }
)
}
其他解决方案(PowerShell V5)
Get-ChildItem "c:\test\*" -directory | % {
$currentdir=$_.FullName
$listcurrentdir=gci $currentdir -Directory | % {$_.name.Substring(0, 4)}
2009..2016 | % { if ($_ -notin $listcurrentdir) {[pscustomobject]@{Dir=$currentdir; Year=$_}} }
}
Get-ChildItem "c:\test\*\*" |
select @{N="YearDir";E={[int]$_.Name.substring(0, 4)}} , @{N="ParentDir";E={$_.Parent.fullname}} |
group ParentDir |
%{ $year=$_.Group.YearDir; $dir=$_.Name; 2009..2016 | % { if ($_ -notin $year) {[pscustomobject]@{Dir=$dir;Year=$_}}} }
#explication:
#list dir with date
Get-ChildItem "c:\test\*\*" |
#build lisrt with extract year and parent dir
select @{N="YearDir";E={[int]$_.Name.substring(0, 4)}} , @{N="ParentDir";E={$_.Parent.fullname}} |
#group by parent dir
group ParentDir |
#filter between 2009 and 2016
%{ $year=$_.Group.YearDir; $dir=$_.Name; 2009..2016 | % { if ($_ -notin $year) {[pscustomobject]@{Dir=$dir;Year=$_}}} }