Сценарий Powershell для получения версии Java застрял - PullRequest
0 голосов
/ 12 марта 2020

У меня есть 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();
    }
}

кажется, что это наиболее легко воспроизвести, если я создаю команду на другом компьютере и запускаю сценарии, но мне удалось воспроизвести это на моем локальном компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...