【问题标题】:Powershell: Recursively delete but exclude non-empty folders with a specific namePowershell:递归删除但排除具有特定名称的非空文件夹
【发布时间】:2015-11-10 22:23:52
【问题描述】:

我已经到处搜索了,但似乎没有什么能完全满足我的需要..

我有一个这样的文件夹结构:

  • C:\Test\Job1\attachments\
  • C:\Test\Job2\attachments\
  • C:\Test\Job3\attachments\

我想删除 C:\Test 中的所有文件和文件夹(但不是 C:\Test 本身)如果它们的附件文件夹是空的。非空附件目录应单独保留。应删除所有其他文件和文件夹。

因此,如果上述路径中的唯一文件是 C:\Test\Job2\attachments\test.txt,那么在我的脚本之后剩下的唯一文件夹就是 C:\Test\Job2\attachments。 Job1 和 Job3 目录将被删除。

  1. 为了让事情顺利进行,我已经尝试过这样做,以便删除除附件文件夹之外的所有内容:

    $TargetFolder = "C:\Test\*" get-childitem $TargetFolder -exclude attachments* -recurse | remove-item -WhatIf

...但它似乎完全忽略了 -exclude 标志

  1. 这有点用,但它提示我需要对它说“不”才能正常工作:

    Get-ChildItem -Path $TargetFolder -Recurse | Select -ExpandProperty FullName | Where {$_ -notlike $TargetFolder + "*\attachments\*.*"} | sort length -Descending | Remove-Item -Force

...如果是与-Force相反的东西,那就太好了

【问题讨论】:

    标签: powershell-3.0 administration


    【解决方案1】:

    如果您只需要它为您选择“否”,您是否尝试使用标志Remove-Item -Confirm:$False?另外,试试Remove-Item -Force -Recurse 看看是否有帮助。

    【讨论】:

      【解决方案2】:

      您无法对管道进行故障排除。

      试试这个方法,如果你愿意,可以重新设计成管道。

      $TargetFolder = "C:\Test\*"
      
      $FoldersInTargetFolder = Get-ChildItem -Path $TargetFolder | Where {$_.psIsContainer -eq $true} 
      
      ForEach ($folder in $FoldersInTargetFolder) {
          [STRING]$AttachmentsFolder = "$($folder.FullName)\attachments"
          $AttachF = Get-item $AttachmentsFolder
      
          If ($AttachF.EnumerateFileSystemInfos() | select -First 1) {
              #Found files and/or Folder in \attachments\
              Remove-Item -Path $folder.FullName -Force
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-08
        • 1970-01-01
        • 2012-11-19
        • 2012-11-29
        • 2018-11-13
        • 1970-01-01
        • 2012-10-13
        • 2019-05-28
        • 2015-04-22
        相关资源
        最近更新 更多