Запустите PowerShell как 32-разрядный или 64-разрядный из C # - PullRequest
0 голосов
/ 24 июня 2019

Я создаю 32-разрядную .NET DLL, которая выполняет сценарии PowerShell.Мне нужно, чтобы он мог поочередно запускать сценарии как 64-битные и 32-битные.

Я уже знаю, как это сделать с помощью командной строки:

C:\Windows\Sysnative\cmd /c powershell -ExecutionPolicy ByPass "& 'script.ps1' arguments"
C:\Windows\SysWOW64\cmd /c powershell -ExecutionPolicy ByPass "& 'script.ps1' arguments"

Но мне нужно иметь возможность использовать интерфейс к C # либо с классом System.Management.Automation.PowerShell, либо с классом System.Management.Automation.Runspaces.Pipeline, чтобы асинхронно собирать выходные данные из сценария.

1 Ответ

0 голосов
/ 25 июня 2019

Комментарий от @PetSerAl является решением.С пространством выполнения вне процесса я могу изменить битность.

Я копирую его код здесь:

using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
public static class TestApplication {
    public static void Main() {
        Console.WriteLine(Environment.Is64BitProcess);
        using(PowerShellProcessInstance pspi = new PowerShellProcessInstance()) {
            string psfn = pspi.Process.StartInfo.FileName;
            psfn=psfn.ToLowerInvariant().Replace("\\syswow64\\", "\\sysnative\\");
            pspi.Process.StartInfo.FileName=psfn;
            using(Runspace r = RunspaceFactory.CreateOutOfProcessRunspace(null, pspi)) {
                r.Open();
                using(PowerShell ps = PowerShell.Create()) {
                    ps.Runspace=r;
                    ps.AddScript("[Environment]::Is64BitProcess");
                    foreach(PSObject pso in ps.Invoke()) {
                        Console.WriteLine(pso);
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...