【问题标题】:PowerShell Copy-Item PathTooLongExceptionPowerShell 复制项 PathTooLongException
【发布时间】:2018-11-01 18:20:47
【问题描述】:

我有一个 PowerShell 脚本,我需要在其中递归地复制到一个文件夹,替换其中的所有文件:

Copy-Item -Path $source -Destination $destination -Recurse -Force -Verbose

由于目标文件夹中的某些文件的路径超过 260 个字符,因此我收到了 PathTooLongException。

我已经阅读了这些可能的解决方案:

  1. 使用自动复制
    • 我宁愿使用纯 PowerShell
  2. 在注册表和组策略中启用长路径
    • 要求用户必须重新启动他的控制台,我也不想更改用户的注册表。
  3. 为路径使用 \\?\ 前缀

正如我所说,我宁愿不使用前两个,第三个解决方案 (\\?\) 对我来说应该没问题,但实际上并没有复制文件。

当它执行时,它会立即完成,并且不会生成命令的输出。因此,目标中的文件不会被源中的文件替换。

有什么想法吗?

【问题讨论】:

  • 这些是 UNC 路径 (\\server,share) 还是本地路径 (`X:`)?
  • 所有路径都是本地路径。
  • 使用 robocopy - 它是强大的。它经过了很好的测试。太快了。 [grin] 这是工作的正确工具。 posh/not-posh 不是要考虑的想法 - 正确的想法是“正确的工具与否”。 robocopy 从一个豪华的脚本中可以非常非常好地工作。 [咧嘴一笑]

标签: powershell


【解决方案1】:

\\?\前缀使用的是unicode版本的Windows API,这需要使用LiteralPath参数而不是Path

Copy-Item -LiteralPath '\\?\C:\folder\subfolder' -Destination 'D:\folder'

UNC 路径 \\server\share\folder 的语法略有不同 \\?\UNC\server\share\folder

(与您没有特别相关,但如果有人偶然发现此答案以供将来参考)

【讨论】:

  • 复制项:路径中有非法字符。在 D:\Code\TestCopy.ps1:144 char:5 + Copy-Item -LiteralPath $source -Destination $destination -Recurse -Fo ... + ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Copy-Item], ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.CopyItemCommand
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2016-09-16
相关资源
最近更新 更多