PowerShell:select-object之后的意外序列类型

时间:2014-02-10 09:39:01

标签: powershell

我正在编写一个PowerShell脚本,它应该清理我的Visual Studio项目。我的策略是在子目录中查找所有项目文件(例如* .csproj)。项目文件的父文件夹应该是项目目录。从那里很容易到达bin和obj子文件夹。

使用以下代码片段,我想找到所有项目文件夹:

$dirs = Get-ChildItem -Recurse -File -Path $start_dir -Include *.csproj | select Directory

我希望这个语句可以计算出一系列System.IO.DirectoryInfo对象。令我惊讶的是,事实并非如此。实际上,您获得了一系列Selected.System.IO.FileInfo:

PS> Get-ChildItem -Recurse -File -Path $start_dir -Include *.csproj | select Directory | gm


TypeName: Selected.System.IO.FileInfo

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Directory   NoteProperty System.IO.DirectoryInfo Directory=C:\dev\proj\ART\Sources\ART.Adapter

有人可以解释这种行为吗?有人知道另一个评估DirectoryInfo对象序列的语句吗?

2 个答案:

答案 0 :(得分:1)

我想你想要这个:

$dirs = Get-ChildItem -Recurse -File -Path $start_dir -Include *.csproj | select -expand Directory | % { [io.directoryinfo]$_ }

$dirs = [io.directoryinfo[]](Get-ChildItem -Recurse -File -Path $start_dir -Include *.csproj | select -expand Directory )

在您的代码中,$dirs [object[]] [pscustomobject], 您需要使用[string]中的-expand获取select-object值并将每个值转换为[io.diredtoryinfo]对象。

答案 1 :(得分:1)

Select-Object cmdlet始终生成该对象类型的选定对象。

尝试使用此方法获取DirectoryInfo对象的集合:

$dirs = (Get-ChildItem -Recurse -File -Path $start_dir -Include *.csproj).Directory