我在将Java版本作为字符串获取时遇到一些问题。 在批处理脚本中,我是这样完成的:
for /f tokens^=2-5^ delims^=.-_^" %%j in ('%EXTRACTPATH%\Java\jdk_extract\bin\java -fullversion 2^>^&1') do set "JAVAVER=%%j.%%k.%%l_%%m"
输出为:1.8.0_121
现在我想为PowerShell执行此操作,但是我的输出是:1.8.0_12
,最后我想念一个“ 1”现在我已经尝试了修剪和分割,但是没有任何东西可以给我正确的输出,有人帮帮我?
这就是我对PowerShell的了解
$javaVersion = (& $extractPath\Java\jdk_extract\bin\java.exe -fullversion 2>&1)
$javaVersion = "$javaVersion".Trim("java full version """).TrimEnd("-b13")
完整的输出是:Java完整版本“ 1.8.0_121-b13”
答案 0 :(得分:1)
TrimEnd()
的工作方式与您预期的有所不同:
'1.8.0_191-b12'.TrimEnd('-b12')
结果:1.8.0_19
,也这样:
'1.8.0_191-b12'.TrimEnd('1-b2')
原因是TrimEnd()
删除了尾随的一组字符,而不是子字符串。因此.TrimEnd('-b12')
的意思是:从字符串末尾删除所有出现的集合'-b12'的字符。并且包括'1'
之前的最后'-'
。
在您的情况下,更好的解决方案是-replace
:
'java full version "1.8.0_191-b12"' -replace 'java full version "(.+)-b\d+"','$1'
答案 1 :(得分:0)
使用正则表达式匹配和提取版本号:
$javaVersion = if (& java -fullversion 2>&1) -match '\d+\.\d+\.\d+_\d+') {
$matches[0]
}
或
$javaVersion = (& java -fullversion 2>&1 | Select-String '\d+\.\d+\.\d+_\d+').Matches[0].Groups[0].Value