0
在C#中,我有以下代码可以通过文本运行脚本。在.ps1文件中调用IIS相关的cmdlet时内存不断增加
public virtual void RunScript(string scriptText)
{
Runspace runspace = RunspaceFactory.CreateRunspace();
Pipeline pipeline = null;
RunspaceInvoke runSpaceInvoker = null;
try
{
runspace.Open();
runSpaceInvoker = new RunspaceInvoke(runspace);
//create pipeline and run the script
pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(scriptText);
pipeline.Commands.Add("Out-String");
pipeline.Invoke();
}
catch(Exception ex)
{
//Log error
}
finally
{
pipeline.Stop();
pipeline.Dispose();
pipeline = null;
runspace.Close();
runspace.Dispose();
runspace = null;
runSpaceInvoker.Dispose();
}
}
并在脚本中,我只是执行以下cmdlet
Get-WebsiteState -Name "Default Web Site"
我的记忆不断每个I执行脚本的时间攀登。当然,这最终将成为一个更大的脚本的一部分,它不仅仅是这一个功能,而且似乎IIS命令的任何组合都会抓住越来越多的内存。我已经尝试:
- 呼叫[System.GC的] ::收集()直接在脚本
- 分配获取-WebsiteState -Name “默认Web站点” 给一个变量,然后 显式调用Remove-Variable以及将其设置为$ null
对我使用的IIS cmdlet的结果没有“Dispose”方法。
需要注意的一件事是,当我在我的机器上执行$ PSVersionTable.PSVersion时,它会为我的版本返回4.0。
目标是能够使用计数器和各种元素向消费者显示网站信息。
我在做什么错?这是滥用IIS命令吗?
任何指导,将不胜感激。
如果你在做大量的IIS操作,我建议直接通过Add-Type C:\ Windows \ System32 \ inetsrv \ Microsoft.Web.Administration使用'Microsoft.Web.Administration' API .dll' – Eris
@Eris我会研究这个。我不打算回收服务器或添加/删除网站,而是从他们的计数器/某些获取cmdlet中读取有关它们的一些基本信息。这仍然有助于开销? – JJMar
我希望如此,因为如果您使用直接API,您不会产生新的PowerShell运行空间。 – Eris