3

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 个字符。在 line: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 的快照,因此我可以轻松地来回切换。

$errorActionPreferenceContinuev2 和 v3 中。

$search.count在 v2 和 v3 中都是 8,所以我不太担心丢失的东西,但想了解行为的变化。

我尝试-force在 v2 中添加,看到类似的 PathTooLong 错误,.count为 10。在添加-forcev3 后,.count为 9。然后我恢复到 v2,再次找到 10 个带有-force. 尽管如此,更改数据$dir可能会解释.count差异,但在我们的环境中,更改数据并不能实际解释 v3 中 PathTooLong 错误的一致存在,而 v2 则不然。既然我的好奇心已经战胜了我,我希望有人能对这个谜团有所了解,并让我免于错误处理,我承认,这可能会提供更多线索。

FWIW,TechNet 上的使用文档说它适用于 v2 和 v3。该-Force参数的默认值为 False。

关于 PowerShell 和MAX_PATHv1 的一些背景知识。

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 个字符。在 line: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 的快照,因此我可以轻松地来回切换。

$errorActionPreferenceContinuev2 和 v3 中。

$search.count在 v2 和 v3 中都是 8,所以我不太担心丢失的东西,但想了解行为的变化。

我尝试-force在 v2 中添加,看到类似的 PathTooLong 错误,.count为 10。在添加-forcev3 后,.count为 9。然后我恢复到 v2,再次找到 10 个带有-force. 尽管如此,更改数据$dir可能会解释.count差异,但在我们的环境中,更改数据并不能实际解释 v3 中 PathTooLong 错误的一致存在,而 v2 则不然。既然我的好奇心已经战胜了我,我希望有人能对这个谜团有所了解,并让我免于错误处理,我承认,这可能会提供更多线索。

FWIW,TechNet 上的使用文档说它适用于 v2 和 v3。该-Force参数的默认值为 False。

关于 PowerShell 和MAX_PATHv1 的一些背景知识。

4

1 回答 1

4

我知道 PathTooLongException 并不特定于 PowerShell。它由在后台调用的 Win32 API 引发。如果您必须使用长路径,您可能会发现 PowerShell 是否允许您改用 Unicode 版本的 Win32 API。有关信息,请参见此处

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

于 2012-11-09T17:53:07.460 回答