powershell移动/删除不包含某些文件夹的目录

时间:2016-12-21 00:32:56

标签: powershell move directory

假设我们有一个包含多个子文件夹的文件夹,在每个子文件夹中都有不同数量的文件夹,这些文件夹以年份开始和结束日期命名。所有文件夹都包含一组不同的“年份文件夹”。

例如:
C:\测试\ A \ 20050101-20051231
C:\测试\ A \ 20060101-20061231
C:\测试\ A \ 20070101-20071231
C:\测试\ B \ 20140101-20141231
C:\测试\ B \ 20150101-20151231
C:\测试\ B \ 20160101-20161231
C:\测试\ C \ 20090101-20091231
C:\测试\ C \ 20100101-20101231
C:\测试\ C \ 20110101-20111231

我需要帮助创建一个PowerShell脚本,搜索这些文件夹然后移动根文件夹,在本例中为“C:\ A”,从2009年到2016年没有任何年份文件夹。不幸的是我可以'使用时间戳。

试着用这个开头,但它只是从结果中排除子文件夹。

Get-ChildItem -Depth 1 | ?{ $_.PSIsContainer } | where {$_.name -notlike "2013"}|  Select-Object FullName

由于

4 个答案:

答案 0 :(得分:1)

您需要循环使用这些年并将它们与子文件夹名称进行比较。

您可以在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
}

答案 1 :(得分:1)

如果文件夹结构始终相同,这将起作用。

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-20091231,20100101-20101231。那怎么办呢?

稍微改了一下。使用Name的{​​{1}}参数并切换内部where语句的边,这样我们就可以使用Get-ChildItem运算符并在名称后附加一个通配符。没关系各种各样的错误。只需切换到like即可使用FilterScript方法。

SubString()

答案 2 :(得分:0)

其他解决方案(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=$_}} }
}

答案 3 :(得分:0)

  $cat_args = array(
                      'parent'  => 0,
                      'hide_empty' => 0,
                      'order'    => 'ASC',
                   );
    $categories = get_categories($cat_args);
    foreach($categories as $category){
       echo get_cat_name($category->term_id); 
    }