【问题标题】:Remove-Item with Recurse and Exclude multiple subdirectories具有递归和排除多个子目录的删除项目
【发布时间】:2019-01-25 03:52:00
【问题描述】:

我正在尝试创建一个脚本来删除文件夹中的所有文件和目录,除了指定文件夹及其内容。

示例树:

测试/ - 图片/ - folder_to_keep/ - 杂项/ - 废话/ - some_other_folder/ - another_to_keep/ - 混乱/

我已经搜索了这个特定的问题,但运气不佳。我试过了:

Remove-Item .\test\* -Exclude (".\test\images\folder_to_keep", ".\test\some_other_folder\another_to_keep") -Recurse

但这仍然会删除所有内容。

仅供参考,如果对任何人有帮助,我正在尝试在 Atlassian Bamboo 服务器上的构建作业中运行此脚本。请参阅:https://confluence.atlassian.com/bamboo0515/script-894237366.html。如果有更好的方法使用他们的选项(Shell、Windows PowerShell、/bin/sh 或 cmd.exe),那也很棒。

编辑:robocopy 也可能是一个选项。基本问题是我需要镜像源路径和目标路径,但是目标中的某些文件夹必须保持不变(它们是从另一个进程中填充的)。

【问题讨论】:

  • get-childitem | select-string -notMatch | remove-item 可以工作吗?
  • 如果指定的文件夹是分散的(不同的深度,有孩子等),首先将指定的文件夹移动到一个新的空文件夹,然后删除剩下的,然后移动新文件夹可能更容易。
  • 感谢您的回复。 Tbh,我对 powershell/windows 命令非常缺乏经验。如果使用其他选项有更简单/更好的方法,我完全赞成。
  • 按照 Paul 的建议使用管道在我看来是最快的方法 - 选择字符串或使用 where-object { $_.Name -notmatch 等

标签: powershell bamboo


【解决方案1】:

-Exclude 仅适用于叶元素,而不适用于完整路径。例如,过滤器-Exclude 'foo' 会从结果列表中删除名为“foo”的文件夹,但不会删除其文件或子文件夹。

在正则表达式中组合要排除的父路径并使用正则表达式(非)匹配。

$excludes = "$($pwd.Path)\test\images\folder_to_keep",
            "$($pwd.Path)\test\some_other_folder\another_to_keep"

$re = ($excludes | ForEach-Object {[regex]::Escape($_)}) -join '|'

Get-ChildItem -Recurse -Force | Where-Object {
    $_.FullName -notmatch "^$re"
} | Remove-Item -Force

【讨论】:

  • 感谢您回复...并格式化我的问题!我会试一试。如果我能正常工作,我会标记为已解决。
  • 好吧,看起来它可以工作,但它使构建过程陷入停顿。也许太多文件无法排序?我可能必须找到不同的解决方案。
  • @ksumarine RelatedAlso related.
  • 话虽如此,不处理文件 (Get-ChildItem -Directory -Recurse -Force) 应该已经大大加快了处理速度。
猜你喜欢
  • 2012-03-16
  • 2014-05-12
  • 2018-10-15
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多