繁体   English   中英

Get-Childitem 目录通配符“访问被拒绝”

[英]Get-Childitem directory wildcard "Access is denied"

我有一个脚本,我在其中递归地删除特定目录中的一些文件。 问题在于该目录的规范。

当我尝试明确指定它时(即只清除 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\*

像魅力一样被清除。

如果您想排除配置文件列表并处理子文件夹列表,也许您可以使用这些方法:

$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
    }
}

注意:语法是 PS3.0+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM