从历史上看,Unix 系统上的命令行实用程序比 Windows 上的开发得更好,但随着新解决方案的出现,情况发生了变化。
Windows PowerShell 允许系统管理员自动执行大多数日常任务。 使用它,您可以更改设置、停止和启动服务,还可以对大多数已安装的应用程序执行维护。 将蓝色窗口视为另一个命令解释器是错误的。 这种做法并没有体现微软提出的创新的本质。 事实上,Windows PowerShell 的可能性要广泛得多:在一系列简短的文章中,我们将尝试找出 Microsoft 解决方案与我们更熟悉的工具有何不同。
主要特点
当然,Windows PowerShell 主要是一个脚本 shell,最初构建在 .NET Framework 上,后来构建在 .NET Core 上。 与接受和返回文本数据的 shell 不同,Windows PowerShell 使用具有属性和方法的 .NET 类。 PowerShell 允许您运行常见命令,还允许您访问 COM、WMI 和 ADSI 对象。 它使用各种存储(例如文件系统或 Windows 注册表)来访问所谓的。 提供商。 值得注意的是,可以在其他应用程序中嵌入 PowerShell 可执行组件来实现各种操作,包括。 通过图形界面。 反之亦然:许多 Windows 应用程序通过 PowerShell 提供对其管理界面的访问。
Windows PowerShell 允许您:
- 更改操作系统设置;
- 管理服务和流程;
- 配置服务器角色和组件;
- 安装软件;
- 通过特殊接口管理已安装的软件;
- 在第三方程序中嵌入可执行组件;
- 创建脚本以自动执行管理任务;
- 使用文件系统、Windows 注册表、证书存储等。
Shell和开发环境
Windows PowerShell 有两种形式:除了带有命令 shell 的控制台模拟器之外,还有集成脚本环境 (ISE)。 要访问命令行界面,只需从 Windows 菜单中选择适当的快捷方式或从“运行”菜单运行 powershell.exe。 屏幕上会出现一个蓝色窗口,其功能与上古的 cmd.exe 明显不同。 Unix 系统的命令 shell 用户熟悉自动完成和其他功能。
要使用 shell,您需要记住一些键盘快捷键:
- 向上和向下箭头滚动历史记录以重复以前键入的命令;
- 行尾的右箭头逐个字符地重新输入上一个命令;
- Ctrl+Home 删除从光标位置到行首键入的文本;
- Ctrl+End 删除从光标到行尾的文本。
F7 显示一个包含键入命令的窗口,并允许您选择其中之一。 该控制台还可以使用鼠标进行文本选择、复制粘贴、光标定位、删除、退格——一切我们喜欢的。
Windows PowerShell ISE 是一个完整的开发环境,具有选项卡式和语法突出显示的代码编辑器、命令生成器、内置调试器和其他编程乐趣。 如果您在开发环境编辑器中的命令名称后添加连字符,您将在下拉列表中获得所有可用选项以及类型指示。 您可以通过系统菜单中的快捷方式或使用可执行文件 powershell_ise.exe 启动 PowerShell ISE。
cmdlet
在 Windows PowerShell 中,即所谓的。 cmdlet。 这些是提供各种功能的专用 .NET 类。 它们被命名为动作-宾语(或者动词-名词,如果您愿意的话),连字符分隔的链接类似于自然语言句子中的谓语和主语。 例如,Get-Help 字面意思是“Get-Help”,或者在 PowerShell 上下文中:“Show-Help”。 事实上,这类似于 Unix 系统中的 man 命令,并且必须以这种方式请求 PowerShell 中的手册,而不是通过使用 --help 或 /? 键调用 cmdlet。不要忘记在线 PowerShell 文档:微软已经说得很详细了。
除了 Get 之外,cmdlet 还使用其他动词来表示操作(严格来说,不仅仅是动词)。 在下面的列表中,我们给出了一些示例:
Add
- 添加;
Clear
- 清除;
Enable
- 打开;
Disable
- 关掉;
New
- 创造;
Remove
- 删除;
Set
- 问;
Start
- 跑步;
Stop
- 停止;
Export
- 出口;
Import
- 进口。
有系统、用户和可选 cmdlet:作为执行结果,它们都返回一个对象或对象数组。 它们不区分大小写,即从命令解释器的角度来看,Get-Help 和 get-help 之间没有区别。 字符“;”用于分隔,但仅当多个 cmdlet 在同一行上执行时才必须使用该字符。
Windows PowerShell cmdlet 分为模块(NetTCPIP、Hyper-V 等),并且有一个 Get-Command cmdlet 可按对象和操作进行搜索。 您可以像这样显示它的帮助:
Get-Help Get-Command
默认情况下,该命令显示简短的帮助,但参数(参数)会根据需要传递给 cmdlet。 例如,在他们的帮助下,您可以获得详细(参数 -Detailed)或完整(参数 -Full)帮助,以及显示示例(参数 -Examples):
Get-Help Get-Command -Examples
Windows PowerShell 中的帮助由 Update-Help cmdlet 更新。 如果命令行太长,可以通过写入服务字符“`”并按 Enter 键将 cmdlet 参数移动到下一行 - 仅在一行上完成命令写入并继续在另一行上是行不通的。
以下是一些常见 cmdlet 的示例:
Get-Process
- 显示系统中正在运行的进程;
Get-Service
— 显示服务及其状态;
Get-Content
- 显示文件的内容。
对于常用的 cmdlet 和外部实用程序,Windows PowerShell 有简短的同义词 - 别名(来自英语. Alias)。 例如,dir 是 Get-ChildItem 的别名。 同义词列表还包括来自 Unix 系统的类似命令(ls、ps 等),并且 Get-Help cmdlet 由 help 命令调用。 可以使用 Get-Alias cmdlet 查看完整的同义词列表:
脚本、函数、模块和 PowerShell 语言
Windows PowerShell 脚本存储为扩展名为 .ps1 的纯文本文件。 您无法通过双击来启动它们:您需要右键单击以调出上下文菜单并选择“在 PowerShell 中运行”项。 在控制台中,您必须指定脚本的完整路径,或者转到适当的目录并写入文件名。 运行脚本也受到系统策略的限制,要检查当前设置,您可以使用 Get-ExecutionPolicy cmdlet,它将返回以下值之一:
Restricted
— 启动脚本被禁用(默认情况下);
AllSigned
- 只允许启动由受信任的开发人员签名的脚本;
RemoteSigned
- 允许运行签名的和自己的脚本;
Unrestricted
- 允许运行任何脚本。
管理员有两个选择。 最安全的方法是签署脚本,但这是一个相当严重的巫术 - 我们将在以后的文章中处理它。 现在让我们采取阻力最小的路径并改变策略:
Set-ExecutionPolicy RemoteSigned
尽管您可以使用特殊设置更改当前用户的策略,但需要以管理员身份运行 PowerShell 才能执行此操作。
脚本是用面向对象的编程语言编写的,其命令的命名原则与前面考虑的 cmdlet 相同:“动作-对象”(“动词-名词”)。 它的主要目的是自动化管理任务,但它是一种成熟的解释语言,具有所有必要的结构:条件跳转、循环、变量、数组、对象、错误处理等。 任何文本编辑器都适合编写脚本,但最好运行 Windows PowerShell ISE。
您可以将参数传递给脚本,使它们成为必需的,并设置默认值。 此外,Windows PowerShell 允许您使用 Function 构造和花括号,以与 cmdlet 相同的方式创建和调用函数。 具有函数的脚本称为模块,并具有 .psm1 扩展名。 模块必须存储在 PowerShell 环境变量中定义的目录中。 您可以使用以下命令查看它们:
Get-ChildItem Env:PSModulePath | Format-Table -AutoSize
输送机
在上一个示例中,我们使用了 Unix shell 用户熟悉的构造。 在 Windows PowerShell 中,竖线还允许您将一个命令的输出传递到另一个命令的输入,但管道的实现存在显着差异:我们不再讨论一组字符或某种类型的字符。文本。 内置 cmdlet 或用户定义的函数返回对象或对象数组,并且还可以接收它们作为输入。 与 Bourne shell 及其许多后继者一样,PowerShell 通过管道使复杂的任务变得更加容易。
最简单的管道示例如下所示:
Get-Service | Sort-Object -property Status
首先,执行 Get-Service cmdlet,然后将其接收的所有服务传递给 Sort-Object cmdlet,以便按 Status 属性进行排序。 管道上一部分的结果传递给哪个参数取决于其类型 - 通常是 InputObject。 此问题将在专门介绍 PowerShell 编程语言的文章中更详细地讨论。
如果您愿意,可以继续该链并将 Sort-Object 操作的结果传递给另一个 cmdlet(它们将从左到右执行)。 顺便说一句,Windows 用户还可以访问所有 Unixoid 都熟悉的分页结构:
Get-Service | Sort-Object -property Status | more
在后台运行任务
很多时候,需要在后台运行某个命令,以免在 shell 会话中等待其执行结果。 Windows PowerShell 有几个适用于这种情况的 cmdlet:
Start-Job
- 启动后台任务;
Stop-Job
— 停止后台任务;
Get-Job
— 查看后台任务列表;
Receive-Job
— 查看后台任务执行结果;
Remove-Job
— 删除后台任务;
Wait-Job
- 将后台任务传输回控制台。
要启动后台任务,我们使用 Start-Job cmdlet 并在大括号中指定一个命令或一组命令:
Start-Job {Get-Service}
Windows PowerShell 中的后台任务可以通过了解其名称来进行操作。 首先,让我们学习如何显示它们:
Get-Job
现在让我们展示作业 Job1 的结果:
Receive-Job Job1 | more
一切都很简单。
远程命令执行
Windows PowerShell 不仅允许您在本地计算机上执行命令和脚本,还可以在远程计算机上甚至在整个计算机组上执行命令和脚本。 做这件事有很多种方法:
- 许多 cmdlet 都有一个参数
-ComputerName
,但这样就行不通了,例如创建一个传送带; - cmdlet
Enter-PSSession
允许您在远程计算机上创建交互式会话; - 使用 cmdlet
Invoke-Command
您可以在一台或多台远程计算机上运行命令或脚本。
PowerShell 的版本
自 2006 年首次发布以来,PowerShell 发生了很大变化。 该工具适用于在不同硬件平台(x86、x86-64、Itanium、ARM)上运行的许多系统:Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008/2008 R2、Windows 7、Windows 8、Windows 8.1、 Windows RT、Windows RT 8.1、Windows Server 2012/2012 R2、Windows 10、Windows Server 2016、GNU/Linux 和 OS X。最新版本 6.2 于 10 年 2018 月 XNUMX 日发布。 为早期版本编写的脚本可能适用于更高版本,但向后移植可能会出现问题,因为 PowerShell 在多年的开发过程中引入了大量新的 cmdlet。 您可以使用 $PSVersionTable 内置变量的 PSVersion 属性找出计算机上安装的命令 shell 的版本:
$PSVersionTable.PSVersion
您还可以使用 cmdlet:
Get-Variable -Name PSVersionTable –ValueOnly
使用 Get-Host cmdlet 也可以完成相同的操作。 事实上,有很多选择,但要使用它们,您需要学习 PowerShell 编程语言,我们将在
结果
Microsoft 已成功创建了一个真正强大的 shell,具有用于开发脚本的便捷集成环境。 它与我们在 Unix 世界中熟悉的工具不同,它与 Windows 系列操作系统及其软件和 .NET Core 平台深度集成。 PowerShell 可以称为面向对象的 shell,因为 cmdlet 和用户定义的函数返回对象或对象数组,并可以将它们作为输入。 我们认为 Windows 上的所有服务器管理员都应该拥有这个工具:他们不需要命令行的时代已经过去了。 特别需要高级控制台 shell
只有注册用户才能参与调查。
该系列的下一篇文章应首先讨论哪些主题?
-
53,2%在 PowerShell 中编程123
-
42,4%PowerShell98函数和模块
-
22,1%如何签署自己的脚本?51
-
12,1%通过提供商(providers)使用存储库28
-
57,6%使用 PowerShell 自动化计算机管理133
-
30,7%软件管理和在第三方产品中嵌入 PowerShell 可执行文件71
231 位用户投票。 37 位用户弃权。
来源: habr.com