Как использовать .Contains () для строкового значения, возвращаемого из Get-Content? - PullRequest
1 голос
/ 20 сентября 2019

Я использую сценарий powershell, чтобы проверить и посмотреть, какой java-файл в каталоге является основным java-файлом, проверив содержимое каждого файла и проверив, содержит ли он «main».Проблема в том, что когда скрипт попадает в строку метода Contains (), он возвращает false, даже когда я вижу, что при отладке содержимое моего $ javafilecontents явно имеет фразу «main».Что мне не хватает, или как мне получить Contains, чтобы вернуть true для этого случая?

Просто для тщательного тестирования я также попробовал другие небольшие ключевые слова, которые должны быть в файле, такие как $ javafilecontents.Contains ("import "), что буквально является самым первым словом в файле, но все равно возвращает false

Я обнаружил похожую ситуацию здесь: Почему string.contains () возвращает false?

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

Код:

    foreach ($userjavafile in $userjavafiles)
    {
        $javafilepath = "" + $destination + "\" + $userjavafile
        $javafilecontents =  Get-Content -Path $javafilepath
        $mybool = ($javafilecontents.Contains("main"))
        if ($mybool)
        {
            $mainjavafile = $userjavafile
        }
        $spaceseparatedjavafiles += "" + $userjavafile + " " 
    }

$ destination - это путь к файлам, которые я создал ранее в коде.

$ javafilecontents содержит содержимое файла .java, который содержит строку "public static void main (String [] args){"

Эти два проверены на правильность, так как я вижу в отладчике, что содержимое правильно помещено в переменную.

$ mybool остается ложным, но, как мне показалось, я понимаюСодержит () это должно быть верно

1 Ответ

1 голос
/ 20 сентября 2019

Get-Content -Path $javafilepath создает массив строк, где каждая строка файла является элементом массива.У вас будут проблемы с использованием строкового метода Contains(), поскольку PowerShell на самом деле использует метод Contains() класса Array.Чтобы метод класса Array Contains() возвратил true, вам нужно будет сопоставить всю строку .

Get-Content -Path $javafilepath -Raw даст лучшие результаты, поскольку онпроизводит одну строку.Тогда метод класса string Contains() позволит найти совпадение подстроки.Помните, что метод класса строк чувствителен к регистру .

$javafilecontents = Get-Content -Path $javafilepath -Raw
$mybool = $javafilecontents.Contains("main")

Другой вариант - продолжить без переключателя -Raw и проходить по каждой строке,Затем вы можете использовать класс строки Contains() для каждой строки, которая будет одной строкой.Метод where() может фильтровать массив на основе условия.Затем вы можете применить успех этого фильтра к [bool].Совпадение даст True, а совпадение не даст False.

$javafilecontents = Get-Content -Path $javafilepath
$mybool = [bool]($javafilecontents.where{$_.Contains("main")})

Тот же подход, что и вышеописанный метод, можно использовать с без учета регистра -match оператор, который производит более чистое решение.-cmatch - чувствительная к регистру версия.

$javafilecontents = Get-Content -Path $javafilepath
$mybool = [bool]($javafilecontents -match 'main')
...