Рекурсивно удалять папки, в имени которых содержится номер - PullRequest
0 голосов
/ 14 ноября 2018

Добрый день всем,

Я пытаюсь удалить папки в определенном месте, содержащем номер в имени, который может быть любым числом в массиве.

$fso = New-Object -com "Scripting.FileSystemObject"
$Versionarray = (13..20)
$folder = 
$fso.GetFolder("$env:USERPROFILE\appdata\local\Microsoft\OneDrive")

    foreach ($subfolder in $folder.SubFolders)
    {
    If ($subfolder.Name -match "$Versionarray")
    {
        remove-item $subfolder.Path -Verbose
    }    
}

Пожалуйста, смотритеНиже приведен пример следующих папок:

  • 18.172.0826.0010
  • 18.172.0826.0010_2
  • 18.172.0826.0015
  • 18.172.0920.0015
  • 18.172.0920.0015_1
  • журналы
  • настройки
  • setup

Если я изменю массив «VersionArray»вместо переменной «18» он начнет удалять папки.Кажется, он не проходит через каждый номер массива.Мне нужно, чтобы это был массив для будущего сценария, так как число представляет версию OneDrive.

Спасибо за просмотр.

1 Ответ

0 голосов
/ 14 ноября 2018

Исходя из вашей первоначальной идеи иметь список элементов, которые должны содержаться в имени подпапки, мы можем сделать конвейер следующим образом:

$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 объектов и игнорировать все файлы.
  • $Versionarray | Where-Object { $item.Name.Contains($_) } фильтрует массив $ Versionarray по тем элементам, которые содержатся в имени папки. Вы можете использовать .StartsWith() или любой другой метод .NET строк вместо него.
  • Любой объект, «выживший» из фильтра Where-Object, передается в Remove-Item
  • -WhatIf выполняет пробный прогон, бросайте его, когда вы уверены, что произойдет нужное.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...