当路径\文件名超过260个字符时,在PowerShell中获取/设置文件属性

5
我正在寻找在PowerShell中获取和设置文件属性(隐藏和只读)的方法,对于文件名和路径组合超过260个字符的文件。我知道.NET类不支持更长的文件路径;我已经尝试过了。Attrib也不起作用。我收到错误“参数格式不正确 -”。同样,Dir也不起作用。
我正在使用Robocopy获取文件名。Robocopy对长路径没有问题。然而,我不能使用Robocopy来获取/设置属性,因为我只是使用Robocopy的/L列表模式。
有人有PowerShell的解决方法吗?
更新:
subst不支持额外长的路径。它似乎可以使用部分路径。
mklink需要本地卷。
net use不支持额外长的路径。它似乎可以使用部分路径。
New-PSDrive不支持额外长的路径,甚至连部分路径也不支持。

我相信260的限制来自于Windows而不是.NET。 - Mike Cheel
1
你尝试将文件名转换为8.3格式了吗?我不确定在你的环境中这样做是否可行或者会不会解决问题。这只是一个想法 :) - nimizen
2
基于.NET中的长路径,第2部分:长路径解决方法kernel32.SetFileAttributes,我认为你可以编写一个C# dll,并使用https://dev59.com/ZHA65IYBdhLWcg3wuhIR中的信息在PowerShell中使用它。 - Andrew Morton
@nimizen:这似乎有点不可靠,因为我无法保证文件和路径不会有类似的名称。我正在处理数千兆字节的文件。 - Benjamin Hubbard
你尝试在托管长路径的系统上创建共享了吗?即 net share foo=c:\some\path... 然后 net use \\server\foo - vonPryz
显示剩余2条评论
2个回答

1

我想使用subst命令将路径映射为驱动器号是值得一试的。它基于早期的DOS,仍然可以在Windows上工作,如下所示:

subst k: c:\some\really\complex\path\with\too\many\subdirs\and\suff\...

如果subst命令无法正常工作,尝试共享靠近文件的目录,并通过UNC路径进行访问。

如果我找不到更快的方法,这可能是最后的办法。 - Benjamin Hubbard
考虑使用部分路径来使其工作。 - Benjamin Hubbard

0
基于vonPryz的答案和您使用部分路径的想法,以下方法可以实现,尽管它很慢并需要错误抑制:
subst m: 'Insert\a\complete\path\close\to\character\limit'
sleep 1
Push-Location 'm:\rest\of\path\to\the\file' -ErrorAction SilentlyContinue
Get-ChildItem | %{
attrib $_
}
subst m: /d
sleep 1

这个答案也使用了SUBST来接近我们想要的位置;然后,Push-Location将长文件名的父目录设置为“当前工作目录”在这里看。Push-Location会抱怨,但它仍然可以工作,因为Get-ChildItem和ATTRIB似乎与这个“当前工作目录”一起工作,而不是解析整个路径,结果ATTRIB可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接