在现有文件上设置属性时出现错误“找不到路径的一部分”

Posted

技术标签:

【中文标题】在现有文件上设置属性时出现错误“找不到路径的一部分”【英文标题】:Error "Could not find a part of the path" while setting attributes on an existing file 【发布时间】:2022-01-19 14:05:48 【问题描述】:

我编写了一个 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) 而存在

您对造成这种情况的原因有什么建议吗?我假设如果完整路径太长,或者我没有对该文件的写入权限,则会引发更合适的错误。

【问题讨论】:

这些是 UNC 路径 (\\server\share\restofpath) 还是本地路径? @mklement0:我的目的是处理目录和文件,但感谢您的提示。 @mklement0:关于长路径前缀,我现在怀疑这是一个长路径问题。我今天会试试。 @Theo:路径将始终位于本地驱动器上。 【参考方案1】:

正如your own answer 中所述,问题原来是路径过长(超过了 259 个字符的旧限制。)

除了通过组策略启用长路径支持之外,您还可以通过注册表在每台计算机上启用它 em> 如下,需要以 elevation (以管理员身份)运行:

# NOTE: Must be run elevated (as admin).
# Change will take effect in FUTURE sessions.
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled 1

传递 0 以关闭支持。


但是,即使 关闭了长路径支持(在 Windows 10 之前的版本中总是如此),也可以处理长路径:

Windows PowerShell(PowerShell 最高版本 5.1)中,您必须使用 长路径选择加入前缀 em>,\\?\,如下所述。

PowerShell [Core] v6+ 中,不需要额外的工作,因为它始终支持长路径 - 您无需开启支持系统范围,您也不需要下面讨论的长路径前缀。

警告:虽然原则上您可以在 PowerShell [Core] 中使用 \\?\,但从 v7.0.0-rc.2 开始,对它的支持不一致;见this GitHub issue。

重要提示:前缀\\?\仅在以下情况下有效:

前缀路径必须是完整(绝对)、规范化路径(不得包含... 组件)。

例如,\\?\C:\path\to\foo.txt 有效,但 \\?\.\foo.txt 无效。 此外,如果路径是 UNC 路径,则路径需要不同的形式: \\?\UNC\<server>\<share>\...; 例如,\\server1\share2 必须表示为 \\?\UNC\server1\share2

【讨论】:

【参考方案2】:

这确实是一个漫长的路径问题,尽管有错误消息的措辞。对文件进行简单的Get-ChildItem 搜索会产生相同的错误。我终于找到了错误消息中提到的文件并测量了它们的总路径长度。它们超过 260 个字符。

我尝试在路径中添加 \\?\ 前缀,但 powershell 似乎不喜欢这种语法。

幸运的是,该脚本正在 Windows 2016 上使用,所以我尝试在组策略中启用 long path support。这让整个问题都迎刃而解了。

【讨论】:

\\?\ 确实适用于 Get-Item / Get-ChildItem,但仅适用于完整的规范化路径。在 PowerShell Core 中,它们仅在您使用 -LiteralPath 时才有效,不幸的是 - 请参阅我的答案。奇怪的是,您最初在 $_.Attributes = $Value 中遇到了错误,没有明确的路径参数;这几乎表明.Attributes 属性实现中存在错误,但我无法重新创建。

以上是关于在现有文件上设置属性时出现错误“找不到路径的一部分”的主要内容,如果未能解决你的问题,请参考以下文章

创建互斥锁时出现“找不到路径的一部分”错误

例外:在对象 SpreadsheetApp.Range 上获取方法或属性 setNumberFormats 时出现意外错误 - 现有答案对我没有帮助

尝试在 Jupyter Notebook 上使用 Pandas 从现有列创建新列时出现 NoneType 错误

Android中的“找不到路径的一部分”错误

更新现有记录时出现 Entity Framework Core 错误

“消息”:使用 HTTP API 导入 grafana 现有 json 文件时出现“无法导入仪表板”错误