найти все VS-проекты, которые компилируются в консольное приложение. NET 3.5 - PullRequest
1 голос
/ 23 марта 2020

У меня есть глубоко вложенный репозиторий со множеством проектов Visual Studio. Мне нужно найти все проекты, которые имеют TargetFramework 3.5 и Тип вывода «консольное приложение» .

Я выяснил, что консольные приложения имеют это в своем csproj-файле :

<OutputType>Exe</OutputType>

И приложения с окном имеют это:

<OutputType>WinExe</OutputType>

Это позволяет мне найти все файлы с расширением csproj, которые компилируются в консольное приложение.

$csproj_ConsoleExes = gci -Recurse *.csproj | select-string "<OutputType>Exe</OutputType>"

Что мне нужно сделать дальше: мне нужно отфильтровать только те проекты с target-framework 3.5. Но поскольку $ csproj_ConsoleExes содержит результаты поиска, я не знаю, как применить select-string снова. строка выбора работает только с объектами ввода типа FileInfo .

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Вы можете воспользоваться Select-String способностью принимать несколько шаблонов поиска, что позволяет затем использовать Group-Object для определения всех те файлы, в которых оба шаблона совпали:

Get-ChildItem -Recurse -Filter *.csproj |
  Select-String '<OutputType>Exe</OutputType>',
                '<TargetFramework>net35</TargetFramework>' | 
    Group-Object Path |
      Where-Object Count -eq 2 | 
        ForEach-Object Name

Приведенный выше выводит полные пути ко всем *.csproj файлам, в которых были найдены оба шаблона .

Примечание. Этот подход работает только в том случае, если для каждого шаблона поиска совпадает не более одна строка на входной файл - что должно быть в случае с .csproj файлами, однако.

0 голосов
/ 23 марта 2020

Вы можете превратить элементы в $ csproj_ConsoleExes , чтобы ввести FileInfo с помощью этого:

$csproj_Console_Items = $csproj_ConsoleExes| select Path | get-item

В приведенной выше строке сначала указывается путь для каждого элемента и каналов это получить элемент, который затем превращается в объект FileInfo.

Затем вы можете найти все строки, содержащие TargetFrameworkVersion

$csproj_Console_TargetFrameworkVersion=$csproj_Console_Items | select-string "<TargetFrameworkVersion>"

Теперь вы можете снова получить путь и направьте его к get-item , чтобы получить новую коллекцию типа FileInfo.

...