2017-02-09 26 views
1

У меня есть сценарий, в котором я рекурсивно удаляю несколько наборов файлов в определенном каталоге. Проблема заключается в спецификации этого каталога.Подстановочный шаблон для каталога Get-Childitem «Доступ запрещен»

Когда я пытаюсь указать его явно (т.е. очистить только user1 реж) он работает отлично:

$temp = "C:\Users\user1\AppData\Local\Temp\" 
Get-ChildItem $temp -Recurse -Force -Verbose -ErrorAction SilentlyContinue | remove-item -force -Verbose -recurse -ErrorVariable FailedItems -ErrorAction SilentlyContinue 

Однако, когда я указываю его с групповым символом (то есть влиять на все пользователей на этом компьютере)

$temp = "C:\Users\*\AppData\Local\Temp\*" 
Get-ChildItem $temp -Recurse -Force -Verbose -ErrorAction SilentlyContinue | remove-item -force -Verbose -recurse -ErrorVariable FailedItems -ErrorAction SilentlyContinue 

Он завершается с ошибкой

Get-ChildItem : Access is denied 
At line:7 char:1 
+ Get-ChildItem $localTempDir -Recurse -Force -Verbose -ErrorAction Sil ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : NotSpecified: (:) [Get-ChildItem], UnauthorizedAccessException 
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetChildItemCommand 

Как это могло быть? Это определенно не проблема с разрешениями, потому что это те же реж. И да, я запускаю скрипт с повышенными привилегиями.
Другие источники, указанные в таком формате, например.

C:\Users\*\AppData\Local\Microsoft\Windows\Caches 
C:\Windows\Temp\* 

очищены как очарование.

+0

Привет , не могли ли это быть связаны со специальными/скрытыми/системными папками профиля? например 'По умолчанию' – sodawillow

+0

Может быть. Как диагностировать это? – Suncatcher

+0

Перечислять профили, исключать специальные, применять остальную часть вашей логики? – sodawillow

ответ

1

Может быть, вы могли бы использовать что-то вдоль этих линий, если вы хотите, чтобы исключить список профилей, и обработать список подпапок:

$targets = "AppData\Local\Microsoft\Windows\Caches", 
      "AppData\Local\Microsoft\Windows\Temporary Internet Files" 

$special = @("Default", "Public") 

$profiles = Get-ChildItem "C:\Users" -Directory | 
    Where-Object Name -NotIn $special | 
    Select-Object -ExpandProperty FullName 

$profiles | ForEach-Object { 
    foreach($target in $targets) { 
     $path = Join-Path $_ $target 
     #delete/empty $path 
    } 
} 

NB: синтаксис PS3.0 +

+0

Ну, это работает без ошибок, однако, если я удаляю скрипт 'Public' из' $ special', это влияет и на него. Но если я удалю 'Default', это мусор не будет удалён в любом случае. Зачем? Выполняет ли скрипт только не скрытые (несистемные) dirs? Папка по умолчанию также может содержать много файлов temp, поэтому их следует обрабатывать. – Suncatcher

+0

Я думаю, что '-Force' может помочь здесь с' gci' – sodawillow

+0

Правильно! Работали точно так, как ожидалось. – Suncatcher