codecamp

Powershell学习笔记——Powershell控制台和脚本文件

安装Powershell

  如果是Windows 7,那么Powershell 2.0已经预装了。不过Windows XP就没那么幸运了,需要自己安装Powershell。Windows XP的Powershell 2.0集成在Windows Management Framework Core中,下载地址有点长,在这里:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=60cb5b6c-6532-45e0-ab0f-a94ae9ababf5#QuickDetails。如果搜索的话,就搜KB968930。

  如果想知道是否已经安装了Powershell,有个很简单的办法:用[Win+R]打开“运行”窗口,输入“powershell”,回车。如果打开了Powershell控制台,那就是已经安装了Powershell啦。如果想查看Powershell的版本,有好几种办法,比如

  1. PS F:\> $Host.Version.ToString() 
  2. 2.0 
  3. PS F:\> $PSVersionTable 
  4.  
  5. Name                           Value 
  6. ----                           ----- 
  7. CLRVersion                     2.0.50727.4961 
  8. BuildVersion                   6.1.7600.16385 
  9. PSVersion                      2.0 
  10. WSManStackVersion              2.0 
  11. PSCompatibleVersions           {1.0, 2.0} 
  12. SerializationVersion           1.1.0.1 
  13. PSRemotingProtocolVersion      2.1 
  14.  
  15.  
  16. PS F:\> Get-Host 
  17.  
  18.  
  19. Name             : ConsoleHost 
  20. Version          : 2.0 
  21. InstanceId       : 6632b7de-43d1-4ad1-8fcf-f632bdbd8387 
  22. UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface 
  23. CurrentCulture   : zh-CN 
  24. CurrentUICulture : zh-CN 
  25. PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy 
  26. IsRunspacePushed : False 
  27. Runspace         : System.Management.Automation.Runspaces.LocalRunspace 
  28.  
  29.  
  30.  
  31. PS F:\> 

设置Powershell控制台

  从开始菜单启动“Windows Powershell”,或者通过“运行→powershell”打开的就是Powershell的控制台窗口。默认的控制台是80字符x25字符大小,黑底白字的窗口,不过这些都可以自定义。

  和CMD控制台窗口一样,右键单击Powershell控制台窗口的顶部标题栏位置,在弹出的菜单中选择“属性”,即可打开控制台窗口的属性对话框。这个对话框有4个标签页:“选项”、“字体”、“布局”、“颜色”。

√ 选项 - 这里最有用的设置就是“快速编辑模式”。如果勾选了这个选项,那么在控制台窗口中进行文字的选择、拷贝和粘贴就会非常方便:直接在控制台窗口中拖动鼠标,矩形选区内的内容就被选中了;再单击鼠标右键,选中的内容就被放入了Windows剪贴板,同时选区被取消。当剪贴板内有文本内容的时候(不管是从控制台拷贝的还是从其它地方拷贝的),在控制台窗口内,无选区的状态下,单击右键,则剪贴板中的内容就被粘贴出来了——这一切都很方便。但是,如果不勾选“快速编辑模式”,那么上述操作都需要通过右键菜单来进行,操作比较繁琐。顺便提一下,在快速编辑模式下,右键直接是复制/粘贴操作,不会弹出右键菜单,那需要编辑上下文菜单的时候,就要在窗口标题栏位置单击鼠标右键,并在弹出菜单的“编辑”子菜单中去找需要的编辑命令啦。
√ 字体 - 就是在非常有限的字体列表里选择一个顺眼的,再挑个合适的大小就行啦。
√ 布局 - 这里需要设置两个宽度和高度,它们都是以字符为单位而不是以像素为单位的。“窗口大小”里设置的宽度和高度直接影响控制台窗口显示的大小;而“屏幕缓冲区大小”则用于设置文本缓存区的矩形区域大小。缓冲区大小不能小于窗口大小。如果缓冲区大小大于窗口大小,则在窗口上会出现滚动条,通过拖动滚动条来查看缓冲区在当前窗口以外的内容。一般情况下,窗口宽度和缓冲我宽度设置为同样的值,但可以将缓冲区的高度设置得大一些,比如3000、6000、或者9999——内存不是问题,但更高的缓冲区意味着可以看到更多的历史信息。
√ 颜色 - 如果不喜欢黑底白字,那在这里就可以改变啦。比如,可以将“屏幕背景”设置为白色,将“屏幕文字”设置为深灰色。这样控制台窗口就变成白底黑字啦——应该是灰字,相比黑色字体,灰色字体没那么刺眼一些。

  设置完并“确定”之后,设置的内容被保存,同时窗口会根据设置立即改变。关闭控制台窗口之后,下次以同样的方式打开Powershell控制台窗口,那么这些设置都会自动加载并应用。

  为什么要说“同样的方式打开”?如果常用CMD的话,这原因是一样的,所以这些设置的保存都与Powershell的快捷方式有关。不用知道Windows是通过什么样的方式让设置与快捷方式相关的,但效果就是,通过不同的快捷方式打开的Powershell控制台,应用的是不同的设置。比如,通过开始菜单打开的Powershell和通过“运行”窗口打开的Powershell,两个控制台窗口的设置就是不同的。

Powershell控制台的快捷键

  Powershell控制台的快捷键和CMD控制台的快捷键一样,常用的有如下一些:

← →
左右移动光标
↑ ↓
在命令历史中滚动选择历史中的命令,便于重复执行命令,当然也可以先修改再执行
Home
将光标移动到当前命令的第1个字符位置
End
将光标移动到当前命令的最后1个字符之后
Ctrl+Home
从当前位置开始,清除当前命令中前面所有字符
Ctrl+End
从当前位置开始,清除当前命令中后面所有字符
Backspace
向前删除1个字符
Del
向后删除1个字符
Esc
清除当前已经输入的命令
F3
显示上次执行的命令。如果通过↑和↓键选择了历史命令,并通过Esc、Backspace、Del清除或删除了部分内容,则F3可以恢复显示这条历史命令。如果按F3之前输入了部分内容,那F3显示的历史命令中相应的位置由输入的字符替代。(这个说起来很麻烦,自己试试就知道了)
Tab
输入命令时补全命令、文件,或者对象成员

Powershell脚本文件

  Powershell脚本文件是以.ps1作为扩展名的。曾经以为.ps1是Powershell 1.0的脚本文件扩展名,而Powershell 2.0的脚本文件扩展名是.ps2,但经过试验,Powershell目前不管哪个版本,都不认.ps2这个扩展名。

  Powershell只认识ANSI编码(在简体中文Windows下就是GBK)的脚本文件。如果你把脚本文件用UTF-8格式保存,而脚本中又正好有中文的话,Powershell在执行脚本的时候会将中文都显示成乱码,偶尔还会报告语法错误。

  示例说话,先来个Hello World:

  1. #hello.ps1 
  2. "Hello World" 

  脚本中的第1句注释不是必须的——对了,Powershell脚本使用#号来标记行注释,#可以出现在一行的行首,也可以是其它位置,总之,一行内在它之后的内容都被认为是注释内容了——回头来说,这个脚本只干了一件事情,就是输出Hello World。

  是不是有点疑惑,因为这里没有看到任何一个命令。是的,Powershell就是这么神奇,常量值、变量值或者通过表达式运行出来的值,可以直接输出到控制台。所以Powershell可以用作计算器,比如,在控制台中输入命令:

  1. PS F:\>1 + 3 * 4 # 这将会直接输出运算结果13 
  2. 13 

  扯远了。现在回过头来运行hello.ps1,不过很遗憾,如果你是第一次执行Powershell脚本,那么有可能会得到一个错误消息:

  1. PS F:\> .\hello.ps1 
  2. 无法加载文件 F:\hello.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 "get-help about_signing"。 
  3. 所在位置 行:1 字符: 12 
  4. + .\hello.ps1 <<<< 
  5.     + CategoryInfo          : NotSpecified: (:) [], PSSecurityException 
  6.     + FullyQualifiedErrorId : RuntimeException 

  错误报告说系统禁止执行脚本——因为Powershell的执行策略阻止了这个被它认为不安全的脚本运行。

  Powershell的执行策略有4个:

  1. Restricted(受限),这个策略完全不允许任何脚本执行;
  2. AllSigned(所有已签名),这个策略允许通过受信任的数字签名的脚本执行;
  3. RemoteSigned(远程下载需签名),这个策略不限制本地创建的脚本执行,但是对于来自网络的脚本,则需要有受信任的数字签名才能执行;
  4. Unrestricted(无限制),只要是个.ps1脚本都可以执行。

  当前使用的什么执行策略,可以通过“Get-ExecutionPolicy”查看;默认情况下,Powershell的执行策略是Restricted。为了方便进行练习,可以通过“Set-ExecutionPolicy”命令将执行策略改为“RemoteSigned”,就像这样

  1. PS F:\> Get-ExecutionPolicy # 查看当前的执行策略 
  2. Restricted 
  3. PS F:\> Set-ExecutionPolicy RemoteSigned # 回车后会有确认提示,当然选Y 
  4. 执行策略更改 
  5. 执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies 
  6. 帮助主题中所述的安全风险。是否要更改执行策略? 
  7. [Y] 是(Y)  [N] 否(N)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): Y 
  8. PS F:\> 

  现在,Hello World终于运行出来了

  1. PS F:\> .\hello.ps1 
  2. Hello World 
  3. PS F:\> 

  知道为什么要在hello.ps1前面加上“.\”么?如果有研究精神,就该试试不加“.\”的hello.ps1。虽然执行会出现错误,但错误信息里说得很清楚,包括为什么这样不行,以及应该怎么样。

寻求帮助

  既然已经开始使用Powershell,那么有两个伙伴会一直陪伴你的Powershell生涯:错误信息和Help。

  中文Windows下的Powershell,其大部分错误信息都包含有中文的说明,请不要忽略它,因为如果不了解错误原因,就不清楚该如何去更正。而错误信息正是了解错误原因最直接的途径。

如果不清楚该怎么做,Help通常会提供给你非常有效有信息。比如,直接在控制台里输入Help并回车,控制台里就会出现一大段文字说明Help可以干什么,并在备注里提供了一些有效的参考信息。然后就可以根据提示尝试一下“help get-command”,从新的信息中你就可以接触到Powershell中的各种命令了——哦,在Powershell中它们叫Cmdlet。 

Powershell学习笔记——了解Powershell
Powershell学习笔记——变量和命令
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }