Рекурсивно не удается удалить каталог для отфильтрованного каталога?

Я написал эту команду для удаления определенных каталогов:

Get-ChildItem M:\ -recurse -Directory -Exclude images,record |
  Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-90) } |
  Select-String "\d{8}" |
  Remove-Item -Recurse -WhatIf -ErrorAction Stop

Но я получаю такую ​​ошибку:

Remove-Item : Cannot find path 'C:\delete_old_pics\InputStream' because it does
not exist.
At line:1 char:151
+ ... ring "\d{8}" | Remove-Item -Recurse -WhatIf -ErrorAction Stop
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\delete_old_pics\InputStream:String) [Remove-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

Кто-нибудь, чтобы помочь мне с этим?

Редактировать # 1 (добавить вывод каталога - поиск работает правильно):

M:\S6-Warehouse\20151016
M:\S6-Warehouse\20151017
M:\S6-Warehouse\20151018
M:\S6-Warehouse\20151019
M:\S6-Warehouse\20151020
M:\S6-Warehouse\20151021

Редактировать # 2 Работа с еще одним параметром: | Select -ExpandProperty Line перед | Remove-Item -Force

и с предложением Ансгара


person Kolesar    schedule 19.01.2016    source источник
comment
Какой в ​​этом смысл Select-String "\d{8}"? Он будет возвращать объекты соответствия. Вы ищете папки, в которых всего 8 цифр?   -  person Matt    schedule 19.01.2016
comment
См. Выше, пожалуйста :)   -  person Kolesar    schedule 19.01.2016


Ответы (2)


Select-String работает со всем входным объектом, а не только с путем, и возвращает MatchInfo объект, а не согласованный путь (или входной объект). Я бы предложил расширить фильтр Where-Object вместо использования Select-String:

Get-ChildItem M:\ -Recurse -Directory -Exclude images,record | Where-Object {
  $_.CreationTime -lt (Get-Date).AddDays(-90) -and
  $_.BaseName -match '^\d{8}$'
} | Remove-Item -Recurse -WhatIf -ErrorAction Stop

Как отметил @Matt в своем комментарии, вы можете привязать выражение (_6 _ / _ 7_), чтобы избежать совпадения имен, таких как foo12345678 или 1234567890.

person Ansgar Wiechers    schedule 19.01.2016
comment
Может предложить привязанное совпадение, поскольку оно будет соответствовать папкам, содержащим более восьми символов. - person Matt; 19.01.2016

Вы должны попробовать это для своего запроса:

Get-ChildItem -Path your_absolute_path -Exclude '*.png' |
  Where-Object { $_. LastWriteTime -lt (Get-Date).AddDays(-90) } |
  Select-String "\d{8}" |
  Remove-Item -Recurse -Force -Confirm:$false
person Yogesh K    schedule 19.01.2016
comment
Принудительное или подавление подтверждения не имеет ничего общего с рассматриваемой здесь проблемой. - person Ansgar Wiechers; 19.01.2016