2012-11-09 57 views
3

Windows Server 2008 R2 VM上,我將PowerShell升級到v3,希望利用Get-ChildItem(gci)的性能提升。此行在v2中無誤地運行:PathTooLong在PowerShell v3中的Get-ChildItem錯誤,但不是v2

$search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb} 

升級到v3後,爲什麼同一行會出現此錯誤? $dir值不變。

gci : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. At line:1 char:11 + $search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ReadError: (\server.domain...DETAILS 1.0.prt:String) [Get-ChildItem], PathTooLongException + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

應用Windows更新並重新啓動後沒有變化。我在升級PowerShell之前拍攝了VM的快照,因此我可以輕鬆地來回切換。

$errorActionPreference是在v2和v3中的Continue

$search.count在v2和v3中都是8,所以我不是超級關心丟失的東西,但想了解行爲的變化。

我試圖在V2 addding -force,看到類似的PathTooLong錯誤,.count是10. V3添加-force後,.count是9然後我恢復了v2和再次發現10個文件與-force。這仍然可能是$dir在不斷變化的數據可以解釋.count差異,但在我們的環境,不斷變化的數據不能真實地解釋PathTooLong錯誤的V3一貫存在,但不是V2。現在我的好奇心已經越來越好了,我希望有人在這個謎團中領先一步,並且會讓我處理錯誤處理,我承認,這可能會提供更多線索。

FWIW,在usage documentation on TechNet說,它適用於v2和v3。 -Force參數的默認值爲False。

Some background從PowerShell和MAX_PATH從v1天。

Windows Server 2008 R2 VM上,我將PowerShell升級到v3,希望利用Get-ChildItem(gci)的性能提升。此行在v2中無誤地運行:

$search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb} 

升級到v3後,爲什麼同一行會出現此錯誤? $dir值不變。

gci : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. At line:1 char:11 + $search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ReadError: (\server.domain...DETAILS 1.0.prt:String) [Get-ChildItem], PathTooLongException + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

應用Windows更新並重新啓動後沒有變化。我在升級PowerShell之前拍攝了VM的快照,因此我可以輕鬆地來回切換。

$errorActionPreference是在v2和v3中的Continue

$search.count在v2和v3中都是8,所以我不是超級關心丟失的東西,但想了解行爲的變化。

我試圖在V2 addding -force,看到類似的PathTooLong錯誤,.count是10. V3添加-force後,.count是9然後我恢復了v2和再次發現10個文件與-force。這仍然可能是$dir在不斷變化的數據可以解釋.count差異,但在我們的環境,不斷變化的數據不能真實地解釋PathTooLong錯誤的V3一貫存在,但不是V2。現在我的好奇心已經越來越好了,我希望有人在這個謎團中領先一步,並且會讓我處理錯誤處理,我承認,這可能會提供更多線索。

FWIW,在usage documentation on TechNet說,它適用於v2和v3。 -Force參數的默認值爲False。

Some background從PowerShell和MAX_PATH從v1天。

+0

你可以使用這個.net程序集http://alphafs.codeplex.com/來避免'PathTooLongException' –

回答

4

我知道PathTooLongException不是特定於PowerShell的。它由在場景後面調用的Win32 API引發。如果你必須使用長路徑,你可能會發現PowerShell是否允許你使用Win32 API的Unicode版本。 See here for information

至於爲什麼第2版的沒有扔的錯誤,我只能推測,第2版有例外的「更好」的內部處理。

+0

謝謝,我看過那篇文章,並且可能會嘗試解決方法。我同意,迄今爲止所有跡象都表明v2對這一錯誤保持沉默。我還是好奇的是什麼版本之間的相關變化,雖然我的QN也開始似乎只是學術... V2和PowerShell v3中之間 – noam

+2

一個重要區別是它運行在頂部的.NET CLR版本。 Powershell v2使用.NET 2.0 CLR(不要與.NET Framework v2.0混淆),而Powershell v3使用.NET 4.0 CLR運行(不要與.NET Framework 4.0混淆)。 4.0 CLR對於例外情況很少寬容。 –