我编写了一个PowerShell脚本,以删除指定根路径下所有文件的R/H/S属性。相关代码如下:
$Mask = [System.IO.FileAttributes]::ReadOnly.Value__ -bor [System.IO.FileAttributes]::Hidden.Value__ -bor [System.IO.FileAttributes]::System.Value__
Get-ChildItem -Path $Paths -Force -Recurse -ErrorAction SilentlyContinue | ForEach-Object {
$Value = $_.Attributes.value__
if($Value -band $Mask) {
$Value = $Value -band -bnot $Mask
if($PSCmdlet.ShouldProcess($_.FullName, "Set $([System.IO.FileAttributes] $Value)")) {
$_.Attributes = $Value
}
}
}
这个代码很好用,但是当我处理一个非常大的文件夹结构时,出现了一些类似于这样的错误:
Exception setting "Attributes": "Could not find a part of the path 'XXXXXXXXXX'."
At YYYYYYYYYY\Grant-FullAccess.ps1:77 char:17
+ $_.Attributes = $Value
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
我认为这很奇怪,因为被处理的FileInfo
对象是有保证存在的,因为它来自于文件搜索。
我不能给出文件名,因为它们是机密的,但我可以说:
- 它们的长度为113-116个字符
- 涉及的唯一字符集是
%()+-.0123456789ABCDEFGIKLNOPRSTUVWX
,其中没有一个是非法的文件名字符 - 由于URL编码空格,所以有
%
字符 (%20
)
您有什么建议可能会导致这种情况发生吗?我认为如果完整路径太长,或者我没有写入文件的权限,那么应该抛出一个更合适的错误。