(3)Powershell基础知识(一)
上节介绍了Windows自带的Powershell开发工具:命令行行窗体和集成开发环境ISE的启动及一些配置注意事项,具体细节使劲戳Powershell开发工具。
这一节介绍Powershell的基础知识,包含以下知识点
-
Powershell的一些特性
-
理解Powershell中的一些重要概念
-
理解Powershell中命令的命名规范
-
总结
Powershell的一些特性
Powershell对命令行和脚本环境添加了许多新的功能,以此来改善Powershell的管理和脚本脚本交互能力,想对于其他的命令脚本,Powershell有以下特性。
- 可发现特性
可发现特性是指,Powershell可以轻松发现(找出)与执行具体操作有关的命令。比如现在想对Window服务,即对service进行操作(停止或是启动服务等其它操作),可以通过以下命令来查找与操作service有关的命令。
PS C:\WINDOWS\system32> Get-Command *service
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Restart-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Resume-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Set-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Start-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Suspend-Service 3.1.0.0 Microsoft.PowerShell.Management
从输出结果中,可以看到可以获取指定的service,新建新的service,重启,设置service的一些状态,启动,停止等操作。注意在Definition列,内容并没有完全显示,可以后面会讲到如何调节其输出格式。
通过Powershell的发现特性,找到具体的命令之后,就可以通过Get-Help cmdlet 了解有关该mdlet 的详细信息。例如,要显示有关 Get-Service cmdlet 的帮助,在命令行输入以下命令。
PS C:\WINDOWS\system32> Get-Help Get-Service
NAME
Get-Service
SYNTAX
Get-Service [[-Name] <string[]>] [-ComputerName <string[]>] [-DependentServices] [-RequiredServices] [-Include <string[]>] [-Exclude <string[]>] [<CommonParameters>
]
Get-Service -DisplayName <string[]> [-ComputerName <string[]>] [-DependentServices] [-RequiredServices] [-Include <string[]>] [-Exclude <string[]>] [<CommonParamete
rs>]
Get-Service [-ComputerName <string[]>] [-DependentServices] [-RequiredServices] [-Include <string[]>] [-Exclude <string[]>] [-InputObject <ServiceController[]>] [<C
ommonParameters>]
ALIASES
gsv
REMARKS
Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
-- To download and install Help files for the module that includes this cmdlet, use Update-Help.
-- To view the Help topic for this cmdlet online, type: "Get-Help Get-Service -Online" or
go to https://go.microsoft.com/fwlink/?LinkID=113332.
如果要查看该输出结果的成员信息,比如该输出结果有哪些成员,方法,返回类型等,可以通过管道运算符(|)将其执行结果传递给Get-Member,如输入以下命令可以查看Get-Service输出对象的成员信息(以下是部分输出信息)。
PS C:\WINDOWS\system32> Get-Service | Get-Member
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = ServiceName
RequiredServices AliasProperty RequiredServices = ServicesDependedOn
Disposed Event System.EventHandler Disposed(System.Object, System.EventArgs)
Close Method void Close()
Continue Method void Continue()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
ExecuteCommand Method void ExecuteCommand(int command)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Pause Method void Pause()
Refresh Method void Refresh()
Start Method void Start(), void Start(string[] args)
Stop Method void Stop()
WaitForStatus Method void WaitForStatus(System.ServiceProcess.ServiceControllerStatus desiredStatus), void WaitForStatus(System.ServiceProcess.Serv...
CanPauseAndContinue Property bool CanPauseAndContinue {get;}
CanShutdown Property bool CanShutdown {get;}
CanStop Property bool CanStop {get;}
Container Property System.ComponentModel.IContainer Container {get;}
DependentServices Property System.ServiceProcess.ServiceController[] DependentServices {get;}
DisplayName Property string DisplayName {get;set;}
MachineName Property string MachineName {get;set;}
ServiceHandle Property System.Runtime.InteropServices.SafeHandle ServiceHandle {get;}
ServiceName Property string ServiceName {get;set;}
ServicesDependedOn Property System.ServiceProcess.ServiceController[] ServicesDependedOn {get;}
ServiceType Property System.ServiceProcess.ServiceType ServiceType {get;}
Site Property System.ComponentModel.ISite Site {get;set;}
StartType Property System.ServiceProcess.ServiceStartMode StartType {get;}
Status Property System.ServiceProcess.ServiceControllerStatus Status {get;}
ToString ScriptMethod System.Object ToString();
其中MemberType列是成员信息的属性,是属性,事件,还是方法等。
-
一致性
一致性是Powershell主要优点之一,同一的接口降低了管理任务的复杂性。例如如果你学会了获取Get-Servce的帮助信息,那么就学会了查看所有命令的帮助信息。 -
交互式脚本环境
PowerShell 将交互式环境和脚本环境组合在一起,从而允许访问命令行工具和 COM 对象,同时还可利用 .NET Framework 类库 (FCL) 的强大功能(可以加载调用cmd,exe,dll外部,在企业级实战部分会介绍到)。Powershell对命令提示符进行了改进,提供了带有多种命令的交互式环境。PowerShell 扩展了交互用户和脚本编写者的能力,从而更易于进行相关作业脚本的开发,系统管理。 -
面向对象
虽然可以通过以文本方式键入命令与 PowerShell 进行交互,但 Windows PowerShell是基于对象的,而不是基于文本的。意味着Powershell命令的输出即为对象。可以将输出对象发送给另一条命令以作为其输入(通过管道运算符"|")。因此,Windows PowerShell 为曾使用过其他 shell的人员提供了熟悉的界面,同时引入了新的、功能强大的命令行范例。通过允许发送对象(而不是文本),它扩展了在命令之间发送数据的概念。 -
右命令行很容易过度到脚本
使用 Windows PowerShell,可以很方便地从以交互方式键入命令过渡到创建和运行脚本。可以在 Windows PowerShell命令提示符下键入命令以找到可执行任务的命令。随后,可将这些命令保存到脚本或历史记录中,然后将其复制到文件中以用作脚本。
理解Powershell中的一些重要概念
在开始Powershell的实际开发之前,理解以下概念非常有助于了解Powershell设计思想。
-
命令不是基于文本的,是基于.Net对象的
与传统的命令(如perl,bat,cmd,bash等)不同,Powershell可处理对象(结构化的信息),而不只是显示在屏幕上的字符串,命令输出始终提供可能会需要的额外信息,通过标准的Powershell对象操作命令,即可操作命令返回数据的任何部分。 -
命令系列是可扩展的
许多接口(例如 Cmd.exe)均不能提供直接扩展内置命令集的方法。可以创建在 Cmd.exe 中运行的外部命令行工具,但这些外部工具不能提供服务(例如帮助集成),而且 Cmd.exe 不能自动识别它们是否是有效的命令。
PowerShell 中的本机二进制命令cmdlet可以通过创建并使用管理单元添加到 Windows PowerShell 中的 cmdlet 进行补充。与任何其他接口中的二进制工具相同,Windows PowerShell 管理单元已经过编译。可以使用它们将 Windows PowerShell 提供程序以及新的 cmdlet 添加到 shell 中。最重要的是,Powershell能够识别这些新添加的命令是否是有效的命令。
除此之外,Powershell还可以调用外部的.ps1脚本文件,也可以在脚本中创建自己的函数。 -
Windows Powershell处理控制台输入和显示
输入命令时,PowerShell 始终会直接处理命令行输入。PowerShell 还可以设置屏幕上显示的输出格式。这个功能十分重要,因为它可以减少处理每个命令所需的工作,并确保在使用任何一种 cmdlet 时都能始终以相同方式进行操作。这样可以简化脚本工具开发人员和使用者的工作。
举个例子,对于请求和显示帮助,传统的命令行工具都有它们自己的方案。一些命令行工具使用 /? 来触发帮助显示,而其他一些命令行工具则使用 -?、/H 甚至 //。其中一些工具会在 GUI 窗口中显示帮助,而不以控制台显示。某些复杂工具(例如应用程序更新程序)会先将内部文件解包,然后才显示其帮助。如果使用的参数不正确,则该工具可能会忽略键入的内容,并自动开始执行任务。
但在 PowerShell 中输入命令时,它会自动分析并预处理所输入的全部内容。如果在 PowerShell cmdlet 中使用 -? 参数,则始终表示“显示此命令的帮助”。脚本命令开发人员无需分析该命令,他们只需提供帮助文本。即使是在 PowerShell 中运行传统命令行工具,也可以使用 PowerShell 的帮助功能。PowerShell 将对参数进行处理并将结果传递给外部工具。 -
Windows Powershell使用某些C#语法
由于 PowerShell 基于 .NET Framework,因此 PowerShell 的语法功能和关键字与 C# 编程语言中所使用的语法功能和关键字十分类似。换句话说,学习C#和Powershell是相互促进的,如果您不是 C# 程序员或是完全不了解C#,也没有关系,了解任何一门面对对象的编程语言都有助于学习Powershell。如果已经熟悉 C#,则这些相似性可以帮助你更轻松地了解PowerShell。
理解Powershell中命令的命名规范
使用大多数命令行界面时,通常会遇到以下问题。
-
了解命令名称及命令参数需要花费大量的时间。
使用新命令或参数时,通常无法使用已知的名称,而必须查找和了解新的名称。考虑到界面是如何从一个小工具集经过不断添加的新增功能发展而来,就很容易了解为何其结构会是非标准的。尤其是使用命令名称时,这一点可能是必然的,因为每种命令都是单独的工具。 -
命令没有统一的模式,因此只能通过记住常用的每种命令和每个参数来了解这些命令行界面。
大多数命令都是为管理操作系统或应用程序的元素(如服务或进程)构建的。这些命令有不同 的名称,它们可能属于或不属于一个系列。例如,在 Windows 系统上可以使用 net start 和 net stop 命令来启动和停止服务。另外还有一个名为 sc 的更通用的 Windows 服务控制工具,这一完全不同的名称与 net 服务命令的命名模式不一致。对于进程管理,Windows 使用 tasklist 命令来列出进程,并使用 taskkill 命令来终止进程。
但是不能使用 net start 命令来启动远程计算机上的服务。sc 命令可以启动远程计算机上的服务,但是,若要操作远程计算机上的服务,必须在其名称前添加双反斜杠作为前缀。例如,若要在名为 PC01 的远程计算机上启动后台打印程序服务,您可以键入 sc \PC01 start spooler。若要列出在 PC01 上运行的任务,需要使用 /S(代表“system”)参数,并提供如下所示的不带反斜杠的名称 PC01:tasklist /S PC01。
尽管服务与进程之间有很大的技术差别,但它们都是计算机上具有定义完整的生命周期的可管理元素示例。可能需要启动或停止服务或进程,或获得所有当前正在运行的服务或进程的列表。换而言之,尽管服务和进程并不相同,但从概念上来看,对服务或进程执行的操作通常是相同的。PowerShell 通过统一的模式(类似的命令)来减少要了解和使用 cmdlet 所需知道的不同名称数。
Powershell命令集cmdlet通过使用"动词-名词"名称以减少命令记忆量。
PowerShell 使用"动词-名词"命名系统,其中的每个 cmdlet 名称均由标准动词、连字符和特定名词组成。PowerShell 动词并非一定为英语动词,但其表示 Windows PowerShell 中的特定操作。名词与所有语言中的名词十分类似,名词所受的限制较少,但它们应始终描述命令的操作对象。
举几个动词和名词的示例,来说明他们是如何减少您了解命令所需的记忆量。PowerShell 具有 Get-Process、Stop-Process、Get-Service 和 Stop-Service 等命令。
如果仅有两个名词和两个动词,则一致性并不会极大地简化您了解这些命令的过程。但是,假定是由 10 个动词和 10 个名词组成的一组标准命令名称,则您只需记住 20 个单词,而使用这些单词可以构成 100 个不同的命令名称。
常,只需通过命令的名称即可识别其用途,而对新命令应使用什么样的名称,这通常也是显而易见的。例如,计算机关闭命令可能为 Stop-Computer。用于列出网络上的所有计算机的命令可能为 Get-Computer。用于获取系统日期的命令为 Get-Date。
在 Get-Command 中使用 -Verb 参数可以列出所有包含特定动词的命令(在后面的文章中会详细介绍 Get-Command)。例如,若要查看所有使用动词 Get 的 cmdlet,输入:
PS C:\WINDOWS\system32> Get-Command -Verb Get
CommandType Name Version Source
----------- ---- ------- ------
Alias Get-AppPackage 2.0.1.0 Appx
Alias Get-AppPackageAutoUpdateSettings 2.0.1.0 Appx
Alias Get-AppPackageDefaultVolume 2.0.1.0 Appx
Alias Get-AppPackageLastError 2.0.1.0 Appx
Alias Get-AppPackageLog 2.0.1.0 Appx
Alias Get-AppPackageManifest 2.0.1.0 Appx
Alias Get-AppPackageVolume 2.0.1.0 Appx
Alias Get-AppProvisionedPackage 3.0 Dism
Alias Get-DiskSNV 2.0.0.0 Storage
Alias Get-DiskSNV 1.0.0.0 VMDirectStorage
Alias Get-PhysicalDiskSNV 2.0.0.0 Storage
Alias Get-PhysicalDiskSNV 1.0.0.0 VMDirectStorage
Alias Get-ProvisionedAppPackage 3.0 Dism
Alias Get-ProvisionedAppSharedPackageContainer 3.0 Dism
Alias Get-ProvisionedAppxPackage 3.0 Dism
Alias Get-StorageEnclosureSNV 2.0.0.0 Storage
Alias Get-StorageEnclosureSNV 1.0.0.0 VMDirectStorage
Function Get-AppBackgroundTask 1.0.0.0 AppBackgroundTask
Function Get-AppvVirtualProcess 1.0.0.0 AppvClient
Function Get-AppxLastError 2.0.1.0 Appx
Function Get-AppxLog 2.0.1.0 Appx
......
-Noun 参数用处更大,因为使用该参数可以查看影响同一对象类型的所有命令。例如,若要显示可用于管理服务的命令,请输入以下命令
PS C:\WINDOWS\system32> Get-Command -Noun Service
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Restart-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Resume-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Set-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Start-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Suspend-Service 3.1.0.0 Microsoft.PowerShell.Management
总结
通过学习本节内容,应当掌握以下内容
-
Powershell中的可发现,一致性,面向对象等特性
-
Powershell是基于.Net对象,而不是基于文本的。
-
Powershell中"动词-名词"的命名规范。