powershell 递归复制文件名较长的文件夹(超过260个字符)

7d7tgy0s  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(210)

我正在尝试自动化驱动器的拷贝/复制。许多驱动器都有很长的文件名,这使得进程中途失败。
我正在使用这个复制命令,但这两个都失败了。

XCOPY /E c:\folder-you-want-to-copy\*.* C:\destinationfolder\ 

copy-item -Path K:\* -Destination E:\ -Recurse -Force

Copy-Item:指定的路径、文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名必须少于260个字符。
然后,我尝试了SO help power shell from hereSO help here,但在我的机器的Win 10策略中缺少启用选项
我如何递归地将文件从一个驱动器复制到另一个驱动器的长文件名/路径?

ih99xse1

ih99xse11#

robocopy不遵守260个字符的限制(除非您使用/256开关):

robocopy K:\ E:\ /E

/E是复制子文件夹,包括空的子文件夹,如果你不想复制空的文件夹,使用/S代替。
Full robocopy syntax

uwopmtnx

uwopmtnx2#

从Powershell 5.1开始,有一个注册表设置可用于处理Powershell脚本中的长路径。
运行以下命令,检查LongPathsEnabled的值是否设置为1

Get-ItemProperty -Path HKLM:\System\CurrentControlSet\Control\FileSystem LongPathsEnabled

使用Administrator 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
}

相关问题