PowerShell 入门:基础知识

您是 Windows 管理员吗?今年你有学习 PowerShell 的新年决心吗?如果是这样,那么您来对地方了。

在这篇文章中,我将引导您了解 PowerShell 的世界,帮助您了解方位,并向您展示如何使用该语言执行简单的任务,以便您打下坚实的基础,为您的特定工作添加技能。让我们开始吧。

获取基础知识

PowerShell 的所有命令都使用一致的语法 - 事实上,PowerShell 命令实际上称为 cmdlet,因为它们不仅仅是简单的 DOS 风格的操作。所有 cmdlet 都使用以下语法:

动词名词

你可以很容易地将其记住为“对这件事做某事”。例如,以下是三个实际的 cmdlet:

  • 设置执行策略
  • 获取服务
  • 显示命令

所有 cmdlet 将始终遵循此格式。使用这三个命令,您将设置执行策略、显示命令或命令列表并获取有关服务及其功能的一些信息。

任何时候使用 PowerShell 时都需要记住以下几点:

  • PowerShell 不区分大小写。大写、小写、camElCaSe——这并不重要。 PowerShell 只需读取文本并执行您想要的操作。
  • 由于 PowerShell cmdlet 的格式始终一致,因此您可以将这些 cmdlet 及其输出链接在一起并按顺序执行操作。例如,一个 cmdlet 可以检索事物列表,您可以将该列表(第一个命令的输出)发送到第二个命令,然后第二个命令也执行一些操作。只要您需要,这种情况就可以一直持续下去,直到完成您想要的任何任务。
  • PowerShell cmdlet 的输出始终是 .NET 对象。现在这对您来说可能意义不大,特别是如果您不是程序员或没有软件开发背景,但当您了解有关 PowerShell 语言的更多信息时,您会发现这就是 PowerShell 的一些真正威力所在。
  • PowerShell 在本地系统上运行良好,但它还可以与远程系统“通过网络”完美配合。通过对本地计算机和要管理的远程系统上的设置进行一些更改,您可以一次在数千台计算机上执行命令。在 PowerShell 出现之前,这一直是 Bash 和 Perl 的权限,但现在 Windows 有了真正的远程命令 shell 等效项。

看见宇宙

在安装了 PowerShell 的计算机上,打开它并输入以下内容:

Get-command

这告诉 PowerShell 获取它知道的所有 cmdlet。在没有其他任何情况下,PowerShell 将始终将输出发送到屏幕。 (您可以将其定向到一个文件、另一个 PowerShell cmdlet 或以其他方式使用它,但现在让我们了解一下可以做什么。)

你应该看到这样的东西:

PowerShell 的 Get-command cmdlet。

这就是 PowerShell 的世界——至少现在对于你的机器来说是这样。 Exchange、SharePoint、System Center 和 Office 365 等其他产品都有自己的一组 cmdlet,您需要导入这些 cmdlet 来执行其特定于服务的任务,但让我们只关注您的计算机现在了解的内容。

这仍然是很多 cmdlet!你问有多少?好吧,让我们弄清楚如何让 PowerShell 告诉我们。还记得我说过 PowerShell cmdlet 的输出始终是 .NET 对象吗?这些对象都具有属性——与 Windows 文件具有属性的方式完全相同。例如,当您在资源管理器中右键单击某个文件并单击“属性”时,您将获得相当于描述该文件的一堆属性和值——作者、位置、关键字、权限等。

好吧,.NET 对象也有属性,而您可以立即获得的属性之一就是 count 属性。最简单的是,count 属性可以告诉您正在处理的不同事物的数量 - 用户、邮箱等。您可以简单地获取任何 cmdlet 输出的 count 属性值,只需将 cmdlet 括在括号中(包括一个点),然后输入属性名称 count。像这样:

(get-command).count

请记住,您要将对象的名称放在括号中,添加一个点来访问属性,然后输入属性名称。

当我输入它时,我得到的计数属性是 1,141。您的号码可能会有所不同,具体取决于您运行的 Windows 和 PowerShell 版本。现在不用太担心这些差异。

计数虽然简单,但在各种情况下都可以派上用场。例如,在 Exchange 安装中,您只需使用以下命令即可获取邮箱数量:

(get-mailbox).count

或者,您可能有一个 Active Directory 部署,并且您想知道总共有多少用户。或者您想知道事件日志中有多少个事件。也许您想监视某个服务或应用程序写入事件日志的事件数量 - 但仅限于出现错误时。一个简单的监控系统可以使用给定事件日志的计数属性,查看它何时大于零,然后执行一些操作来提醒您,例如发送电子邮件。

可能性几乎是无穷无尽的,您想要在 PowerShell 中做的许多事情都来自于查看您正在处理的事物的属性。

“但是乔恩,”我听到你问。 “我如何知道一个对象可能具有哪些属性?”毕竟,当您在 Windows 中右键单击并选择“属性”时,GUI 会让您的所有选择一目了然。好吧,继续阅读。

帮我!

当我询问那些刚接触 PowerShell 的人他们想首先了解什么时,我收到了一条非常有趣的评论:

我使用了 Internet 上各种帖子提供给我的完整 PowerShell 命令——特定问题的解决方案。我可以看到它有多么强大,但令我惊讶的是有这么多东西需要记住。人们是否记得所有命令、它们的语法、命令选项、开关等?

这是一个很好的问题。 PowerShell 是一个 cmdlet 的大世界,但不要绝望——每个 cmdlet 都使用内置帮助进行了完整的记录。您可以通过 - 等待 - 使用名为的 cmdlet 来访问它获取帮助。对于任何 cmdlet,只需在 cmdlet 名称前面添加获取帮助你会得到一个充满文档的世界。

提示:当您第一次部署系统时,您可能需要运行更新帮助,这将从 Microsoft 下载最新的 PowerShell 帮助文件并将其安装在您的系统上。请务必以管理员身份运行它。否则它不会起作用。

更新过程只需要一两分钟,但随后您将使用最新的文档。您可能需要每六个月左右运行一次,以确保不会遗漏任何内容。

让我们看看实际效果。我们将回到我们的获取命令cmdlet 并寻求帮助:

Get-help get-command

这是我所看到的:

PowerShell 的 Get-help cmdlet。

您可以看到 get-command cmdlet 需要很多参数。如果您了解 DOS,您会记得 DOS 命令有标志,例如目录 /s,其中列出目录的内容,然后列出所有子目录,或者移动/y移动东西而不需要确认Every的移动。单身的。文件。这些 DOS 标志改变了命令默认响应的方式。

这些 cmdlet 参数的作用方式相同 - 它们影响 cmdlet 的功能。你可以告诉获取命令给你:

  • 仅某些类型的命令带有–命令类型
  • 具有特定语法的命令使用-句法
  • 一切都使用-全部
  • 等等

大多数 PowerShell cmdlet 都接受参数。您很少会只使用命令的默认输出。因此,了解在哪里可以找到这些参数非常重要。

对于了解给定的 cmdlet,还有什么可能有用?如果您正在探索某个领域或某个主题,“相关链接”部分可能会非常有帮助;您可以在此处找到相关的 PowerShell cmdlet,这些 cmdlet 可能会执行与同一主题或区域相关的其他操作。

例如,如果我正在跑步获取事件日志因为我想要有关事件日志的信息,我可能想用该信息做一些事情,所以运行获取帮助获取事件日志向我展示了(在“相关链接”部分中)我可能有兴趣了解更多信息的其他 cmdlet,包括:

  • 清除事件日志
  • 获取葡萄酒活动
  • 限制事件日志
  • 新事件日志
  • 删除事件日志
  • 显示事件日志
  • 写入事件日志

然后我可以使用获取帮助通过每一项建议来获取更多信息。

您是否开始了解如何使用内置文档来完成任务?这获取帮助 cmdlet本身有参数,最有用的参数之一是– 例子范围。这里列出了一堆使用各种形式和组合的参数的示例 cmdlet,因此您可以查看操作中的命令,并根据示例构建您自己的自定义版本的这些 cmdlet。

自己尝试一下。进入:

get-help get-command -examples

您可以看到这些示例有据可查且清晰。这些在 PowerShell 世界中无处不在。回到 Exchange 环境,这是我看到的获取邮箱:

Exchange 环境中使用的 PowerShell 的 Get-Mailbox cmdlet。

这就是我所看到的获取帮助显示事件日志-示例:

PowerShell 的 Get-Help-Show-Commandlog cmdlet。

因此,回答读者最初的问题——不,每个人都不会一直记住所有内容。

现在,当然,就像您开始记住熟悉的 DOS 命令,甚至 Linux 或 Unix 中的 Bash 命令一样,如果您经常使用它们,您就会记住一些东西。但是 PowerShell 的帮助和您无需进一步努力即可立即获得的示例(除了按照我之前建议的方式更新帮助文件之外)将始终作为指南,帮助您弄清楚发生了什么以及如何解决难题。

实用的东西

我们在这里只介绍了非常非常基础的知识,但在结束本文之前,让我们做一些实际的事情,以便您真正感受到 PowerShell 并可以立即练习您在此处阅读的内容。

在管理系统时,您所做的两件非常常见的事情是查找进程并终止它们。您当前可能使用任务管理器,或者为了进行更详细的工作,您可以使用 DOS 命令任务列表/svc查找给定服务的进程 ID 及其正在运行的内容,然后使用任务管理器将其终止。使用PowerShell,我们可以做同样的事情。

假设——当然,纯粹是假设——我们有一个浏览器,它的名字与 Moogle Shrome 押韵。它的行为不佳,如果您将其打开过夜,则会消耗大量内存。 (如前所述,这是绝对地假设。)我们需要找到它并在它造成更多损害之前杀死它。

您可能可以猜测用于处理进程的 cmdlet 是如何工作的。获取进程将获取系统上当前运行的进程列表,默认格式为表格。

PowerShell 的 Get-process cmdlet。

我知道从获取帮助 获取进程我可以指定一个进程的名称,该名称将仅显示有关该进程的信息:

使用 PowerShell cmdlet 获取有关特定进程的信息。

我在想如果获取进程获取有关流程的信息,然后使用动词-名词格式,停止进程会阻止一个。 (我总是可以使用获取帮助或者获取帮助示例,但由于我很着急,所以我没有阅读说明就继续操作,只是假设这个 cmdlet 存在。)

PowerShell 的停止进程 cmdlet。

我的厚颜无耻得到了回报!但现在它要求我提供 ID,因为当我输入时停止进程cmdlet,我没有告诉它停止哪个进程。我可以向上滚动并在结果表中查找 ID获取进程 chrome。看起来进程 ID 2924 占用了大量 CPU 时间,因此我将输入 2924 并按 Enter 键。

如果这是我唯一想要的,我会在空行上再次按 Enter 键。 (PowerShell 假设可能有多个我想要删除的 ID,并让我一次输入多个 ID,但只要看到此内容,只要输入一个空行即可跳过此内容。)我立即注意到 Googl……咳咳,Moogle Shrome 已经消失了。

如果没有手持,我可以使用以下序列完成同样的事情:

Get-process

Get-process chrome

Stop-process 2924

我就完成了。

总结

恭喜!我们刚刚使用 PowerShell 终止了出现问题的进程。我们通过 cmdlet、使用参数、记住查找相关 cmdlet 的方式来困惑,并通过记住动词-名词命名方法成功地对某些 cmdlet 是否存在进行有根据的猜测。

现在,您拥有了可以像专业人士一样使用 PowerShell 的良好开端。