2016-01-18 32 views
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命令的任何组合都会抓住越来越多的内存。我已经尝试:

  1. 呼叫[System.GC的] ::收集()直接在脚本
  2. 分配获取-WebsiteState -Name “默认Web站点” 给一个变量,然后 显式调用Remove-Variable以及将其设置为$ null

对我使用的IIS cmdlet的结果没有“Dispose”方法。

需要注意的一件事是,当我在我的机器上执行$ PSVersionTable.PSVersion时,它会为我的版本返回4.0。

目标是能够使用计数器和各种元素向消费者显示网站信息。

我在做什么错?这是滥用IIS命令吗?

任何指导,将不胜感激。

+0

如果你在做大量的IIS操作,我建议直接通过Add-Type C:\ Windows \ System32 \ inetsrv \ Microsoft.Web.Administration使用'Microsoft.Web.Administration' API .dll' – Eris

+0

@Eris我会研究这个。我不打算回收服务器或添加/删除网站,而是从他们的计数器/某些获取cmdlet中读取有关它们的一些基本信息。这仍然有助于开销? – JJMar

+0

我希望如此,因为如果您使用直接API,您不会产生新的PowerShell运行空间。 – Eris

回答

0

直接使用API​​是答案。仍然不知道为什么我可以使用一些cmdlet而不使用其他,但重新制作它可以很好地工作。

相关问题