如何对从 Get-Content 返回的字符串值使用 .Contains()?

How do I use .Contains() on the string value returned from Get-Content?

我正在使用 powershell 脚本检查目录中的哪个 java 文件是主 java 文件,方法是检查每个文件的内容并查看它是否包含 "main" .问题是,当脚本命中 Contains() 方法行时,它 return 是错误的,即使在调试时我可以看到我的 $javafilecontents 的内容显然有短语 "main"。 对于这种情况,我缺少什么,或者如何让 Contains 达到 return true?

为了彻底测试,我还尝试了其他应该在文件中的小关键字,例如 $javafilecontents.Contains("import"),它实际上是文件中的第一个单词,但它仍然 returns false

我在这里发现了类似的情况: Why is string.contains() returning 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 保持错误,但我认为我理解 Contains() 的方式应该是正确的

Get-Content -Path $javafilepath 生成一个字符串数组,其中文件的每一行都是一个数组元素。使用字符串方法 Contains() 时会遇到问题,因为 PowerShell 实际上是在使用数组 class 的 Contains() 方法。对于数组 class Contains() 到 return true 的方法,您必须匹配 整行 .

Get-Content -Path $javafilepath -Raw 会产生更好的结果,因为它只产生一个字符串。然后字符串 class Contains() 方法将允许子字符串匹配。请记住字符串 class 方法 区分大小写 .

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

另一种选择是在没有 -Raw 开关的情况下继续并循环遍历每一行。然后你可以对每一行使用字符串 class Contains() ,这将是一个字符串。 where() 方法可以根据条件过滤数组。然后你可以将该过滤器的成功转换为 [bool]。匹配将产生 True,没有匹配将产生 False.

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

与上述方法相同的方法可以与 case-insensitive -match 运算符一起使用,它会产生一个更清洁的解决方案。 -cmatch 是区分大小写的版本。

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