四、PowerShell运⾏命令
四、PowerShell运⾏命令
⽂章⽬录
本章只是运⾏命令和命令⾏⼯具,没有脚本、没有编程语⾔。
PowerShell,如其名称所⽰,是⼀个Shell。它与UNIX的Shell也⼗分类似,⽐如说20世纪80年代后期的Bash,甚⾄是20世纪70年代⾯世的最原始的UNIX Bourne Shell。
这些语⾔和⼤多数编程语⾔⼀样,你在⽂本编辑器(即使是Windows记事本)中键⼊⼤量关键字形成脚本。当脚本完成保存为⽂件后,可能还需要双击该⽂件进⾏测试。PowerShell能够以这种⽅式⼯作,但这并不是PowerShell的主要⼯作模式,尤其是当你开始学习PowerShell时。使⽤PowerShell,你输⼊⼀个命令,然后通过添加⼀些参数来定制化命令⾏为,单击返回,⽴刻就能看到结果。
最终,你会厌倦⼀遍遍输⼊同样的命令(和参数),然后你会将其复制粘贴到⼀个⽂本⽂件中,并将⽂件的扩展名更名为.PS1,然后你瞬间就拥有了⼀个“PowerShell脚本”。现在,你不再需要⼀遍遍输⼊命令,⽽是直接执⾏该⽂件中的脚本。这也和你在 Shell中使⽤的批处理⽂件是同⼀种模式,但相较于脚本或编程⽽⾔却要简单许多。实际上,这与UNIX管理员使⽤多年的模式很类似。通⽤
UNIX/Linux shell,⽐如Bash,也是类似的⽅式:运⾏命令,直到你获得正确的结果,然后将这些命令粘贴到⼀个⽂本⽂件中,并称之为脚本。
1、剖析⼀个命令
为了确保你能够完全熟悉PowerShell的规则,下⾯更详细地阐述上图中的每⼀部分。
名称为Get-EventLog的Cmdlet。PowerShell Cmdlet总是以这种动词-名词形式命名。
第⼀个参数名称为-LogName,并赋值为Security。由于参数值中并不包含任何空格或标点符号,因此并不需要⽤引号括起来。
第⼆个参数名称为-ComputerName,以逗号分隔列表的形式赋了两个值:Win8和Server1。由于这两个参数中都不包含空格或标点符号,因此这两个参数都不需要⽤引号括起来。
最后⼀个参数是-Verbose,是⼀个开关参数。这意味着该参数⽆须赋值,仅仅指定参数即可。
注意:
在命令名称和第⼀个参数之间必须有空格。
参数名称总是以英⽂短横线(-)开头。
参数名称之间必须有空格,多个参数值之间也必须有空格。
⽆论参数名称之前的破折号,还是参数值本⾝包含的破折号,都不需要加空格。
PowerShell不区分⼤⼩写。
请逐渐习惯这些规则,并开始对这种精确、优雅的输⼊⽅式敏感。多注意空格、破折号和其他部分可以最⼤程度减少PowerShell报低级错误的机会。
2、Cmdlet命名惯例
Cmdlet是⼀个原⽣的PowerShell命令⾏⼯具。该术语仅仅存在于PowerShell和类似C#的.Net Framework语⾔中。Cmdlet仅仅出现在PowerShell中,所以当你在Google或Bing搜索该关键字时,返回
结果主要是关于PowerShell的。该术语读⾳为“command-let”。
函数和Cmdlet类似,但不是以.Net语⾔编写,⽽是以PowerShell⾃⼰的脚本语⾔编写。
⼯作流是嵌⼊PowerShell的⼯作流执⾏系统的⼀类特殊函数。
应⽤程序是任意类型的外部可执⾏程序,包括类似PING、Ipconfig等命令⾏⼯具。
命令是⼀个通⽤的术语,⽤于代表任何或所有上⾯提到的术语。
微软已经为Cmdlet建了⼀个命名惯例。因此同样的命名规则也应该被⽤于函数和⼯作流。虽然微软并没有强制要求,但开发⼈员应该遵循该惯例。
规则应该以标准的动词开始,⽐如Get、Set、New或Pause。
并不是所有所谓的动词都是动词。虽然微软官⽅使⽤术语“动词-名词命名规范”,你仍然能看到类似New、Where等“动词”,请逐渐习惯吧。
3、别名:命令的昵称
虽然PowerShell命令名称⾜够好,并具有良好的⼀致性,但仍然可能很长。类似Set-WinDefaultInputMe
thodOverride的命令名称,即使有Tab键补全,对于输⼊来说也是太长。虽然命令名称⾮常清晰——看到名称就能⼤概猜到其功能,但对于输⼊来说还是太长。
这也是为什么需要PowerShell别名。别名仅仅是命令的昵称。
⽆论是否使⽤别名,命令的⼯作⽅式不会变。参数还是原来的参数,其他部分也不会有任何改变——仅仅是命令名称变得更短。如果你习惯使⽤UNIX或Linux,就会知道别名也可以包含⼀些参数,只是记住PowerShell并不是以这种⽅式⼯作。
如果你看到⼀个别名(⽹上的⼀些家伙倾向于使⽤别名,就好像我们都能够记住所有150个内置别名)⽽不知道其含义,请查阅帮助。
你可以使⽤New-Alias创建⾃定义别名,使⽤Export-Alias导出别名列表。当创建⼀个别名时,其⽣命周期只能持续到当前的Shell会话结束。⼀旦关闭窗⼝,别名就会不复存在。这也是你需要导出别名的原因,以便后续重新导⼊。
我们通常会避免创建和使⽤⾃定义别名,因为这些别名除我们之外的别⼈⽆法使⽤。如果某个⽤户⽆法查到xtd的含义,这会导致混淆。xtd仅仅是我们编造的⼀个假的别名,不会做任何⼯作。
我们必须指出,由于现在PowerShell可以在⾮Windows系统中可⽤,因此别名的意义会根据环境的不同
有所区别,⽐如说,Linux。在Linux中,别名可以作为⼀种运⾏⼀个包含⼀堆参数的命令的快捷⽅式。PowerShell却⾮如此。⼀个别名仅仅是命令名称的⼀个昵称,别名⽆法包含任何预定义的参数。
4、使⽤快捷⽅式
果你希望在⽹络上“偷取”(或者再利⽤)其他⼈的⽰例代码,那⾸先需要懂得如何看懂它。
除了作为快捷⽅式的命令的别名之外,参数也同样可以使⽤别名。总共有三种⽅式可以实现这⼀点,每⼀种都可能造成混淆。
简化参数名称
PowerShell并不强制要求输⼊完整的参数名称。例如,你可以通过输⼊-comp代替-ComputerName,简化的规则是必须输⼊⾜够的字母让PowerShell可以识别不同参数。如果既存在-composite参数,也存在-computerName以及-common参数,你⾄少要输⼊-compu、-commo和-compo。这是由于上述值是唯⼀识别参数所需要输⼊的最少部分。
参数名称别名
尽管参数的别名不在帮助⽂件或任何⽅便查阅的地⽅⽽难以识别,但参数也拥有别名。⽐如说,Get-EventLog命令有-ComputerName参数。可以运⾏下述命令,查阅该参数别名。
PS C:\> (get-command get-eventlog | select -ExpandProperty parameters)    . computername.aliases
上述命令已经⽤粗体标出命令和参数名称。你可以⽤任意你希望了解的命令和参数名称进⾏替换。在本例中,数据结果展⽰了-Cn是-computerName的别名,所以你可以运⾏下述命令。
PS C:\> Get-EventLog -LogName Security -Cn SERVER2 -Newest 10
Tab键补全将会展⽰出-Cn这个别名。如果你输⼊Get-EventLog –C并开始按Tab键,该别名将会出现。但是命令的帮助并不会显⽰关于-Cn的任何信息,且Tab键补全并不会显⽰-Cn和-ComputerName实际上是同⼀个命令。
位置参数
当你在帮助⽂件中查看命令语法时,你可以很容易认出位置参数。
5、Show-Command
powershell怎么以管理员身份运行尽管我们拥有多年使⽤PowerShell的经验,但命令语法的复杂度有时依然会让我们抓狂。PowerShell v3(以及更新版本,虽然不包含⾮Windows操作系统)提供的⼀个⾮常棒的特性是Show-Command commlet。如果你在命令语法⽅⾯遇到困难,包括空格、破折号、逗号、引号或是其他⽅⾯,Show-Co
mmand将成为你的助⼿。该命令允许你指定你⽆法⽤对的命令名称,并以图形化的⽅式将命令的参数名称展⽰出来。
注意该功能⽆法在没有安装GUI的服务器操作系统上⽣效。
按照提⽰输⼊⼀些参数,然后点击运⾏即可。
以这种⽅式产⽣的命令,总会是命令的完整形式。完整的命令名称,完整的参数名称,所有的参数名称都显式输⼊(即不会出现位置参数)。因此,这种⽅式可以说是使⽤PowerShell最完美、被推荐并符合最佳实践的⽅式。
不幸的是,Show-Command⼀次只能展⽰⼀个命令。因此,当希望了解多个命令时,只能逐个使⽤该命令。
6、对扩展命令的⽀持
⽬前为⽌,你所有在Shell中运⾏的命令(⾄少是我们建议你运⾏的命令)都是内置Cmdlet。⼤约400个Cmdlet被集成到Windows客户端操作系统中,上千个被集成到Windows服务器版本的操作系统中,并且你还能添加更多——类似Exchange Server、Sharepoint Server 和SQL Server都包含数以百计的额外Cmdlet。
但是你并不会被局限在仅仅使⽤随PowerShell⼀同发⾏的Cmdlet——你还可以使⽤⼀些或许你已经使⽤多年的外置命令⾏⼯具,包括Ping、Nslookup、Ipconfig、Net等。由于这些都不是原⽣PowerShell Cmdlet,因此你可以按照原来使⽤这些命令的⽅法继续使⽤这些命令。PowerShell将会在后台启动Cmd.
exe。由于PowerShell知道如何运⾏扩展命令,因此返回的结果都会被显⽰在PowerShell窗⼝。请尝试运⾏⼀些你已经熟悉的CMD命令。我们经常会被问到如何使⽤PowerShell关联⼀个普通的⽹络驱动器——你可以在对象资源管理器中看到那个。我们经常使⽤的Net Use命令在PowerShell中也能正常⼯作。
在⾮Windows操作系统中也是如此:你可以使⽤grep、bash、sed、awk、ping以及任何可⽤的命令⾏⼯具。这些命令可以正常执
⾏,PowerShell能够以传统shell(例如Bash)同样的⽅式展⽰输出结果。
综合上⾯,我们必须透漏出⼀个严酷的事实:并不是所有的外部命令都可以流畅地运⾏在PowerShell中,⾄少如果你不做⼀些调整是不⾏的。这是由于PowerShell解析  器——Shell的该部分读取你输⼊的内容并尝试解析出你希望Shell执⾏什么——并不是每次都能猜对。有时你输⼊⼀个外部命令,就会导致PowerShell产⽣混乱,输出错误信息,因此命令不会⽣效。
7、处理错误
在刚开始使⽤PowerShell时⽆可避免地会遇见丑陋的红⾊⽂本提⽰,在不同⽔平阶段依然可以遇到,甚⾄当你成为专家级的Shell⽤户时也避免不了。我们都能遇到,但不要让红字把你逼疯。
先不管⽤于警告⽬的的红字,PowerShell的错误信息的⽬的是⽤于帮助。
有时,错误信息并不⼀定很有帮助,就好像你和PowerShell说的不是同⼀种语⾔。当然,PowerShell不可能改变其语⾔,那么只能是你错了,所以你得去改变。通过咨询帮助并拼写出完整的命令和参数,通常都是解决问题的最快⽅式。还有不要忘了使⽤Show-Command出正确语法。
8、常见误区
输⼊Cmdlet名称
⾸先是输⼊Cmdlet名称。该名称永远是动词-名词形式,⽐如说Get-Content。下⾯是我看到的⼀些新⼿尝试输⼊的命令,但显然难以奏效。
Get Content
GetContent
Get=Content
Get_Content
其中⼀些问题是由于输⼊错误(⽐如说“=”,⽽不是“-”),还有⼀些是省略破折号。我们都会将命令读成“Get Content”,省略了破折号。但输⼊时必须输⼊破折号。
输⼊参数
参数同样需要正确书写。参数可以不赋值,⽐如说-recurse,在参数名称之前加上破折号。但必须在Cmdlet名称和参数之间加空格,参数之间也需要空格。下述命令都正确。
Dir –rec(可以使⽤参数名称的简写)
New-PSDrive -name DEMO-psprovider FileSystem -root \Server\Share
但下述写法不正确。
Dir-rec(在名称和参数之间没有空格)
New-PSDrive –nameDEMO(参数和值之间没有空格)
New-PSDrive -name DEMO-psprovider FileSystem(在第⼀个参数值和第⼆个参数名之间没有空格)
PowerShell并不会挑剔⼤⼩写问题,也就是说dir和DIR并⽆不同,RECURSE、-recurse和-Recurse也
是如此。但PowerShell会挑剔空格和破折号的写法。
9、操作练习
1.显⽰正在运⾏的进程列表。搜索process相关内容:
help Get-Process
然后更新:
update-help
搜索并解决更新错误:
Update-Help -ErrorAction SilentlyContinue

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。