В настоящее время я пытаюсь создать многопоточный сценарий очистки с 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. Всевидно, что использование процессора / оперативной памяти падает до тех же уровней, что и при запуске из PSconsole, но мой основной поток никогда не закрывается.Так что я верю, что скрипт работает так, как предполагалось, но моя веб-страница зависает до тех пор, пока основной поток не закроется (чего он никогда не делает, как указано).
Так я называю свой скрипт (не симпатичный.net <3 powershell way:) </p>
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, я получаю сообщение откаждая машина.Как показывает мое использование оперативной памяти, все задания выполняются, но вывод не возвращается должным образом, и поток моего хоста просто сидит ... в ожидании ...