Я разработал модуль 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