5. Windows Powershell Cmdlets 介绍
在使用Powershell的时候,你可以直接的在shell的命令行里面输入命令,你也可以直接把相同的命令保存为一个文本文件。这个脚本文件被称为cmdlet,可以在Powershell中直接调用。
和其他的脚本语言一样,用记事本来创建和编写脚本足够够用的。在Powershell中,你只需要把cmdlet保存为PS1格式的文件 即可。写脚本文件有两个额外的好处,它可以对你的命令归档,这样你就不会忘掉;另外cmdlet文件也见证了你使用Powershell所取得的成果。

Powershell Cmdlets (读command lets)

一般来说, cmdlet 有两层意思
第一层意思:它是 Powershell脚本的同义词,一个Powershell Cmdlets是一系列的命令组成,它可能多过一行,并且保存在PS1格式的文本文件中。这,就是我们今天需要讲的Cmdlets
第二层意思:在微软的文档中,cmdlet 意思就是Powershell中的内置命令,它具有简单的动-名词格式,这类cmdlet一般都有别名(alias), 比如 get-member就有个别名是GM
cmdlets 的优势
如果你曾初步的接触过Powershell的命令行,你可能很希望把你的代码保存为自己的Cmdlet文件。这样你以后就可以直接使用,并且如果代码变得越来越复杂,那这种方法就变得更加实用了。
我的做法是,一旦某个cmdlet能够满足基本目的,我就把他复制下来“另存为”,这样以后的开发也可以用得到。我的经验是,在调试的时候,十有七八都会出错,但是由于我有“复件”cmdlet, 我可以马上调整过来。
我希望你对Cmdlet有了个初步的了解。尽量完善你的Powershell命令,一旦完成后就把他保存为文本文件,以后再调用。这种办法能够帮你节省输入代码和命令行的时间。另外,你可以直接的通过.\文件名来调用,比如,.\memory.
这样,使用Powershell的cmdlet已经成为我编写脚本的重要方法之一。

三步快速上手Powershell cmdlets

创建Windows Powershell Cmdlets很简单直接,也相当有价值。如果想让你的脚本执行顺利,你需要遵守三个重要步骤
  1. 1. 出于安全考虑,操作系统默认不会自动执行Powershell 脚本,因此,我们需要调整 ExecutionPolicy 来确保Powershell脚本运行。最佳方法是使用下列命令:set-ExecutionPolicy RemoteSigned.
clip_p_w_picpath002
clip_p_w_picpath004
当然修改对应的注册表也可以
  1. 2. 确保你的文件后扩展是.ps1
  2. 3. 从Powershell命令行调用该文件的办法是:输入完整路径 D:\script\filename
  3. 如果你已经在D:\scripts, 只要输入.\filename
clip_p_w_picpath006

  • 提示1:如何快速调用子目录的cmdlet。比如D:\scripts是我的主脚本目录,我把cmdlets保存在里面的子目录,比如D:\scripts\wmi\32proc.ps1。而我现在的Powershell命令行就在D:\scripts目录下,这样我只要在命令行输入 .\wmi\32proc 即可
  • 提示2:在调用cmdlet文件时候,没有必要把文件扩展名.ps1也加上去, .\文件名足够了。
  • 提示3 :cmdlets脚本只能在Powershell命令行中使用.\ 才能够调用,这种方法尽管看起来很麻烦,微软是出于安全考虑的才这样做。***,钓鱼者可能会诱使人们去执行恶意的Powershell代码,但是如果直接双击的话并不会执行--- 除非你使用“.\ ”方法来执行

细介绍Powershell Cmdlets

下面的介绍和上面差不多,但我们将一步一步来演示
1 Powershell ExecutionPolicy 命令
我偏向这种方法,这样可以通过Powershell的命令来控制脚本的执行策略,在Powershell命令行中输入下面代码
# PowerShell set-ExecutionPolicy
get-ExecutionPolicy
# Now try:
set-ExecutionPolicy -?
# Here is the crucial command:
set-ExecutionPolicy RemoteSigned

简单来说,你可以直接输入
set-executionpolicy remotedsigned
即可

clip_p_w_picpath004[1]
1b 更改对应 Powershell 注册表
出于安全因素考虑,在默认设置中,微软阻止Powershell直接运行cmdlets脚本。因此我们需要更改特定的注册表键值来允许cmdlets的执行。如果你直接运行cmdlet脚本,你会看到如下的错误信息:“The execution of scripts is disabled on this system"
为此,我们需要更改注册表REG_SZ_ExecutionPolicy的键值,将其更改为RemoteSigned。还有另外两种选择Unrestricted 和Allsigned. 但是,RemoteSigned是最推荐的,因为它允许你运行本地的脚本,而会阻止其他人从另外机器上(比如互联网)***你。
请浏览到下面的键值去更改
HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
把键值更改为
REG_SZ ExecutionPolicy RemoteSigned
clip_p_w_picpath008

2a )文件名和 .ps1 扩展名
当你使用记事本来创建Powershell Cmdlet时候,文件名必须是以.ps1作为扩展名的,如runningprocess.ps1. 有一种办法把你的Powershell命令保存到记事本是,通过菜单,选择另存,选择所有文件,runningprocess.ps1.
为了确认,你可以把“”加入进去,如“RunningProcess.ps1”,请确认文件不是RunningProcess.txt或RunningProcess.ps1.txt
在你filename.ps1的内容就是你在Powershell命令行里面输入的命令。你可以尝试输入get-process在你的测试ps1文件中,然后再执行 (可能看起来太简单,但是我的方法就是保持事件简单而成功)
下面是一些高级演示,只是让你感觉到cmdlet的强大

# RunningServices.ps1 PowerShell Cmdlet
# This script generates a report about Running Services
# Guy Thomas September 2007
# Version 1.5
"" # Insert a blank line
"Report generated at " + (get-date)
"" # Insert blank line
"Services that are running"
get-service | where-object { $_.status -eq "Running"}

clip_p_w_picpath010

学习要点

  • 提示1:实例中最关键的命令就是get-service,
  • 提示2:让我们看看Where 这个参数,{$_. 是一个需要介绍的特殊变量。在当前的管道中,美元符号$表明我们正在使用变量,下划线符号表明变量值在后面。进程对象有很多属性,我们这边使用的是.status, -eq 意思是左边的值等于右边的值。这个句子也就是,我们在找这样的值,值的条件是status是Running的。
  • 除-eq外,我们还有比较符, -match, -contain (等于以及包含)

  • 提示2b调用文件
  • 设想:你把cmdlets脚本文件保存在一个目录里,目录是D:\scripts,在这个例子里,文件是为runningservices.ps1
  • 当通过调用文件名来执行cmdlet,你并不需要加入.ps1扩展名。但是你还是需要注意路径,你需要在命令行里面输入完整路径,如D:\scripts\runningservices. 这样可以执行。
在成功的基础上,我们再进一步。 通过下面方法在Powershell里面定位到D:\Scripts目录,
set-location d:\scripts

现在你就可以简单输入命令 .\runningservices, 而不用输入 d:\scripts\runningservices
clip_p_w_picpath012
在输入的时候,你还可以考虑使用Tap键的自动完成功能来填写路径以及文件名
下面还有些Powershell Cmdlets 的例子
Powershell 中的复制粘贴
如果,不管什么原因,你不想使用cmdlet了。我们也可以执行它,把命令从记事本里面复制出来,粘贴到Powershell的命令行中。
复制和粘贴办法
  • · 复制代码到内存
  • · 启动Windows Powershell
  • · 编辑---〉粘贴
  • · 按“回车”来执行代码
  • · 你可以参考下面的截图
clip_p_w_picpath014

总结:Windows Powershell的Cmdlets

当你执行Powershell命令的时候,你可以直接在Powershell命令行中输入相关命令,或者你可以创建村民dlets脚本,然后你通过Powershell命令行来调用。
请记住,不管你要使用什么Powershell脚本,把ExecutionPolicy 设为RemoteSigned,这样你就可以执行本地的脚本了。
你可以直接在命令行里输入
Set-executionpolicy remotesigned
当然,修改对应的Powershell注册表键值也可以允许通过Powershell命令行来执行.ps1文件