如何对从 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')
我正在使用 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')