我正在编写一个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对象序列的语句吗?
答案 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