2014-03-25 74 views
1
Get-ChildItem -recurse | ? {$_.Extension -eq ".obj" } | %{del $_} 
                  ~~~~~~ 
CategoryInfo   : ObjectNotFound: (C:\Temp\compilerLimits\template.obj:String) [Remove-Item], ItemNotFoundException 
FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand 

試圖遞歸刪除所有.obj文件; 反而我得到這個。我的遞歸刪除有什麼問題?

回答

5

試試這樣說:

Get-ChildItem -recurse *.obj | Remove-Item 

| %{del $_}的情況下,$_是System.IO.FileInfo對象,當PowerShell中使用此爲LiteralPath參數,它看到的LiteralPath參數需要一個字符串。 FileInfo到字符串的轉換似乎使用FileInfo.ToString()方法,在某些情況下(如用於子目錄)不包含完整路徑 - 只是文件名。這會導致你看到的錯誤。在FileInfo對象中管道時,將使用管道參數綁定規則。 LiteralPath參數有一個名爲PSPath的別名。通過PowerShell的類型系統將此屬性添加到每個FileInfo對象。你可以在Get-ChildItem *.obj | Get-Member看到這個。由於LiteralPath參數將ValueFromPipelineByPropertyName設置爲true,因此PowerShell將從對象的PSPath屬性中獲取參數值。

你可以在Item 8 of my Effective PowerShell ebook瞭解更多。

+0

謝謝。 PowerShell是否在任何東西的底層使用.net api? – igbgotiz

+0

它廣泛使用.NET API。有一些使用DCOM和可能對Win32的一些pinvokes。 –

+0

不錯的書可能實際上比我正在閱讀的其他PowerShell書更好。只是想提一下關於'foreach'和'$ null'的部分,在'Working with Empty Sets'下應該更新到至少注意到v3已經修復了這種行爲。 –