如何在 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