【发布时间】: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