PowerShell v3中的Get-ChildItem的PathTooLong错误,但不是v2

时间:2012-11-09 16:56:30

标签: powershell error-handling powershell-v3.0 get-childitem

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中,

$errorActionPreferenceContinue

$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。

PowerShell上的

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中,

$errorActionPreferenceContinue

$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。

PowerShell上的

Some background和v1天的MAX_PATH

1 个答案:

答案 0 :(得分:4)

我知道PathTooLongException并不特定于PowerShell。它是在场景后面调用的Win32 API引发的。如果必须使用长路径,则可能会发现PowerShell是否允许您使用Unicode版本的Win32 API。 See here for information

至于为什么版本2没有抛出错误,我只能假设版本2对异常有“更好”的内部处理。