powershell移动/删除不包含特定文件夹的目录
假设我们有一个包含多个子文件夹的文件夹,在每个子文件夹中有不同数量的文件夹,以年份开始和结束日期命名。所有文件夹都包含一组不同的“年份文件夹” 例如:powershell移动/删除不包含特定文件夹的目录,powershell,move,directory,Powershell,Move,Directory,假设我们有一个包含多个子文件夹的文件夹,在每个子文件夹中有不同数量的文件夹,以年份开始和结束日期命名。所有文件夹都包含一组不同的“年份文件夹” 例如: C:\Test\A\20050101-20051231 C:\Test\A\20060101-20061231 C:\Test\A\20070101-20071231 C:\Test\B\20140101-20141231 C:\Test\B\20150101-20151231 C:\Test\B\20160101-20161231 C:\Tes
C:\Test\A\20050101-20051231
C:\Test\A\20060101-20061231
C:\Test\A\20070101-20071231
C:\Test\B\20140101-20141231
C:\Test\B\20150101-20151231
C:\Test\B\20160101-20161231
C:\Test\C\20090101-20091231
C:\Test\C\20100101-20101231
C:\Test\C\20110101-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
}
您需要循环这些年,并将它们与子文件夹名称进行比较 可以在
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)
)
}
为2009年到2016年之间没有年份的每个文件夹返回一个文件系统对象,在最后一个}
旁边添加| Remove Item-Recurse
,以删除文件夹
编辑:
谢谢!刚刚注意到文件夹的格式是20090101-2009123120100101-20101231。那我该怎么办呢 把它改大一点。使用
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) }
)
}
如果文件夹结构始终相同,这将起作用
Get-ChildItem -Path C:\Test -Directory | Where-Object -FilterScript {
-not (
Get-ChildItem -Path $_.FullName -Directory |
Where-Object -Property Name -In -Value (2009..2016)
)
}
为2009年到2016年之间没有年份的每个文件夹返回一个文件系统对象,在最后一个}
旁边添加| Remove Item-Recurse
,以删除文件夹
编辑:
谢谢!刚刚注意到文件夹的格式是20090101-2009123120100101-20101231。那我该怎么办呢 把它改大一点。使用
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)
其他解决方案(PowerShell V5)
谢谢刚刚注意到文件夹的格式是20090101-2009123120100101-20101231。那么我该怎么做呢?将
|ForEach Object{$\子字符串(0,4)}
添加到$子文件夹=
pipelineGet ChildItem-目录|其中Object{$Subfolders=Get ChildItem$\全名|选择-展开名称| ForEach Object{$\子字符串(0,4)}ForEach($year in 2009..2016){if($Subfolders-包含$year){return$false}}return$true}只需要找出从ResultHanks中移动/删除文件夹的最佳方法!刚刚注意到文件夹是这种格式的,20090101-20091231,20100101-20101231。那么我该怎么做呢?添加| ForEach对象{$\子字符串(0,4)}
到$Subfolders=
pipelineGet ChildItem-Directory |其中Object{$Subfolders=Get ChildItem$.FullName | Select-Expand-Name | ForEach Object{$\子字符串(0,4)}ForEach($year in 2009..2016){if($Subfolders-包含$year){return$false}return$true}只需要找出从ResultHanks中移动/删除文件夹的最佳方法,在我修改了子文件夹的名称之后?谢谢,我列出了所有文件夹,不仅是不包含2009-2016年年度文件夹的文件夹,所以出于某种原因,过滤器不起作用。是的,这是我的错,没有测试。试试新的。很好,只是添加了| Move-Item-Destination C:\temp\Data after},它工作得很好。从这里的回答中学到了很多。谢谢谢谢,在我修改了子文件夹的名称之后?谢谢,我列出了所有文件夹,而不仅仅是不包含2009-2016年年度文件夹的文件夹,所以出于某种原因,过滤器无法工作。是的,这是我的错,没有测试。试试新的。很好,刚刚添加了| Move Item-Destination C:\temp\Data after},效果很好。从这里的回答中学到了很多。谢谢