Как получить стандартные модули ps для импорта в C # core 2.2? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь создать запланированное задание с помощью powershell sdk в ядре 2.2, но при запуске я получаю несколько исключений в конвейере для не найденных командлетов:

The term 'Register-ScheduledTask' is not recognized as the name of a cmdlet, function, script file, or operable program.

Я использовал код из следующего поста в блоге Кейта Бабинека: https://blogs.msdn.microsoft.com/kebab/2014/04/28/executing-powershell-scripts-from-c/

Это отлично запускает другие скрипты PowerShell (у которых нет "причудливых" модулей).

Здесьэто код:


        public async Task<int> ExecuteAsynchronously(string script)
        {
            //This finds the modules but I cannot use them, even when I try to import them with the "Import-Module" command
            InitialSessionState iss = InitialSessionState.CreateDefault();
           iss.ImportPSModulesFromPath(@"C:\Windows\System32\WindowsPowerShell\v1.0" );

            Console.WriteLine("ExecutingPowerShell: " + script);
            try
            {
                using (var runspace = RunspaceFactory.CreateRunspace(iss))
                {
                    runspace.Open();

                    using (PowerShell PowerShellInstance = PowerShell.Create())
                    {
                       PowerShellInstance.Runspace = runspace;

                        Pipeline pipeline = runspace.CreatePipeline();


                        var command =  File.ReadAllText(script);

                        PowerShellInstance.AddScript(command);


                        PSDataCollection<PSObject> outputCollection = new PSDataCollection<PSObject>();
                        outputCollection.DataAdded += outputCollection_DataAdded;

                        PowerShellInstance.Streams.Error.DataAdded += Error_DataAdded;

                        try
                        {
                           Console.WriteLine("running task");
                            IAsyncResult result = await Task.Run(() => PowerShellInstance.BeginInvoke<PSObject, PSObject>(null, outputCollection));
                            Console.WriteLine("finished running task");

                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }

                        Console.WriteLine("Execution has stopped. The pipeline state: " + PowerShellInstance.InvocationStateInfo.State);

                        foreach (PSObject outputItem in outputCollection)
                        {

                            Console.WriteLine(outputItem.BaseObject.ToString());
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                 Console.WriteLine(ex.Message);
            }

            return 0;
        } 

Вот скрипт ps:

$Trigger = New-ScheduledTaskTrigger -AtStartup
$Settings = New-ScheduledTaskSettingsSet -Hidden -Compatibility Win8
$Settings.ExecutionTimeLimit = 'PT0S' 
$Principal = New-ScheduledTaskPrincipal -RunLevel Highest
$Task = New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Settings

Register-ScheduledTask -TaskName 'Launch Webserver' -InputObject $Task

Вот соответствующие установленные пакеты:

Microsoft.Management.Infrastructure        {1.0.0}    
Microsoft.PowerShell.SDK                   {6.2.3}    
System.Management.Automation               {6.2.3}   

Это работает на win10 (Мне пришлось добавить / взломать цель win10 x64 в .pubxml). Он кодируется в VS2019.

У меня есть способ создания запланированных задач в c #, но я хочу, чтобы этот метод мог запускать все, что использует модули в:

C:\Windows\System32\WindowsPowerShell\v1.0\Modules

Спасибо за любую помощь! Я сбит с толку!

...