我正在尝试自动复制驱动器。许多驱动器的文件名很长,导致过程中途失败。
我使用了这个复制命令,但这两个命令都失败了。
XCOPY /E c:\folder-you-want-to-copy\*.* C:\destinationfolder\
copy-item -Path K:\* -Destination E:\ -Recurse -Force
Copy-Item :指定的路径、文件名或两者都太长。完全限定文件名必须少于 260 个字符,目录名必须少于 260 个字符。
然后我尝试了SO帮助这里的power shell和这里的SO帮助,但是我的机器的Win 10策略中缺少启用选项
如何将文件从一个驱动器递归复制到具有长文件名/路径的另一个驱动器?
robocopy
不遵守 260 个字符的限制(除非您使用 /256 开关):
robocopy K:\ E:\ /E
/E
是复制子文件夹,包括空子文件夹,如果您不想复制空文件夹,请使用/S
代替。
从 Powershell 5.1 开始,有一个注册表设置可用于处理 Powershell 脚本中的长路径。
运行以下命令检查LongPathsEnabled的值是否设置为1。
Get-ItemProperty -Path HKLM:\System\CurrentControlSet\Control\FileSystem LongPathsEnabled
使用管理员 Powershell,执行以下命令。
Set-ItemProperty 'HKLM:\System\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -value 1
这将允许 Copy-Item(和其他 *-Item 命令)避免 256 个字符的限制,而无需修改脚本。
我将以下代码添加到我的脚本中,以检查是否设置了该值,以防我们移动到新的构建机器。
$LongPath = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\FileSystem" LongPathsEnabled
if ($LongPath.LongPathsEnabled -ne 1) {
Write-Host "LongPathsEnabled is not set. Build paths are likely to exceed 256 characters and will fail."
Exit 1
}