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},效果很好。从这里的回答中学到了很多。谢谢