Как использовать java команды в powershell - PullRequest
2 голосов
/ 11 января 2020

Все, что я пытаюсь сделать здесь, это определить, установлена ​​ли эта специфицированная c версия java. Программа должна либо только возвращать «Java установлен», либо возвращать ненулевую ошибку выхода с «Java не установлен».


 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):

wrong output

1 Ответ

1 голос
/ 11 января 2020
  • java -version печатает на stderr , что в устаревшем ISE PowerShell воспринимается как ошибка , в отличие от обычной консоли PowerShell windows. Чтобы захватить вывод stderr, вы должны использовать перенаправление 2>&1

    • Примечание. PowerShell переносит строки stderr из внешних программ в System.Management.Automation.ErrorRecord объекты. В PowerShell [Core] v6 + эти объекты разумно преобразуются в исходное строковое содержимое, если вы, например, перенаправляете на Out-String. К сожалению, это не так в Windows PowerShell (v5.1-), поэтому вам придется вызывать .ToString() для них; альтернатива - выложить на cmd.exe и применить перенаправление там (cmd /c 'java -version 2>&1'), но это неэффективно и может иметь побочные эффекты.
  • -contains оператор проверяет массив на наличие элемента, он не выполняет поиск подстроки; Вы можете использовать [string] тип .Contains() метод для последнего или - более идиотски PowerShell - оператор -match, хотя обратите внимание, что -match работает с регулярными выражениями вместо буквенных строк, и по умолчанию не учитывает регистр. Обратите внимание, что с -match символами .. в строке поиска 1.8.0_141 должен быть \ -экранирован, чтобы их можно было обрабатывать буквально.

  • Write-Error записывает в поток ошибок PowerShell, он не устанавливает код выхода Хотя можно назначить $global:LASTEXITCODE для установки кода выхода из функции, PowerShell не использует коды выхода для внутреннего использования.
    Вместо этого назовите вашу функцию Test-* (Test является утвержденным глаголом ) и верните его $true или $false.
    В качестве альтернативы назовите его Assert-JavaInstalled и сделайте throw ошибку, которая прерывает обработку скрипта.

Чтобы сложить все вместе:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...