我有一个嵌套很深的存储库,里面有很多Visual Studio项目。我需要找到所有具有TargetFramework 3.5和输出类型"控制台应用程序">的项目。
我发现控制台应用程序的csproj文件中有这样的内容:
<OutputType>Exe</OutputType>
有窗口的应用程序有这样的功能:
<OutputType>WinExe</OutputType>
这使我能够找到所有扩展名为csproj的文件,这些文件可编译为控制台应用程序。
$csproj_ConsoleExes = gci -Recurse *.csproj | select-string "<OutputType>Exe</OutputType>"
接下来我需要做的是:我只需要筛选那些具有目标框架3.5的项目。但是由于$csproj_ConsoleExes包含搜索结果,我不知道如何再次应用选择字符串。选择字符串仅适用于FileInfo类型的输入对象。
感谢您的帮助。
您可以利用 以上输出所有 注: 只有当对于每个搜索模式,每个输入文件最多匹配一行时,这种方法才有效,这对于 请参阅此答案,以获得无法做出此假设的情况下的解决方案。Select-String
接受多个搜索模式的能力,然后使用Group-Object
来确定两个Get-ChildItem -Recurse -Filter *.csproj |
Select-String -SimpleMatch '<OutputType>Exe</OutputType>',
'<TargetFramework>net35</TargetFramework>' |
Group-Object Path |
Where-Object Count -eq 2 |
ForEach-Object Name
*.csproj
文件的完整路径,其中找到两个模式。.csproj
文件应该是正确的。
您可以将$csproj_ConsoleExes中的项目转为键入FileInfo,方法如下:
$csproj_Console_Items = $csproj_ConsoleExes| select Path | get-item
上面的行首先获取每个项的路径,并通过管道将其发送到getitem,然后将其转换为FileInfo对象。
然后,您可以找到包含TargetFrameworkVersion的所有行
$csproj_Console_TargetFrameworkVersion=$csproj_Console_Items | select-string "<TargetFrameworkVersion>"
现在,您可以再次获取路径,并通过管道将其发送到getitem以获取FileInfo类型的新集合。