В настоящее время я пытаюсь создать сценарий очистки потока с помощью powershell, инициированного из IIS. Я создал потоковый процесс «Убить процесс по владельцу», используя удаленное взаимодействие powershell, работающий из того же списка серверов, что и мой сценарий очистки, и это работает без проблем.
$jobs = @()
foreach ($comp in $comps) {
$jobs += start-job -FilePath ("CleanupJob.ps1") -ArgumentList $comp, $username
Write-Host "Started Job on: $comp"
}
foreach($job in $jobs)
{
$job | wait-job | out-null
receive-job $job.ID
}
Remove-Job -State Completed
Когда я запускаю свой скрипт из консоли powershell, все работает отлично, основной поток запускает 28 новых процессов, которые запускают удаленное соединение с каждым сервером и ждут завершения всех заданий. Когда они завершены, я получаю свой вывод, и хост-поток существует. Все работает по плану.
Не так, когда я запускаю его из своего приложения asp.net, я получаю «Начатое задание: $comp» для каждого из моих 28 серверов, но только результат первых 14, а затем поток хоста просто сидит там. (пока я не убью его огнем, и мой вывод не вернется на веб-страницу asp.net)
У меня нет возможности увидеть, что происходит в сценарии, когда я запускаю его со страницы asp.net. Все, что я вижу, это падение использования ЦП/ОЗУ до тех же уровней, что и при запуске из PSconsole, но мой основной поток никогда не закрывается. Поэтому я верю, что скрипт работает так, как предполагалось, но моя веб-страница зависает до тех пор, пока основной поток не закроется (чего, как было сказано, никогда не происходит).
Вот как я называю свой скрипт (не так, как в .net ‹3 powershell :)
public string RunProgramme(string scriptpath, string arguments)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"powershell.exe";
startInfo.Arguments = "& \'"+scriptpath+"\' "+ arguments;
//return startInfo.Arguments;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string errors = process.StandardError.ReadToEnd();
return output;
}
Тайна углубляется, добавил эту строку в свои ветки работы
Invoke-Command -Session $session -ScriptBlock {param($path) net send mymachine $path} -Args $msg
И когда я запускаю свой скрипт из IIS, я получаю сообщение от каждой машины. Как показывает использование моей оперативной памяти, все задания выполняются, но вывод не возвращается должным образом, и мой хост-поток просто сидит там... ждет...