• Windows PowerShell每周提示(22):使用Get-History进行自动化脚本编写
    
        Id CommandLine

        -- -----------

         1 cd c:"scripts

         2 get-childitem -recurse

         3 cls

 
        1. 一旦你知道了某个命令编号那么你能够将该值传递给Invoke-History cmdlet然后重新运行脚本.(得到C:"script文件夹中的所有项目的列表)

             Invoke-History 2
          
        注意:你也可以在powershell中按F7 来得到历史命令。并直接点击运行。相比invoke-history,还是F7会方便哦。

        2. a. 用Get-History cmdlet来提取当前PowerShell会话的历史命令记录;然后我们将信息得到储存在名为$a的变量中。当这件事完成之后,$a将会成为一个数组,数组中的每一个项目都和我们的PowerShell中的历史命令记录一一对应

 

                $a = Get-History

 

                foreach ($i in $a)

                    {Add-Content C:"Scripts"Test.ps1 $i.CommandLine}


              注意 如果Test1.ps1文件已存在,那么Add-Content cmdlet将会简单的将数组中的每一项以新的一行附加到文件中。如果Test1.ps1文件不存在,那么Add-Content将会首先创建文件然后开始添加新行
 
            b. 能在一行代码中完成所有这些事

            foreach ($i in Get-History){Add-Content C:"Scripts"Test.ps1 $i.CommandLine}
 
        3. 再次使用范围操作符来提取PowerShell历史命令记录中的一个子集:

            $a = Get-History (4..19)

 

  • Windows PowerShell每周提示(23):一次摆脱所有COM对象

    $x = New-Object -com Excel.Application // 启动Microsoft Excel
    $x.Visible = $True // 使Excel在屏幕上可见
    Start-Sleep 5 // 暂停5秒
    $x.Quit() //关闭Excel.用Quit方法来关闭Excel是不奏效的,可以用get-process -name excel 来查看进程,你会发现excel仍然在后台运行。
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($x) //为有问题的对象递减引用计数器。在本例中,这意味着它将会为我们的Excel实例将引用计数器从1改变至0。这是件好事,一旦引用计数器到达0,CLR释放它所维持的对象然后进程被关闭。
    Remove-Variable x //当你想要删除对象引用$x时,不会遇到因为“尝试使用一个不再有效的对象引用”这个原因所造成的任何问题
  • 注意:
    脚本专家算不上是.NET Framework方面的专家,但是,我们所能说的是,.NET Framework在这些非预期行为方面备受指责。无论何时你从通用语言运行时调用一个COM对象(当你使用Windows PowerShell时这是很常见的事),COM对象被包装在一个RCW(runtime callable wrapper)中,并且引用计数器的计数也相应增加。引用计数器帮助CLR(common language runtime,通用语言运行时)保持对正在运行的COM对象的追踪,也就是说有多少COM对象正在运行。当你从Windows PowerShell中启动Excel时,Excel被包装在RCW中,并且引用计数器增加至1。
    这很好,除了一件事:当你调用Quit方法并结束Excel时,CLR的引用计数器的计数并不减少(也就说它不会重置为0)。因为引用计数器不为0,CLR继续维护其拥有的COM对象:这也意味着我们的对象引用($x)仍然有效并且Excel.exe进程继续运行。这确实不是一件好事情,毕竟,如果我们想要Excel保持运行我们可能也不会调用Quit方法。
    那么我们然后解决这个小问题呢?幸运的是,我们只需在脚本最后添加一行简单的代码:

    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($x)

    我们在这里所做的是深入到.NET Framework(尤其是,System.Runtime.Interopservices.Marshal类)然后调用ReleaseComObject方法,并传递Excel实例的引用对象($x)。那么ReleaseComObject做些什么呢?ReleaseComObject只做一件事:为有问题的对象递减引用计数器。在本例中,这意味着它将会为我们的Excel实例将引用计数器从1改变至0。这是件好事,一旦引用计数器到达0,CLR释放它所维持的对象然后进程被关闭。(这回确实关闭了。)

posted on 2009-08-24 11:08  gracestoney  阅读(158)  评论(0编辑  收藏  举报