递归删除文件夹名称包含数字的文件夹

时间:2018-11-14 14:48:38

标签: arrays powershell

下午好,

我正在尝试删除名称中包含数字的特定位置的文件夹,该数字可以是数组中的任何数字。

my_table

请在下面查看以下文件夹的示例:

  • 18.172.0826.0010
  • 18.172.0826.0010_2
  • 18.172.0826.0015
  • 18.172.0920.0015
  • 18.172.0920.0015_1
  • 日志
  • 设置
  • 设置

如果我改为将“ VersionArray”数组更改为变量“ 18”,它将开始删除文件夹。它似乎并没有遍历数组的每个数字。我需要将其作为数组以确保脚本的未来使用,因为该数字表示OneDrive的版本。

谢谢您的关注。

1 个答案:

答案 0 :(得分:1)

从您最初的想法开始,到子文件夹名称中必须包含的项目列表,我们可以这样做:

$Versionarray = 13..20

Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive" -Recurse | Where-Object {
    $item = $_
    $item -is [System.IO.DirectoryInfo] -and (
        $Versionarray | Where-Object { $item.Name.Contains($_) }
    )
} | Remove-Item -WhatIf

注意:

  • Get-ChildItem返回文件夹中的所有子文件夹和文件。如果不需要,请放下-Recurse
  • Where-Object根据条件过滤任何对象列表。除0,$ false,$ null或空字符串/空列表以外的任何结果都将被视为$ true。只要根本没有返回任何内容,就不必实际返回$true
  • $_是管道中的“当前项目”
  • $foo -is [Fully.Qualified.ClassName]检查对象是否属于某个类。在这种情况下,我们只想查看System.IO.DirectoryInfo objects而忽略所有文件。
  • $Versionarray | Where-Object { $item.Name.Contains($_) }将$ Versionarray过滤到文件夹名称中包含的那些元素。您可以使用.StartsWith().NET strings的任何其他方法代替。
  • 任何“幸存” Where-Object过滤器的对象都传递给Remove-Item
  • -WhatIf执行空转,在确定会发生正确的事情时将其放下。