Powershell:递归删除但排除具有特定名称的非空文件夹

时间:2015-11-10 22:23:52

标签: powershell-v3.0 administration

我已经搜遍了所有人,但似乎没有什么能完全符合我的需要......

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

  • C:\测试\作业1 \附件\
  • C:\测试\作业2 \附件\
  • C:\测试\ JOB3 \附件\

我想删除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

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

    1. 这种方法很有用,但它让我提示我需要说“不”#39;为了让它正常工作:

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

    2. ......如果这是与--Force

      相反的事情会很棒

2 个答案:

答案 0 :(得分:0)

如果您只需要选择"否"对你来说,你是否尝试使用旗帜Remove-Item -Confirm:$False?另外,请尝试Remove-Item -Force -Recurse并查看是否有帮助。

答案 1 :(得分:0)

您无法对管道进行问题排查。

尝试这种方式,如果愿意,可以重新加入管道。

$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
    }
}