在.ps1文件中调用IIS相关的cmdlet时内存增加

时间:2016-01-18 21:27:03

标签: powershell iis

在C#中,我有以下代码来按文本运行脚本。

   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"

每次执行脚本时,我的记忆都会不断攀升。当然,这最终将成为一个更大的脚本的一部分,它不仅仅是这一个功能,但似乎任何组合的IIS命令最终会占用越来越多的内存。我试图:

  1. 直接在脚本
  2. 中调用[System.GC] :: Collect()
  3. 分配Get-WebsiteState -Name"默认网站"变量,然后 显式调用Remove-Variable并将其设置为$ null
  4. 没有" Dispose"我已经使用过的IIS cmdlet结果的方法。

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

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

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

    任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:0)

直接使用API​​就是答案。仍然不确定为什么我可以使用一些cmdlet而不是其他cmdlet,但重做它使它工作得很好。