【问题标题】:How to exclude folder with a specific name from deletion from the entire folder tree in Powershell scripting?如何从 Powershell 脚本中的整个文件夹树中删除具有特定名称的文件夹?
【发布时间】:2016-01-09 17:16:25
【问题描述】:

我在远程服务器上运行了 powershell 脚本,这些脚本使用自动任务删除存储在共享驱动器上 30 天以上的文件。我们已从删除中排除了这个具有特定名称的文件夹,该文件夹通常位于共享驱动器的根目录中。但是,在其中一个共享驱动器中,该文件夹位于根级别的下一级,并且有七个这样的子文件夹。我想使用单个脚本从删除所有这些子文件夹中排除具有 特定名称 的此文件夹。有没有办法做到这一点?这是我目前正在使用的脚本-

Get-Item -Path $Delete_Global_Test -Force -exclude $Keep_this_folder,$Keep_this_folder2|Get-ChildItem -Recurse|Where-Object {!$_.PSIsContainer -and $_.CreationTime -lt $regional_limit}|Remove-Item -Recurse -Force -Verbose

【问题讨论】:

    标签: powershell scripting automation


    【解决方案1】:

    如果您知道目录,并且目录名称永远不会更改,为什么不创建一个深入到该目录的辅助路径变量并再次运行脚本?

    因此,如果这对您(您的代码)有用,为什么不创建第二个路径变量(例如 $Delete_Global_Test2),它会深入到更深的目录并在新行上重新运行相同的命令,但使用您的第二个路径变量?

    你的脚本会这样工作:

    Get-Item -Path $Delete_Global_Test -Force -exclude $Keep_this_folder,$Keep_this_folder2|Get-ChildItem -Recurse|Where-Object {!$_.PSIsContainer -and $_.CreationTime -lt $regional_limit}|Remove-Item -Recurse -Force -Verbose
    #Now run again but in a second root path
    Get-Item -Path $Delete_Global_Test2 -Force -exclude $Keep_this_folder,$Keep_this_folder2|Get-ChildItem -Recurse|Where-Object {!$_.PSIsContainer -and $_.CreationTime -lt $regional_limit}|Remove-Item -Recurse -Force -Verbose
    

    您只需要添加 $Delete_Global_Test2 的声明,它与 $Delete_Global_Test 相同,但在原始文件中附加了额外的子目录。

    这对你的目的有用吗?

    【讨论】:

    • 确实有效,这是我心中的第一个解决方案。但是为此,我必须在这七个子目录中提供七个不同的路径和七个删除脚本。我一直在寻找一种方法来排除在所有七个不同子文件夹中具有相同名称的文件夹,只是使用一些命令来排除整个文件夹树中具有特定名称的项目(准确地说是文件夹)。
    • 我不确定我是否了解您的目录组织。你能举一个你的结构的例子吗? “七个这样的子文件夹”是我认为吸引我的部分。此外,这只是一个脚本;你是想说你想把它全部放在一条线上吗?
    【解决方案2】:

    添加 -Exclude "notthisfolder" 将是我的解决方案

    【讨论】:

    • 如您所见,我已经使用了“-exclude $Keep_this_folder,$Keep_this_folder2” 这不会保存具有指定名称的文件夹以防止超出根目录的删除
    • 将 -exclude 添加到“Get-ChildItem - Recurse -Exclude $a,$b”,而不是在适用于我的 Get-Item 中添加它
    • 好的,再试一次。 Get-Item -Path Delete_Global_Test | Get-ChildItem -Exclude $Keep_this_folder,$Keep_this_folder2 -Recurse | Where-Object{$_ -notmatch "\\$Keep_this_folder\\" -and $_ -notmatch "\\$Keep_this_folder2\\" }
    • 基本上,即使在我看来,-exclude 应该在 Get-ChildItem 命令之后工作,但不知何故它失败了,不知道为什么
    • 好吧。我尝试使用子文件夹 A、B 和 C 创建一些文件夹,例如 c:\Test\,其中每个文件夹都有子文件夹和文件,并尝试使用所有子文件夹排除文件夹 A 和 B。为我工作。到目前为止,我不知道为什么它不适合你。但我会密切关注这个问题,因为我真的很好奇解决方案以及为什么它对你不起作用
    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 2012-10-13
    • 2013-04-12
    • 1970-01-01
    • 2011-04-08
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多