如何在 powershell 中使用 java 命令
How to use java commands in powershell
我在这里要做的就是确定是否安装了这个特定版本的 java。该程序应该只 return "Java is installed" 或 return 非零退出错误 "Java is not installed".
function Check_Java_Installed {
$app = java -version | Out-String
if ($app -contains "1.8.0_141"){
Write-Output "Java installed"
}
else{
Write-Error -Message "Java not installed"
}
}
Check_Java_Installed
输出(Powershell ISE):
java : java version "1.8.0_141"
At C:\temporary\Installers\java-checker.ps1:3 char:12
+ $app = (java -version) | Out-String
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (java version "1.8.0_141":String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Java(TM) SE Runtime Environment (build 1.8.0_141-b15
)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
Check_Java_Installed : Java not installed
At C:\temporary\Installers\java-checker.ps1:13 char:2
+ Check_Java_Installed
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Check_Java_Installed
输出(Powershell):
java -version
打印到 stderr,过时的 PowerShell ISE 将其视为 error,这与常规 PowerShell 控制台 windows。要捕获 stderr 输出,您必须使用重定向 2>&1
- 注意:PowerShell 将来自外部程序的 stderr 行包装在
System.Management.Automation.ErrorRecord
对象中。例如,在 PowerShell [Core] v6+ 中,如果您通过管道传输到 Out-String
,这些对象会明智地字符串化为它们的原始字符串内容。不幸的是,在 Windows PowerShell (v5.1-) 中并非如此,因此您必须对它们调用 .ToString()
;另一种方法是 shell 到 cmd.exe
并在那里应用重定向 (cmd /c 'java -version 2>&1'
),但这效率低下并且可能有副作用。
-contains
运算符测试一个数组是否存在一个元素,它没有' t 执行子字符串搜索;对于后者,您可以使用 [string]
类型的 .Contains()
方法 ,或者 - 更符合 PowerShell 习惯的 - -match
运算符,但请注意 -match
对 正则表达式 而不是文字字符串进行操作,默认情况下不区分大小写。请注意,-match
是 .
个字符。在搜索字符串 1.8.0_141
中必须进行 \
转义,以便按字面意思对待它们。
Write-Error
写入 PowerShell 的错误流,它不设置退出代码。虽然可以分配给 $global:LASTEXITCODE
来设置函数的退出代码,但 PowerShell 不会在内部使用退出代码。
相反,将您的函数命名为 Test-*
(Test
是一个 approved verb)并使其成为 return $true
或 $false
.
或者,将其命名为 Assert-JavaInstalled
并使其 抛出 中止脚本处理的错误。
总而言之:
# Functions named Test-* should return $true or $false
function Test-JavaInstalled {
# In Windows PowerShell, use:
# (java -version 2>&1 | % ToString | Out-String)
(java -version 2>&1 | Out-String) -match '1\.8\.0_141'
}
# Call the function.
if (Test-JavaInstalled) {
"Java installed"
} else {
Write-Error"Java not installed"
}
或者,将您的函数命名为 Assert-JavaInstalled
并使其通过 throw
生成脚本 - 终止 错误,如果未发现 Java待安装:
function Assert-JavaInstalled {
# In Windows PowerShell, use:
# (java -version 2>&1 | % ToString | Out-String)
if ((java -version 2>&1 | Out-String) -match '1\.8\.0_141')) {
"Java installed"
}
else {
# Throw a script-terminating error.
throw "Java not installed"
}
}
# Call the function.
Assert-JavaInstalled
我在这里要做的就是确定是否安装了这个特定版本的 java。该程序应该只 return "Java is installed" 或 return 非零退出错误 "Java is not installed".
function Check_Java_Installed {
$app = java -version | Out-String
if ($app -contains "1.8.0_141"){
Write-Output "Java installed"
}
else{
Write-Error -Message "Java not installed"
}
}
Check_Java_Installed
输出(Powershell ISE):
java : java version "1.8.0_141"
At C:\temporary\Installers\java-checker.ps1:3 char:12
+ $app = (java -version) | Out-String
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (java version "1.8.0_141":String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Java(TM) SE Runtime Environment (build 1.8.0_141-b15
)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
Check_Java_Installed : Java not installed
At C:\temporary\Installers\java-checker.ps1:13 char:2
+ Check_Java_Installed
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Check_Java_Installed
输出(Powershell):
java -version
打印到 stderr,过时的 PowerShell ISE 将其视为 error,这与常规 PowerShell 控制台 windows。要捕获 stderr 输出,您必须使用重定向2>&1
- 注意:PowerShell 将来自外部程序的 stderr 行包装在
System.Management.Automation.ErrorRecord
对象中。例如,在 PowerShell [Core] v6+ 中,如果您通过管道传输到Out-String
,这些对象会明智地字符串化为它们的原始字符串内容。不幸的是,在 Windows PowerShell (v5.1-) 中并非如此,因此您必须对它们调用.ToString()
;另一种方法是 shell 到cmd.exe
并在那里应用重定向 (cmd /c 'java -version 2>&1'
),但这效率低下并且可能有副作用。
- 注意:PowerShell 将来自外部程序的 stderr 行包装在
-contains
运算符测试一个数组是否存在一个元素,它没有' t 执行子字符串搜索;对于后者,您可以使用[string]
类型的.Contains()
方法 ,或者 - 更符合 PowerShell 习惯的 --match
运算符,但请注意-match
对 正则表达式 而不是文字字符串进行操作,默认情况下不区分大小写。请注意,-match
是.
个字符。在搜索字符串1.8.0_141
中必须进行\
转义,以便按字面意思对待它们。Write-Error
写入 PowerShell 的错误流,它不设置退出代码。虽然可以分配给$global:LASTEXITCODE
来设置函数的退出代码,但 PowerShell 不会在内部使用退出代码。
相反,将您的函数命名为Test-*
(Test
是一个 approved verb)并使其成为 return$true
或$false
.
或者,将其命名为Assert-JavaInstalled
并使其 抛出 中止脚本处理的错误。
总而言之:
# Functions named Test-* should return $true or $false
function Test-JavaInstalled {
# In Windows PowerShell, use:
# (java -version 2>&1 | % ToString | Out-String)
(java -version 2>&1 | Out-String) -match '1\.8\.0_141'
}
# Call the function.
if (Test-JavaInstalled) {
"Java installed"
} else {
Write-Error"Java not installed"
}
或者,将您的函数命名为 Assert-JavaInstalled
并使其通过 throw
生成脚本 - 终止 错误,如果未发现 Java待安装:
function Assert-JavaInstalled {
# In Windows PowerShell, use:
# (java -version 2>&1 | % ToString | Out-String)
if ((java -version 2>&1 | Out-String) -match '1\.8\.0_141')) {
"Java installed"
}
else {
# Throw a script-terminating error.
throw "Java not installed"
}
}
# Call the function.
Assert-JavaInstalled