У меня есть 2 сценария powershell, которые я запускаю через код c#, первый загружает и устанавливает OpenJDK и устанавливает соответствующие переменные среды. Второй скрипт просто проверяет версию java. У меня есть настройка для запуска второго сценария (сценария проверки) в первую очередь, и если OpenJDK не найден, то для запуска первого сценария (сценария загрузки), а затем второго сценария (сценария проверки). Кажется, это работает большую часть времени, но время от времени кажется, что он «застревает», когда скрипт проверки всегда возвращает ошибку, указывающую, что OpenJDK не установлен в системе. Однако ручная проверка OpenJDK (проверка местоположения установки, проверка переменных среды) говорит о том, что установка (с помощью сценария загрузки) выполнена правильно.
Сценарий загрузки:
(New-Object System.Net.WebClient).DownloadFile(OpenJDK Download Link, Download Location);
Add-Type -AssemblyName System.IO.Compression.FileSystem;
[System.IO.Compression.ZipFile]::ExtractToDirectory(Download Location, "C:\Program Files\Java");
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-13.0.2", [System.EnvironmentVariableTarget]::Machine);
[System.Environment]::SetEnvironmentVariable('Path', $env:Path + ";C:\Program Files\Java\jdk-13.0.2\bin", "Machine")
Проверка script:
(Get-Command java | Select-Object -ExpandProperty Version).tostring()
, если работает правильно, скрипт проверки возвращает: 13.0.2.0
Код c#, через который я вызываю эти сценарии:
public void Execute(string script)
{
using (var ps = PowerShell.Create())
{
var runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
ps.Runspace = runspace;
ps.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted");
ps.AddParameter("Scope", "Process");
ps.AddScript(script);
var data = ps.Invoke();
runspace.Close();
}
}
public async Task ExecuteAsync(string script)
{
using (var ps = PowerShell.Create())
{
var runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
ps.Runspace = runspace;
ps.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted");
ps.AddParameter("Scope", "Process");
ps.AddScript(script);
await Task.Factory.FromAsync(ps.BeginInvoke(), result => ps.EndInvoke(result));
runspace.Close();
}
}
кажется, что это наиболее легко воспроизвести, если я создаю команду на другом компьютере и запускаю сценарии, но мне удалось воспроизвести это на моем локальном компьютере.