Я пытаюсь создать запланированное задание с помощью 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
Спасибо за любую помощь! Я сбит с толку!