【问题标题】:How do I use .Contains() on the string value returned from Get-Content?如何对从 Get-Content 返回的字符串值使用 .Contains()?
【发布时间】:2020-01-21 18:54:16
【问题描述】:

我正在使用powershell脚本通过检查每个文件的内容并查看它是否包含“main”来检查目录中的哪个java文件是主java文件。问题是,当脚本点击 Contains() 方法行时,它返回 false,即使我可以看到,在调试时,我的 $javafilecontents 的内容显然有短语“main”。 我错过了什么,或者我如何让 Contains 为这种情况返回 true?

为了彻底测试,我还尝试了其他应该在文件中的小关键字,例如 $javafilecontents.Contains("import"),它实际上是文件中的第一个单词,但它仍然返回 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 实际上使用的是 Array 类的 Contains() 方法。 Get-Content -Path $javafilepath -Raw 会产生更好的结果,因为它会产生一个字符串。
  • .Contains() 字符串方法需要一个精确匹配 - 该方法的数组版本也是如此。模式必须包含 完全匹配 - 包括大小写。

标签: string powershell contains


【解决方案1】:

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

Get-Content -Path $javafilepath -Raw 会产生更好的结果,因为它会产生一个字符串。然后字符串类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')

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 2020-09-15
    • 2021-09-13
    • 2014-12-09
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多