在Windows Server 2008 R2 VM上,我将PowerShell升级到v3,希望利用Get-ChildItem(gci)性能改进。这行在v2中没有错误地运行:
$search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb}
升级到v3后,为什么同一行会出现此错误? $dir
值保持不变。
gci:指定的路径,文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名必须少于 超过248个字符。 在行:1 char:11 + $ search = gci $ dir -recurse -exclude“* .mdf”|其中{$ _.length -gt 100mb} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ReadError:(\ server.domain ... DETAILS 1.0.prt:String)[Get-ChildItem],PathTooLongException + FullyQualifiedErrorId:DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand
应用Windows更新并重新启动后没有任何变化。我在升级PowerShell之前拍摄了VM的快照,因此我可以轻松地来回切换。
在v2和v3中, $errorActionPreference
为Continue
。
$search.count
在v2和v3中都是8,所以我不是非常担心缺少的东西,而是想了解行为的变化。
我尝试在v2中添加-force
,看到类似的PathTooLong错误,.count
为10.在v3中添加-force
后,.count
为9.我然后恢复为v2并再次找到10个-force
的文件。尽管如此,在$dir
下更改数据可能可以解释.count
差异,但在我们的环境中,更改数据无法真实地解释v3中PathTooLong错误的一致性,而不是v2。既然我的好奇心已经变得更好了,我希望有人在这个谜团上有一个领先优势,并且会让我免除错误处理,我承认,这可能会提供更多线索。
FWIW,usage documentation on TechNet表示它适用于v2和v3。 -Force
参数的默认值为False。
Some background和v1天的MAX_PATH
。
在Windows Server 2008 R2 VM上,我将PowerShell升级到v3,希望利用Get-ChildItem(gci)性能改进。这行在v2中没有错误地运行:
$search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb}
升级到v3后,为什么同一行会出现此错误? $dir
值保持不变。
gci:指定的路径,文件名或两者都太长。完全限定的文件名必须少于260个字符,目录名必须少于 超过248个字符。 在行:1 char:11 + $ search = gci $ dir -recurse -exclude“* .mdf”|其中{$ _.length -gt 100mb} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ReadError:(\ server.domain ... DETAILS 1.0.prt:String)[Get-ChildItem],PathTooLongException + FullyQualifiedErrorId:DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand
应用Windows更新并重新启动后没有任何变化。我在升级PowerShell之前拍摄了VM的快照,因此我可以轻松地来回切换。
在v2和v3中, $errorActionPreference
为Continue
。
$search.count
在v2和v3中都是8,所以我不是非常担心缺少的东西,而是想了解行为的变化。
我尝试在v2中添加-force
,看到类似的PathTooLong错误,.count
为10.在v3中添加-force
后,.count
为9.我然后恢复为v2并再次找到10个-force
的文件。尽管如此,在$dir
下更改数据可能可以解释.count
差异,但在我们的环境中,更改数据无法真实地解释v3中PathTooLong错误的一致性,而不是v2。既然我的好奇心已经变得更好了,我希望有人在这个谜团上有一个领先优势,并且会让我免除错误处理,我承认,这可能会提供更多线索。
FWIW,usage documentation on TechNet表示它适用于v2和v3。 -Force
参数的默认值为False。
Some background和v1天的MAX_PATH
。
答案 0 :(得分:4)
我知道PathTooLongException并不特定于PowerShell。它是在场景后面调用的Win32 API引发的。如果必须使用长路径,则可能会发现PowerShell是否允许您使用Unicode版本的Win32 API。 See here for information
至于为什么版本2没有抛出错误,我只能假设版本2对异常有“更好”的内部处理。