Get-Childitem 目录通配符 "Access is denied"
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+
我有一个脚本,可以递归地删除特定目录中的一些文件。问题在于该目录的规范。
当我尝试明确指定它时(即只清除 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+