Вызов командлета PowerShell в Do tNet Core (C#) - PullRequest
0 голосов
/ 18 марта 2020

Я разработал модуль PowerShell. На самом базовом уровне c модуль просматривает папку и создает большой двоичный объект в контейнере Azure Учетная запись хранения. Я хотел бы запустить его как Windows Сервис, написанный на C#. Я знаю, что есть более простые способы, но я использую его в качестве учебного упражнения.

Часть проекта PowerShell работает.

Служба запускается, а затем сразу останавливается с ошибкой:

`Термин« Invoke-FileSystemWatcher »не распознается как имя командлета, функции, файла сценария или работоспособной программы.

(Invoke-FileSystemWatcher - это командлет в модуле).

Оператор File.Exists() if возвращает true.

Существует несколько ссылок на эту ошибку в Inte rnet, включая некоторые здесь, в SO. Я испробовал все их предложения, но не смог "увидеть" командлет.

Ниже приведен файл моего класса (бородавки и все):

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using System.Management.Automation;
using System.Management.Automation.Runspaces;

namespace arc.ocr.windows.service
{
    public class PSArcOcrUploader : BackgroundService
    {

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            WriteEventLog _log = new WriteEventLog();

            // Test path to PS module
            string moduleFile = @"C:\path\to\myModule.psd1";
            if( File.Exists(moduleFile))
            {
                _log.Write($"Module file found: {moduleFile}", 18399, logTypeEnum.Information);
            } 
            else
            {
                _log.Write($"Module file not found: {moduleFile}", 18398, logTypeEnum.Error);
            }

            // Call the InitialSessionState.CreateDefault method to create
            // an empty InitialSessionState object, and then add the
            // elements that will be available when the runspace is opened.
            InitialSessionState iss = InitialSessionState.CreateDefault();
            iss.ImportPSModule(new string[] {moduleFile});

            SessionStateVariableEntry var1 = new SessionStateVariableEntry("PathToMonitor", "C:\\Temp\\Inbox", "Target folder for MFD scans.");
            iss.Variables.Add(var1);

            // Call the RunspaceFactory.CreateRunspace(InitialSessionState)
            // method to create the runspace where the pipeline is run.
            Runspace runspace = RunspaceFactory.CreateRunspace(iss);
            runspace.Open();

            // Call the PowerShell.Create() method to create the PowerShell object,
            // and then specify the runspace and commands to the pipeline.
            // and create the command pipeline.
            PowerShell ps = PowerShell.Create();
            ps.Runspace = runspace;
            ps.Commands.AddCommand("Invoke-FileSystemWatcher");
            //ps.AddCommand("Invoke-FileSystemWatcher");
            //ps.AddArgument("PathToMonitor");
            //ps.AddParameter
            ps.Invoke();
            // Call the PowerShell.Invoke() method to run the pipeline synchronously.
            // foreach (PSObject result in ps.Invoke())
            // {
            //     Console.WriteLine("{0,-20}{1}",
            //         result.Members["Name"].Value,
            //         result.Members["Value"].Value);
            // } // End foreach.

            // Close the runspace to free resources.
            if (stoppingToken.IsCancellationRequested) 
            {
                runspace.Close();
            }
            return null;

        }
    }
}

Могут быть и другие Проблемы, однако, это мой текущий блокировщик.

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

TIA

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