powershell - 在现有文件上设置属性时出现错误 "Could not find a part of the path"

标签 powershell

我编写了一个 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 对象肯定存在,因为它来自文件搜索。

我不能给出文件名,因为它们是 secret 的,但我可以说:

  • 长度为 113-116 个字符
  • 所涉及的唯一字符集是%()+-.0123456789ABCDEFGIKLNOPRSTUVWX,在文件名中没有一个是非法的
  • % 字符是由于 URL 编码空格 (%20)

对于可能导致此问题的原因,您有什么建议吗?我假设如果完整路径太长,或者我没有文件的写权限,那么会抛出一个更合适的错误。

最佳答案

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

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

# 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)中,您必须使用长路径选择加入前缀, \\?\ ,如下所述。

  • PowerShell [Core] v6+ 中,不需要额外的工作,因为它总是支持长路径 - 你既不需要打开系统范围的支持,也不需要下面讨论的长路径前缀。

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

重要:前缀 \\?\仅在以下条件下有效:

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

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

关于powershell - 在现有文件上设置属性时出现错误 "Could not find a part of the path",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58324507/

相关文章:

windows - 使用Pester检查Windows磁盘加密

windows - 如何使用powershell脚本更改windows服务账户域名和密码?

c# - 如何让 C# Cmdlet 参数 HelpMessage 显示在 `Get-Help` 中

windows - 如何在 PowerShell 中的子文件夹中点源函数

powershell - Powershell v2-从动态字符串中提取日期

powershell - cls 在 Get-Content -Wait 调用上。

powershell - 从 get-childitem 搜索中排除路径

powershell - 如何捕获Powershell作业的.NET跟踪输出?

xml - XML通过保存到文件中丢失双引号

powershell - powershell 启动过程出错