Windows PowerShell每周提示(22):使用Get-History进行自动化脚本编写
Get-History cmdlet是Windows PowerShell中未被人礼赞的英雄之一。毕竟,Get-History使你能够分步提取在当前Windows PowerShell会话中执行过的所有命令。谁关心这个?好的,无论相信与否,你确实需要关心。例如,假设你正在处理一个异常复杂的命令,然后你最后能使它成功运行。之后你又运行了一些其它的命令,然后你决定重新运行那个复杂的命令。你打算怎么做?好的,一种方法是调用Get-History然后得到你在整个会话中执行过的所有命令的列表:
| Id CommandLine -- ----------- 1 cd c:\scripts 2 get-childitem -recurse 3 cls |
| 注意 好的也许这些都不是特别复杂的命令,但是你明白我们是怎么想的。 |
一旦你知道了某个命令编号那么你能够将该值传递给Invoke-History cmdlet然后重新运行脚本。想要得到C:\script文件夹中的所有项目的列表?下面这个命令将会为你完成这件事:
很漂亮吧?
就如你所看到的,Get-History实际上是一个完美的cmdlet;事实上,它没有做的一件事是为你写脚本。
不过除非你要求它这么做。
现在你不会怀疑,在PowerShell提示符下输入的命令能够直接被用于Windows PowerShell脚本中。事实上,这就是编写PowerShell脚本的一种方式:在命令提示符下不断尝试,一个命令接着一个命令,直到你达到你的目标。一旦你获得成功,你能重新查看历史记录,复制能运行的命令,然后将这些命令粘贴至一个.PS1文件。
或者你能像这样简单运行一个脚本:
| $a = Get-History foreach ($i in $a) {Add-Content C:\Scripts\Test.ps1 $i.CommandLine} |
那么我们在这里做了什么?首先,我们使用Get-History cmdlet来提取当前PowerShell会话的历史命令记录;然后我们将信息得到储存在名为$a的变量中。当这件事完成之后,$a将会成为一个数组,数组中的每一个项目都和我们的PowerShell中的历史命令记录一一对应。因为$a是一个数组,这意味着我们能够建立一个foreach循环来遍历数组中的每一项。在循环内,我们使用这个命令,一个接一个将历史命令记录添加进名为C:\Scripts\Test.ps1的文件:
| {Add-Content C:\Scripts\Test.ps1 $i.CommandLine} |
| 注意 如果Test1.ps1文件已存在,那么Add-Content cmdlet将会简单的将数组中的每一项以新的一行附加到文件中。如果Test1.ps1文件不存在,那么Add-Content将会首先创建文件然后开始添加新行。 |
那将带给我们什么?我们很高兴你这么问;那将给我带来看上去像这样的一个文件:
| cd c:\scripts get-childitem -recurse cls |
无需多说,这也给了我们一个马上就能使用的脚本。
当然,也有可能在这个脚本中包括了很多你不想要使用的命令。但是这没什么关系,使用Get-History将所有命令写入.PS1文件,然后在记事本中打开文件然后就简单的删除你不想要的行。这也比复制和粘贴独立行来的快,当然那也比你自己在文件中输入所有这些行的代码来的快捷和聪明。
或者,再次使用范围操作符来提取PowerShell历史命令记录中的一个子集:
然后对你们中那些想要输入的内容越少越好的人来说,事实证明你能在一行代码中完成所有这些事:
| foreach ($i in Get-History){Add-Content C:\Scripts\Test.ps1 $i.CommandLine} |
使用这个命令,我们不必再为从历史命令记录中提取信息然后将其储存在变量中感到厌烦;取而代之的是,我们只要在我们的foreach循环中引用Get-History cmdlet:
| foreach ($i in Get-History) |
这是Windows PowerShell的一件酷事:你经常能在通常使用变量的地方使用cmdlet作为替代。
不可否认,对某些遇到这个问题的人来说,这不是Windows PowerShell的很重要的一个使用方法。(但是,再一次,也许它是一个很重要的使用方法了;这因人而异)换句话说,这是关于如何使用PowerShell来完成读取事件日志和停止服务以外的事情时的一个很酷的论证。这也是很值得介绍的一些内容,不是么?
下周见。
英文原文
http://www.microsoft.com/technet/scriptcenter/resources/pstips/nov07/pstip1102.mspx