В настоящее время я пытаюсь создать поточный скрипт очистки с помощью PowerShell, инициированный из IIS. Я создал многопоточную «Kill process by owner» с помощью удаленного взаимодействия 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. Все, что я вижу, это Использование ЦП / ОЗУ падает до тех же уровней, что и при запуске из консоли PS, но мой основной поток никогда не закрывается. Так что я верю, что сценарий работает так, как предполагалось, но моя веб-страница зависает до тех пор, пока основной поток не закроется (чего никогда не происходит, как указано).
Я так называю свой сценарий (а не красивый способ .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, я получаю сообщение от каждой машины. Как показывает мое использование оперативной памяти, все задания выполняются, но вывод не возвращается должным образом, и мой хост-поток просто сидит там ... ждет ...