Каталог поиска Powershell для файлов кода с сопоставлением текста введите текстовый файл - PullRequest
1 голос
/ 14 июля 2020

Проект сопоставления данных от внутренней системы к системе нового поставщика. Первый шаг - найти все вхождения текущих имен полей базы данных (или, если быть точным, имен столбцов) в исходных файлах C# .cs. Пытаюсь использовать Powershell. Недавно были созданы поисковые запросы PS с Get-ChildItem и Select-String, которые работают хорошо, но массив строк поиска был небольшим и легко закодировался встроенным. Но переносимое приложение имеет пару сотен имен столбцов и значительный объем кода. Таким образом, вооруженный текстовым файлом всех имен столбцов, Pipleline может показаться божественным инструментом для создания базовой c перекрестной ссылки для дальнейшего анализа. Однако мне не удалось заставить конвейер работать с внешней переменной где-либо, кроме первого шага. Пробуем использовать -PipelineVariable, $ _. и глобальная переменная. Не нашел ничего особенного c после долгих поисков. PS Это мой первый вопрос к StackoOverflow, будьте любезны, пожалуйста.

Вот то, что я надеялся, сработает, но пока играю в кости.

$inputFile = "C:\DataColumnsNames.txt"
$outputFile = "C:\DataColumnsUsages.txt"
$arr = [string[]](Get-Content $inputfile)
foreach ($s in $arr) {
  Get-ChildItem -Path "C:ProjectFolder\*"  -Filter *.cs  -Recurse -ErrorAction SilentlyContinue -Force |
  Select-String $s | Select-Object  Path, LineNumber, line | Export-csv $outputfile
}

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

foreach ($s in $arr) {Write-Host $s | Write $s}

Если это невозможно сделать в Powershell легко, мой запасной вариант - это C# хотя я бы предпочел поднять уровень с помощью PowerShell, если кто-нибудь может указать мне на правильное понимание того, как делать что-то в Pipepline, или, альтернативно, создать эквивалентную функцию. Кажется, такая естественная посадка для Powershell.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Вы вызываете Export-csv $outputfile в al oop, который перезаписывает весь файл на каждой итерации, так что только результат последней итерации будет в конечном итоге в файле.

Хотя вы могли использовать -Append для итеративного добавления в выходной файл, стоит сделать шаг назад: Select-String может принимать массив шаблонов, в результате чего строка, которая соответствует любому из них, будет считаться совпадением.

Следовательно, ваш код можно упростить следующим образом:

$inputFile = 'C:\DataColumnsNames.txt'
$outputFile = 'C:\DataColumnsUsages.txt'

Get-ChildItem C:\ProjectFolder -Filter *.cs -Recurse -Force -ea SilentlyContinue |
  Select-String -Pattern (Get-Content $inputFile) | 
    Select-Object Path, LineNumber, line | 
      Export-csv $outputfile

-Pattern (Get-Content $inputFile) передает строки входного файла $inputFile как массив шаблонов для сопоставления.

По умолчанию эти строки интерпретируются как регулярные выражения (регулярные выражения); чтобы гарантировать, что они рассматриваются как литералы , добавьте -SimpleMatch к вызову Select-String.

Этот ответ на последующий вопрос показывает, как включить указанный c шаблон среди нескольких шаблонов, переданных в -Pattern, которые совпадают в каждой строке вывода.

0 голосов
/ 14 июля 2020

Я думаю, вы хотите добавить каждое вхождение в файл csv. И вам нужно получить содержимое файла. Попробуйте следующее:

$inputFile = "C:\DataColumnsNames.txt"
$outputFile = "C:\DataColumnsUsages.txt"
$arr [string[]](Get-Content $inputfile)
foreach ($s in $arr) {
    Get-ChildItem -Path "C:ProjectFolder\*"  -Filter *.cs  -Recurse -ErrorAction SilentlyContinue -Force | Foreach {
    Get-Content "$_.Fullname" | Select-String $s | Select-Object  Path, LineNumber, line | Export-csv -Append -Path "$outputfile"
  }
}

-Append не был представлен до powershell v3.0 (Windows 8), затем попробуйте следующее:

$inputFile = "C:\DataColumnsNames.txt"
$outputFile = "C:\DataColumnsUsages.txt"
$arr [string[]](Get-Content $inputfile)
foreach ($s in $arr) {
    Get-ChildItem -Path "C:ProjectFolder\*"  -Filter *.cs  -Recurse -ErrorAction SilentlyContinue -Force | Foreach {
    Get-Content "$_.Fullname" | Select-String $s | Select-Object  Path, LineNumber, line | ConvertTo-CSV -NoTypeInformation | Select-Object -Skip 1 | Out-File -Append -Path "$outputfile"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...