一文搞懂 PowerShell:从概念到入门 – wiki基地


一文搞懂 PowerShell:从概念到入门

在现代 IT 环境中,无论是系统管理、任务自动化、开发流程优化,还是日常的文件操作,命令行工具都扮演着至关重要的角色。对于 Windows 用户而言,提及命令行,很多人首先想到的是传统的 cmd.exe(命令提示符)。然而,微软早已推出了一个更强大、更灵活的命令行 Shell 和脚本语言——PowerShell。

如果你还在依赖点击鼠标完成重复性工作,或者对黑底白字的命令行感到畏惧,那么是时候了解并掌握 PowerShell 了。它不仅仅是一个简单的命令执行器,更是一个基于对象的自动化框架。本文将带你从零开始,深入理解 PowerShell 的核心概念,并引导你迈出入门的第一步。

引言:告别低效,拥抱自动化

想象一下,你需要对公司里数百台电脑的某个特定注册表项进行修改,或者需要定期清理特定目录下的旧文件,再或者需要批量创建用户账户。如果手工操作,这将是何等耗时且容易出错的工作?这就是自动化大显身手的时候,而 PowerShell 正是 Windows 平台上进行自动化和配置管理的首选工具。

与传统的 cmd.exe 相比,PowerShell 带来了革命性的变化。cmd.exe 主要处理文本流,命令的输出是纯文本,后续处理往往需要依赖查找、截取、粘贴等繁琐的字符串操作。而 PowerShell 则处理的是结构化的对象(Object),命令的输出是带有属性和方法的对象集合,这使得数据的过滤、排序、选择和进一步处理变得异常高效和直观。

学习 PowerShell,意味着你将获得:

  1. 强大的系统管理能力: 轻松管理本地和远程的 Windows 系统、Active Directory、Exchange Server、SQL Server、Azure 等微软产品及服务。
  2. 高效的任务自动化: 编写脚本来自动完成重复性任务,节省大量时间和精力。
  3. 跨平台兼容性: PowerShell Core (PowerShell 7+) 可以在 Windows、macOS 和 Linux 上运行,实现跨平台管理。
  4. 标准化的管理界面: 越来越多的软件和服务提供了基于 PowerShell 的管理接口。

废话不多说,让我们正式踏上 PowerShell 的学习之旅。

第一章:PowerShell 的核心概念——对象的力量

理解 PowerShell,最关键的一点就是要理解它是一个基于对象的 Shell

1.1 什么是对象?

在计算机编程中,对象是一个包含数据(属性,Properties)和可以对数据执行操作(方法,Methods)的实体。例如,一个“文件”对象可能包含文件名、大小、创建日期、修改日期等属性,以及“复制”、“删除”、“移动”等方法。

传统的命令行 Shell(如 cmd.exe)处理的是文本。当你执行 dir 命令时,你看到的是一堆格式化的文本字符。如果你想提取文件名,你可能需要使用 findstr 或其他文本处理工具,通过模式匹配来“解析”这些文本。这就像从一张打印好的报告中查找信息,你需要阅读、识别、然后手动提取。

而 PowerShell 处理的是对象。当你执行一个命令(我们称之为 Cmdlet,稍后会讲)来获取文件列表时,它返回的是一系列的“文件对象”。每个对象都包含了文件的各种属性(FileName, Length, CreationTime 等),你可以直接访问这些属性,而无需进行文本解析。这就像你获得了一份电子表格,每一行是一个文件,每一列是文件的属性,你可以直接对这些列进行排序、筛选或提取。

这种基于对象的处理方式,是 PowerShell 最核心的优势,也是它与传统 Shell 的本质区别。

1.2 命令程序:Cmdlet

PowerShell 的基本命令单元被称为 Cmdlet (发音:command-let)。Cmdlet 是专门为 PowerShell 设计的小型、专用命令,它们通常用编译好的 .NET 代码编写,以提供更稳定和高效的功能。

Cmdlet 的命名遵循严格的“动词-名词” (Verb-Noun) 结构,中间用连字符连接。例如:

  • Get-Process: 获取当前正在运行的进程对象。
  • Get-Service: 获取当前系统的服务对象。
  • Set-Location: 设置当前工作目录。
  • New-Item: 创建新的文件或目录。
  • Remove-Item: 删除文件或目录。

这种命名约定使得 Cmdlet 的功能一目了然,极大地提高了可读性和可发现性。动词部分通常表示要执行的操作(Get, Set, New, Remove, Start, Stop, Restart, Write 等),名词部分则表示操作的对象类型(Process, Service, Item, Content, Command 等)。

1.3 管道 (Pipeline):连接命令的利器

PowerShell 中另一个强大的概念是管道 (|)。管道允许你将一个 Cmdlet 的输出对象作为输入发送给另一个 Cmdlet。

例如,你想获取系统中 CPU 占用率最高的 5 个进程:

  1. 首先,用 Get-Process 获取所有进程的对象。
  2. 然后,将这些进程对象通过管道发送给一个能按 CPU 属性排序的 Cmdlet。
  3. 最后,将排序后的对象通过管道发送给一个能选取前 5 个对象的 Cmdlet。

在 PowerShell 中,这可以写成一行命令:

powershell
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5

这行命令的含义是:
* Get-Process: 获取所有进程对象。
* |: 将 Get-Process 的输出对象传递给下一个命令。
* Sort-Object -Property CPU -Descending: 接收进程对象,并按照它们的 CPU 属性进行降序(从大到小)排序。
* |: 将排序后的进程对象传递给下一个命令。
* Select-Object -First 5: 接收排序后的进程对象,并只选择最前面的 5 个。

整个流程清晰、高效,并且完全基于对象操作,避免了复杂的文本解析。管道是 PowerShell 实现复杂自动化任务的基础,掌握它至关重要。

第二章:迈出第一步——启动 PowerShell

现在你对 PowerShell 有了初步的概念认识,是时候实际操作了。

2.1 如何打开 PowerShell

在 Windows 中,有多种方式可以打开 PowerShell:

  1. 通过搜索: 点击任务栏搜索框或开始按钮,输入 “PowerShell”,选择 “Windows PowerShell” 或 “PowerShell” (较新版本)。
  2. 通过运行对话框:Win + R,输入 powershell 并回车。
  3. 通过文件资源管理器: 在文件资源管理器的地址栏输入 powershell 并回车,会在当前目录下打开 PowerShell。
  4. 右键菜单: 在文件资源管理器中,按住 Shift 键并在空白处右键单击,选择 “在此处打开 PowerShell 窗口”。
  5. 以管理员身份运行: 对于需要进行系统级操作的任务,你需要以管理员身份运行 PowerShell。在搜索结果或开始菜单中找到 PowerShell,右键单击选择 “以管理员身份运行”。

通常你会看到一个蓝色的窗口,这就是 PowerShell 控制台。

2.2 认识控制台界面

PowerShell 控制台看起来与 cmd.exe 有些相似,但功能更强大:

  • 提示符 (Prompt): 显示当前所在的路径,例如 PS C:\Users\YourName>PS 表示这是一个 PowerShell 会话。
  • 光标: 等待你输入命令。
  • 命令输出: 命令执行结果会显示在光标下方。

你可以像在其他命令行界面一样,使用方向键滚动命令历史,使用 Tab 键进行命令和文件名的自动补全。PowerShell 的 Tab 补全功能尤其强大,不仅可以补全 Cmdlet 名称、文件名,还可以补全 Cmdlet 的参数名和参数值(例如服务名称、进程名称等)。

2.3 执行你的第一个命令

让我们从一些简单的 Cmdlet 开始:

  • Get-Locationpwd 查看当前所在的目录。pwdGet-Location 的别名(Alias),许多常用的 Linux/Unix 命令在 PowerShell 中都有对应的别名,方便习惯其他 Shell 的用户过渡。
    powershell
    Get-Location
    # 或者使用别名
    pwd

  • Set-Location <路径>cd <路径> 改变当前工作目录。
    “`powershell
    # 进入 C 盘根目录
    Set-Location C:\
    # 或者使用别名
    cd C:\

    进入用户文档目录

    Set-Location “C:\Users\YourName\Documents”

    注意:如果路径包含空格,需要用双引号括起来

    进入上一级目录

    cd ..

    进入用户主目录

    cd ~
    “`

  • Get-ChildItemls / dir 列出当前目录下的文件和子目录。这是 PowerShell 中用于文件和目录操作的核心 Cmdlet 之一。
    “`powershell
    # 列出当前目录内容
    Get-ChildItem
    # 或者使用别名
    ls
    dir

    列出指定目录的内容

    Get-ChildItem C:\Windows

    列出当前目录下的所有文件(不包含目录)

    Get-ChildItem -File

    列出当前目录下的所有目录(不包含文件)

    Get-ChildItem -Directory

    递归列出当前目录及其所有子目录下的文件和目录

    Get-ChildItem -Recurse
    ``
    注意
    Get-ChildItem的输出,它不是简单的文本列表,而是包含文件和目录属性的对象。你可以通过Get-ChildItem | Get-Member` 查看这些对象的详细属性和方法。

  • Write-Host <文本> 在控制台输出文本。常用于显示信息或脚本调试。
    powershell
    Write-Host "Hello, PowerShell World!"

  • Clear-Hostcls 清空控制台屏幕。
    powershell
    Clear-Host
    # 或者使用别名
    cls

通过执行这些基本命令,你已经迈出了与 PowerShell 交互的第一步。

第三章:深入理解对象和管道的应用

前面我们强调了对象和管道的重要性,现在我们通过实际例子来进一步理解它们。

3.1 查看对象属性:Get-Member

任何 Cmdlet 的输出,如果你想知道它返回的是什么类型的对象,以及这个对象有哪些属性和方法,可以使用 Get-Member Cmdlet。

例如,查看 Get-Process 返回的进程对象有什么属性:

powershell
Get-Process | Get-Member

执行这条命令,你会看到关于 System.Diagnostics.Process 类型对象的大量信息,包括其属性(AliasProperty, Property)和方法(Method)。这对于了解你可以如何操作这些对象至关重要。比如,你会发现进程对象有 Name, Id, CPU, WorkingSet 等属性,以及 Kill(), Stop() 等方法。

3.2 利用管道过滤和选择:Where-ObjectSelect-Object

基于对象的处理能力,使得过滤和选择数据变得异常简单。

  • Where-Object 用于根据指定的条件过滤对象。你可以把它想象成数据库查询中的 WHERE 子句。在 Where-Object 的脚本块 {} 中,$_ 代表当前通过管道传递过来的对象。

    例如,找到所有 CPU 占用率大于 100 的进程:
    powershell
    Get-Process | Where-Object { $_.CPU -gt 100 }

    这里的 $_ 是当前进程对象,$_.CPU 访问其 CPU 属性,-gt 是 PowerShell 中的“大于”比较运算符。

    其他常用的比较运算符:
    * -eq:等于
    * -ne:不等于
    * -gt:大于
    * -ge:大于等于
    * -lt:小于
    * -le:小于等于
    * -like:通配符匹配 (例如 *.exe)
    * -match:正则表达式匹配

    例如,找到所有名称以 “svchost” 开头的服务:
    powershell
    Get-Service | Where-Object { $_.Name -like "svchost*" }

  • Select-Object 用于从对象中选择特定的属性或创建自定义属性。你可以把它想象成数据库查询中的 SELECT 子句。

    例如,只显示进程的名称和 ID:
    “`powershell
    Get-Process | Select-Object -Property Name, Id

    -Property 参数可以省略

    Get-Process | Select-Object Name, Id
    “`

    例如,结合 Where-Object,找到所有状态为 Running 的服务,并只显示它们的名称和状态:
    powershell
    Get-Service | Where-Object { $_.Status -eq "Running" } | Select-Object Name, Status

    你还可以使用 Select-Object 创建自定义列,例如,显示文件的大小(Length)并将其命名为 Size (MB):
    powershell
    Get-ChildItem | Select-Object Name, @{Name="Size (MB)"; Expression={$_.Length / 1MB}}

    这里使用了哈希表 @{} 来定义自定义属性,Name 指定新属性的名称,Expression 指定如何计算属性值。

3.4 排序对象:Sort-Object

Sort-Object 用于根据一个或多个属性对对象进行排序。

例如,按文件大小降序排列当前目录下的文件:
powershell
Get-ChildItem -File | Sort-Object -Property Length -Descending

按进程名称升序排列:
“`powershell
Get-Process | Sort-Object Name

默认是升序,-Ascending 可以省略

“`

3.5 格式化输出:Format-* Cmdlet

PowerShell 默认的输出格式通常是表格形式。但有时你需要不同的格式,比如列表、宽列表,或者只是想看到对象的原始属性。Format-* Cmdlet (如 Format-Table, Format-List, Format-Wide) 可以帮你实现。

  • Format-Table 以表格形式显示数据(通常是默认格式)。
  • Format-List 以列表形式显示对象的属性和值,当对象有很多属性时非常有用。
    powershell
    # 以列表形式显示某个进程的所有详细信息
    Get-Process -Name explorer | Format-List *
    # * 表示显示所有属性
  • Format-Wide 以多列形式只显示对象的某个属性,适用于只想快速查看名称列表等情况。
    powershell
    # 只显示进程名称,多列展示
    Get-Process | Format-Wide Name

注意: Format-* Cmdlet 是用来改变输出显示方式的,它们的输出是格式化后的文本,而不是对象。因此,Format-* Cmdlet 通常应该放在管道的末尾。如果你在 Format-* Cmdlet 之后再接其他处理对象的 Cmdlet (如 Where-ObjectSelect-Object),它们将无法正常工作,因为它们接收到的是文本,而不是对象。

第四章:变量和基本数据类型

在编写 PowerShell 脚本时,变量是必不可少的。变量用于存储数据,以便在后续命令或脚本中使用。

4.1 声明和使用变量

在 PowerShell 中,变量名以美元符号 $ 开头。声明和赋值很简单:

“`powershell

声明一个变量 $name 并赋值字符串 “Alice”

$name = “Alice”

声明一个变量 $age 并赋值整数 30

$age = 30

声明一个变量 $isServiceRunning 并赋值布尔值 $true

$isServiceRunning = $true

使用变量

Write-Host “Hello, $name! You are $age years old.”

将 Cmdlet 的输出存储到变量中

$processes = Get-Process

查看存储在变量中的对象数量

$processes.Count

查看变量中第一个对象的名称

$processes[0].Name
“`

PowerShell 是弱类型语言,你不需要提前声明变量的类型。当你给变量赋值时,PowerShell 会自动判断数据的类型(字符串 String, 整数 Int32, 布尔 Boolean 等)。你也可以通过 $variable.GetType().Name 来查看变量的类型。

4.2 常用数据类型简介

虽然 PowerShell 是弱类型,但理解一些基本数据类型有助于更好地使用它:

  • String (字符串): 用双引号 "" 或单引号 '' 括起来的文本。双引号中的变量会被解析 ($name 会被替换为 “Alice”),而单引号中的文本会按字面值处理 ($name 会被视为文字 “$name”)。
  • Int32 / Int64 (整数): 整数值。
  • Double (双精度浮点数): 带有小数的数值。
  • Boolean (布尔值): $true$false,常用于条件判断。
  • Array (数组): 存储多个同类型或不同类型数据的集合。
    powershell
    $numbers = 1, 2, 3, 4, 5
    $firstNumber = $numbers[0] # 数组索引从 0 开始
  • HashTable (哈希表/关联数组): 存储键值对的集合。
    powershell
    $person = @{ Name = "Bob"; Age = 25; City = "New York" }
    $person.Name # 访问键的值
    $person["Age"]

变量和数据类型是编写复杂脚本的基础。

第五章:获取帮助——你的 PowerShell 学习伴侣

学习任何新技术,最重要的技能之一就是知道如何获取帮助。PowerShell 提供了非常完善的内置帮助系统。

5.1 Get-Help Cmdlet

Get-Help 是你学习 PowerShell 过程中最亲密的伙伴。它可以提供关于 Cmdlet、函数、脚本、概念等几乎所有 PowerShell 相关主题的详细信息。

  • 查看 Cmdlet 的基本帮助:
    powershell
    Get-Help Get-Process

    这会显示 Cmdlet 的简要说明、语法、别名和相关链接。

  • 查看 Cmdlet 的完整帮助:
    powershell
    Get-Help Get-Process -Full

    这会显示 Cmdlet 的详细说明、完整的参数列表、输入/输出类型以及备注。

  • 查看 Cmdlet 的示例:
    powershell
    Get-Help Get-Process -Examples

    这是非常有用的功能,通过示例你可以快速了解 Cmdlet 的常见用法。

  • 查看特定参数的详细信息:
    powershell
    Get-Help Get-Process -Parameter Name

  • 搜索帮助主题: 如果你不确定 Cmdlet 的完整名称,可以搜索。
    powershell
    Get-Help process
    Get-Help service*

5.2 更新帮助内容:Update-Help

PowerShell 的帮助内容是独立于 PowerShell 版本发布的,并且可以更新。为了获取最新的帮助信息,建议定期运行 Update-Help Cmdlet。

powershell
Update-Help

注意: 运行 Update-Help 通常需要以管理员身份启动 PowerShell。

掌握 Get-Help Cmdlet,意味着你拥有了一个强大的自学工具。遇到不熟悉的命令或概念时,首先尝试使用 Get-Help

第六章:脚本编写基础

PowerShell 脚本是以 .ps1 为扩展名的文本文件,其中包含一系列 PowerShell 命令。编写脚本可以让你将多个命令组合起来,实现更复杂的自动化任务。

6.1 编写和保存脚本

你可以使用任何文本编辑器来编写 PowerShell 脚本,比如记事本、VS Code、Notepad++ 等。微软还提供了 PowerShell ISE (Integrated Scripting Environment),这是一个专门用于编写、测试和调试 PowerShell 脚本的工具。较新的 PowerShell 版本则更推荐使用 VS Code 并安装 PowerShell 扩展。

例如,创建一个名为 Get-RunningServices.ps1 的文件,输入以下内容:

“`powershell

这是一个简单的PowerShell脚本

获取所有正在运行的服务,并按名称排序,只显示名称和状态

Get-Service | Where-Object { $_.Status -eq “Running” } | Sort-Object Name | Select-Object Name, Status

Write-Host “`n脚本执行完毕!”
“`

将文件保存为 .ps1 扩展名。

6.2 执行脚本——关于执行策略

出于安全考虑,PowerShell 默认的执行策略 (Execution Policy) 可能不允许直接运行脚本文件。执行策略是 PowerShell 的一项安全功能,用于控制脚本的运行方式。

你可以通过 Get-ExecutionPolicy Cmdlet 查看当前的执行策略:

powershell
Get-ExecutionPolicy

常见的执行策略包括:

  • Restricted (默认):不允许运行任何脚本,只能交互式地输入命令。
  • AllSigned: 只能运行由受信任的发布者签名的脚本。
  • RemoteSigned: 运行本地创建的脚本不需要签名,但从互联网下载的脚本必须签名。这是许多用户为了方便而设置的策略。
  • Unrestricted: 允许运行所有脚本,不检查签名。不推荐在生产环境使用此策略。

重要提示: 修改执行策略会影响系统的安全性,请谨慎操作,并理解不同策略的含义。对于初学者练习,通常可以将策略设置为 RemoteSigned

要修改执行策略,使用 Set-ExecutionPolicy Cmdlet:

“`powershell

例如,设置为 RemoteSigned (通常需要管理员权限)

Set-ExecutionPolicy RemoteSigned

修改策略时会有一个警告,输入 ‘Y’ 确认

“`

修改执行策略后,你就可以运行 .ps1 脚本文件了。

6.3 运行脚本

在 PowerShell 控制台中,导航到脚本所在的目录,然后使用脚本文件的完整路径或相对路径来执行它:

“`powershell

如果脚本在当前目录

.\Get-RunningServices.ps1

如果脚本在其他目录

C:\Scripts\Get-RunningServices.ps1
``
注意在脚本名前面加上
.` 表示当前目录,这是为了安全性考虑,防止意外执行同名但位于系统 PATH 中的恶意脚本。

第七章:常用的 PowerShell 环境

除了传统的蓝色控制台,还有更方便的 PowerShell 环境:

  • Windows PowerShell ISE (Integrated Scripting Environment): 微软提供的图形化 PowerShell 脚本编辑和调试工具。它提供语法高亮、代码片段、命令补全、图形化调试器等功能。在 Windows 10 及更高版本中,可以通过搜索 “PowerShell ISE” 找到。
  • VS Code (Visual Studio Code) + PowerShell Extension: 微软官方推荐的跨平台 PowerShell 开发环境。VS Code 轻量、高度可定制,配合官方 PowerShell 扩展,提供了强大的编辑、调试、格式化等功能,支持 PowerShell Core 和 Windows PowerShell。如果你打算深入学习 PowerShell 脚本开发,强烈推荐使用 VS Code。

这些环境提供了更好的代码编辑和调试体验,尤其是在编写较长的脚本时。

总结与展望

恭喜你!通过阅读本文,你已经了解了 PowerShell 的核心概念——对象和 Cmdlet,学习了如何启动 PowerShell、执行基本命令、利用管道处理对象,以及如何获取帮助和运行简单的脚本。这为你打开了通往 PowerShell 自动化世界的大门。

掌握 PowerShell 是一个持续学习的过程。从现在开始:

  1. 多练习: 尝试使用 PowerShell 完成日常操作,比如文件管理、进程查看、服务管理等。
  2. 善用 Get-Help 遇到任何问题,首先查阅内置帮助。
  3. 阅读微软官方文档: MSDN 和 Microsoft Docs 是 PowerShell 学习的权威资源。
  4. 探索更多 Cmdlet: PowerShell 提供了数千个 Cmdlet,覆盖了 Windows 系统的方方面面。使用 Get-Command 发现更多有用的 Cmdlet。
  5. 学习更高级的脚本编写技巧: 函数、模块、错误处理、循环、条件判断等。

PowerShell 是一个强大且不断发展的工具,掌握它将极大地提升你在 Windows 环境下的工作效率和管理能力。从“概念”到“入门”只是第一步,持续的实践和探索将带你领略 PowerShell 更深层次的魅力。

祝你学习顺利,在 PowerShell 的世界里玩得开心!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部