- 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释放它所维持的对象然后进程被关闭。(这回确实关闭了。)
--------为懒人准备的回复方式,点击下面的按钮回复(请勿重复点击)-------
作者:gracestoney
出处:http://www.cnblogs.com/gracestoney/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的csdn博客中-Gracestoney。