Запуск .ps1 Powershell из C# - не работает - PullRequest
0 голосов
/ 04 августа 2020

Для большинства здесь это не новость. Я просмотрел почти все сообщения отсюда и блоги. Это не ошибка.

Я не получаю никаких ошибок. Если я запускаю PowerShell локально, он работает [ожидается, что будет сделан снимок экрана], при запуске из C# скриншоты не будут.

Установлены все необходимые пакеты NuGet. using System.Management.Automation;

Я пытаюсь запустить .ps1 из c#, но не работает. Powershell делает снимок экрана и сохраняет его по указанному пути.

Локально я использую .ps1, как показано ниже, и он делает снимок экрана. Но из c# этого не происходит.

C:\source\Hooks\TestScreenCapture.ps1 -ScreenShotPath C:\source\Hooks\testy.png

Эта функция делает снимок экрана при запуске из селена.

Я написал код c# для ее запуска.

Скрипт расположен по адресу:

var psScript = Path.Combine(AppDomain.CurrentDomain.BaseDirectory.Replace("bin\\Debug\\netcoreapp3.1", "Hooks"), "TestScreenCapture.ps1");

1-й подход:

var startInfo = new ProcessStartInfo()
            {
                FileName = "powershell.exe",
                Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{psScript}\" -ScreenShotPath \"{screenShotFullPath}\"",
                UseShellExecute = false
            };
            Process.Start(startInfo);

2-й подход

var powerShell = PowerShell.Create();
powerShell
          .AddScript($"\"{psScript}\"", false)
          .AddParameter("ScreenShotFullPath", screenShotFullPath)
          .Invoke();

3-й подход

var powerShell = PowerShell.Create();
powerShell
          .AddScript(@"& {psScript} -ScreenShotFullPath {screenShotFullPath}")
          .Invoke();

Я попытался запустить код PowerShell из моего C#, чтобы проверить, работает ли c# или нет, и это работает.

string criteria = "system*";
PowerShellInst.AddScript("Get-Service -DisplayName " + criteria);
Collection<PSObject> PSOutput = PowerShellInst.Invoke();
foreach (PSObject obj in PSOutput)
{
    if (obj != null)
    {
        Console.Write(obj.Properties["Status"].Value.ToString() + " - ");                
        Console.WriteLine(obj.Properties["DisplayName"].Value.ToString());
    }
}
Console.WriteLine("Done");

Проблемы кажутся PowerShell, чтобы сделать снимок экрана из c# не работает.

1 Ответ

0 голосов
/ 04 августа 2020

Сначала установите политику выполнения bypass.

InitialSessionState iss = InitialSessionState.CreateDefault();
        iss.ExecutionPolicy = ExecutionPolicy.Bypass;
        iss.LanguageMode = PSLanguageMode.FullLanguage;
        iss.ThrowOnRunspaceOpenError = true;
PowerShell.Create(iss)

Во-вторых, запустите команду Start-Transcript, чтобы начать транскрипцию.

AddCommand(@"Start-Transcript").AddParameter(@"Path", @"S:\out.txt").Invoke()

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