Start-ThreadJob не выполняется в файле ps1 при выполнении в классе System.Management.Automation.PowerShellC#

Место общения программистов C#
Ответить
Anonymous
 Start-ThreadJob не выполняется в файле ps1 при выполнении в классе System.Management.Automation.PowerShell

Сообщение Anonymous »

У меня есть сценарий PowerShell, который я выполняю через System.Management.Automation.Powershell.Invoke. в скрипте у меня есть Start-ThreadJob... | Wait-Job...
Запуск сценария в командной строке с помощью pwsh.exe делает именно то, что мне нужно... задание запускается, и Wait-Job вызывает сценарий для приостановки выполнения до тех пор, пока задание не будет выполнено, прежде чем оно продолжится.
Когда я выполняю этот же файл ps1 с помощью метода System.Management.Automation.Powershell.Invoke, задание Start-Thread команда, похоже, не увольняется. Сценарий просто продолжается, и это приводит к тому, что остальная часть моего сценария больше ничего не делает, поскольку он зависит от задания, которое я собираюсь запустить.
Поскольку я знаю, что запускаю команду powershell с помощью pwsh в командной строке работает, я знаю, что моя логика PowerShell верна.
Я также тестировал размещение Start-Sleep в своем коде и выполнение его через .Invoke, и сценарий учитывал паузу перед возвратом вернемся к моей логике .net. Я также попробовал Start-ThreadJob и Start-Job, но ни один из них не работает должным образом. И я не буду проводить никаких исследований.
Я исключаю свой .net-клиент, чтобы скрипт мог выполняться так, как задумано. Это должно позволить сценарию PowerShell приостанавливать выполнение, пока задание запущено и помечено как «Завершено». Я могу получить ожидаемое поведение, если запущу pswh как процесс в dotnet и передам аргументы таким образом, но я чувствую, что это должно работать и через API.
Следующий код является примером что, похоже, не работает:

Код: Выделить всё

$codeBlock = [scriptblock]::Create("kubectl wait --timeout=-1s --for=condition=Failed job/$batchStatus -n $namespace")
$stj = Start-ThreadJob -Name "$batchStatus-failed" -ScriptBlock $codeBlock
"WaitFailed job state after apply: $($stj.Name)"
wait-Job -Id $stj | Out-Null
Распечатка «Ожидание не удалось...» никогда не показывает значение $stj.Name, я предполагаю, что это потому, что $stj никогда не запускается
Логика PowerShell находится в файле с именем Execute.ps1
это моя логика C# для выполнения Execute.ps1

Код: Выделить всё

System.Management.Automation.PowerShell ps = System.Management.Automation.PowerShell.Create();
ps.AddScript(File.ReadAllText(@"C:\powershell\execute.ps1"));
var t = ps.Invoke();
Я думаю, что ps.Invoke() выполнит функцию и дождется завершения работы PowerShell, прежде чем она вернется... $codeBlock в PowerShell должен вызвать сценарий для обработки и ожидания завершения этого задания. Опять же, это прекрасно работает, когда я выполняю команду PowerShell в командной строке pwsh, и только когда я выполняю ее через System.Management.Automation.PowerShell, я вижу такое поведение

Подробнее здесь: https://stackoverflow.com/questions/787 ... gement-aut
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»