Windows PowerShell 基础教程:从零开始 – wiki基地


Windows PowerShell 基础教程:从零开始

引言:告别重复,拥抱自动化

在日常使用或管理 Windows 系统时,你是否常常感到有些操作繁琐、重复?比如批量重命名文件、查找特定类型的日志、检查系统状态、安装软件等。如果你一直在手动点击鼠标完成这些任务,那么是时候了解一个强大的工具了:Windows PowerShell。

对于许多初学者来说,命令行界面(CLI)可能看起来令人望而生畏,一堆字符闪烁在黑底白字(或蓝底白字)的窗口中。但请相信,掌握 PowerShell 就像学会一门新的语言,它能让你与 Windows 系统进行更高效、更直接的对话,极大地提升你的工作效率,尤其是在系统管理、自动化任务、数据处理等方面。

本教程将带你从零开始认识和使用 PowerShell,从最基本的概念到常用的命令,再到简单的数据处理和脚本编写,让你逐步掌握这个强大的工具。

第一章:初识 PowerShell

1.1 什么是 PowerShell?

简单来说,PowerShell 是一个由微软开发的任务自动化和配置管理框架,它包含了一个命令行 Shell 和一种脚本语言。与传统的命令提示符(Command Prompt, CMD)不同,PowerShell 基于 .NET Framework 构建,其核心优势在于它处理的不是简单的文本流,而是结构化的对象

1.2 PowerShell 与 CMD 的区别

这是初学者最常问的问题。虽然两者都可以执行命令,但底层机制和能力有着本质区别:

  • 处理单元不同:
    • CMD: 主要处理文本。一个命令的输出是文本,下一个命令如果想利用上一个命令的结果,需要通过解析文本来实现,这通常比较复杂且容易出错。
    • PowerShell: 主要处理对象。一个命令的输出是具有属性(Properties)和方法(Methods)的结构化对象。你可以轻松地访问、过滤、排序和操作这些对象的属性,而无需进行复杂的文本解析。
  • 命令体系不同:
    • CMD: 基于传统的 DOS 命令,命令数量有限,功能相对基础。
    • PowerShell: 基于 Cmdlet(命令小程序)。Cmdlet 遵循“动词-名词”的命名规范(如 Get-Process),更具可读性和一致性。PowerShell 拥有大量的内置 Cmdlet,还可以通过模块无限扩展,涵盖系统管理的方方面面。
  • 脚本能力:
    • CMD: 批处理脚本(.bat 或 .cmd)功能相对较弱,语法古老。
    • PowerShell: 拥有功能丰富的脚本语言,支持变量、数据类型、条件判断、循环、函数等高级编程特性,可以编写复杂的自动化脚本。
  • 可发现性与帮助系统:
    • CMD: 帮助信息通常很简单。
    • PowerShell: 拥有强大的内置帮助系统(Get-Help),可以详细查询 Cmdlet 的用法、参数和示例,极大地降低了学习难度。

总而言之,PowerShell 是 CMD 的强大升级,它更现代、更强大、更灵活,是 Windows 系统管理和自动化的未来。

1.3 为什么要学习 PowerShell?

  • 提高效率: 自动化重复性任务,批量处理文件、用户、计算机设置等。
  • 系统管理: 轻松管理本地和远程 Windows 服务器和客户端。
  • 故障排除: 快速获取系统信息、诊断问题。
  • 软件部署与配置: 编写脚本自动化软件安装和系统配置。
  • 跨平台(PowerShell Core): PowerShell 不再仅限于 Windows,PowerShell Core (PowerShell 6 及更高版本) 已支持 Linux 和 macOS。
  • 职业发展: 在 IT 系统管理、自动化运维等领域,PowerShell 是必备技能。

第二章:启动 PowerShell

启动 PowerShell 有多种方法,选择你最习惯的一种:

  1. 通过搜索栏: 点击任务栏搜索图标或按 Win + S,输入 “PowerShell”,然后点击 “Windows PowerShell”。
  2. 通过运行窗口:Win + R 打开运行窗口,输入 powershell,按回车。
  3. 通过文件资源管理器: 在文件资源管理器中,在地址栏输入 powershell 并按回车,会在当前文件夹路径下打开 PowerShell。或者,在文件资源管理器中,按住 Shift 键,右键点击文件夹空白处,选择 “在此处打开 PowerShell 窗口” (较新版本可能显示 “在此处打开终端”,然后默认打开 PowerShell)。
  4. 以管理员身份运行: 对于需要执行系统级任务的操作,通常需要以管理员身份运行 PowerShell。在搜索结果中找到 “Windows PowerShell”,右键点击,选择 “以管理员身份运行”。你会看到窗口标题栏包含 “管理员” 字样。

启动后,你会看到一个命令行窗口,其中包含一个提示符(Prompt),通常是当前路径加上 > 符号,例如:

PS C:\Users\YourUserName>

PS 表示你当前正在使用 PowerShell。

第三章:PowerShell 的核心概念

掌握 PowerShell,必须理解以下几个核心概念:

3.1 Cmdlet (命令小程序)

Cmdlet 是 PowerShell 中最基本的命令单元。它们的命名非常规范和一致,通常遵循“动词-名词”的格式,中间用连字符 - 连接。

  • 动词 (Verb): 表示要执行的操作,如 Get (获取)、Set (设置)、New (新建)、Remove (移除)、Start (启动)、Stop (停止) 等。这些动词是标准化的,你可以通过 Get-Verb Cmdlet 查看所有标准动词。
  • 名词 (Noun): 表示操作的对象,如 Process (进程)、Service (服务)、File (文件)、Item (项目)、Command (命令) 等。

例子:

  • Get-Process: 获取当前正在运行的进程信息。
  • Stop-Service: 停止一个正在运行的服务。
  • New-Item: 创建一个新的文件或文件夹。
  • Remove-Item: 删除一个文件或文件夹。

这种命名方式使得 Cmdlet 的功能一目了然,非常易于记忆和猜测。

3.2 对象 (Object)

这是 PowerShell 与 CMD 最核心的区别。当一个 Cmdlet 执行后,它不会简单地输出一堆文本,而是输出一个或多个对象。每个对象都包含了一系列属性 (Properties) 和可能的操作方法 (Methods)

例子: 执行 Get-Process,它不会只给你进程的名字,而是会输出一个或多个进程对象。每个进程对象都包含诸如 Name (名称)、ID (进程ID)、CPU (CPU占用率)、Memory (内存占用) 等属性。

你可以使用 Get-Member Cmdlet 来查看一个对象有哪些属性和方法。例如:

powershell
Get-Process | Get-Member

(稍后我们会讲解 | 管道的用法)

理解对象的重要性在于,你可以直接访问和操作这些结构化的数据,而无需进行复杂的文本解析。这让数据过滤、排序和进一步处理变得非常容易。

3.3 管道 (Pipeline)

管道是 PowerShell 中一个极其强大的特性,使用符号 | 表示。它允许你将一个 Cmdlet 的输出对象作为另一个 Cmdlet 的输入。

语法:

powershell
Cmdlet-A | Cmdlet-B | Cmdlet-C ...

Cmdlet-A 执行并将输出的对象传递给 Cmdlet-BCmdlet-B 对接收到的对象进行处理,然后将其输出传递给 Cmdlet-C,依此类推。

例子:

  • Get-Process | Stop-Process: 获取进程对象,然后停止这些进程(这需要谨慎使用,并指定要停止的进程)。
  • Get-Service | Where-Object {$_.Status -eq 'Running'}: 获取所有服务对象,然后将其中状态为 ‘Running’ 的服务对象过滤出来。
  • Get-ChildItem | Sort-Object LastWriteTime -Descending: 获取当前目录下的所有文件和文件夹对象,然后按最后修改时间倒序排序。

管道和对象的结合是 PowerShell 强大的基石,它使得组合简单的命令来完成复杂任务成为可能。

3.4 参数 (Parameters)

Cmdlet 通常接受参数来修改其行为。参数名前面使用连字符 -

语法:

powershell
Cmdlet-Name -ParameterName 参数值 -AnotherParameterName AnotherParameterValue

有些参数是必需的,有些是可选的。有些参数可以接受多个值,有些是开关参数(Presence Parameter),只需要列出参数名即可,不需要值(表示启用该功能)。

例子:

  • Get-ChildItem -Path C:\Windows: 获取 C:\Windows 目录下的项目。-Path 是参数名,C:\Windows 是参数值。
  • Stop-Process -Name notepad: 停止名为 “notepad” 的进程。-Name 是参数。
  • Get-Service -DisplayName *sql*: 获取显示名称中包含 “sql” 的服务。-DisplayName 是参数,*sql* 是参数值,使用了通配符 *
  • Get-ChildItem -Recurse: 获取当前目录及其所有子目录下的项目。-Recurse 是一个开关参数,表示递归查找。

第四章:获取帮助

在你学习和使用 PowerShell 的过程中,获取帮助是最重要也是最常用的操作之一。PowerShell 内置了强大的帮助系统。

4.1 Get-Help Cmdlet

Get-Help 是你的好朋友。它可以用来查询 Cmdlet 的详细信息、参数、示例等。

基本用法:

powershell
Get-Help Cmdlet-Name

例子:

powershell
Get-Help Get-Process

这将显示 Get-Process 的简要描述、语法和备注。

获取更多信息:

  • -Detailed: 显示参数的详细描述。
    powershell
    Get-Help Get-Process -Detailed
  • -Examples: 显示 Cmdlet 的使用示例。
    powershell
    Get-Help Get-Process -Examples
  • -Full: 显示所有详细信息,包括参数、示例、输入/输出类型等。
    powershell
    Get-Help Get-Process -Full
  • -Online: 在默认浏览器中打开 Cmdlet 的最新在线帮助文档(强烈推荐)。
    powershell
    Get-Help Get-Process -Online

更新帮助文档:

PowerShell 的帮助文档可以离线使用,但可能不是最新的。你可以定期更新它们:

powershell
Update-Help

首次运行可能需要管理员权限,且需要联网下载。

查找 Cmdlet:

如果你不知道要使用哪个 Cmdlet,可以结合通配符使用 Get-Help 来查找:

powershell
Get-Command *Process* # 查找所有名称中包含 "Process" 的 Cmdlet
Get-Command -Noun Service # 查找所有名词是 "Service" 的 Cmdlet
Get-Command -Verb Get # 查找所有动词是 "Get" 的 Cmdlet

Get-Command 是用来查找 Cmdlet 本身的,而 Get-Help 是用来获取 Cmdlet 使用方法的。两者经常配合使用。

第五章:常用基础命令 (Cmdlets)

现在,我们来学习一些最基础和最常用的 Cmdlet。

5.1 文件系统操作

这部分 Cmdlet 类似于 CMD 或 Linux 中的文件操作命令。PowerShell 为了一些兼容性,保留了许多 CMD/Linux 的别名。

  • 获取当前位置:
    • Cmdlet: Get-Location
    • 别名: gl, pwd (Print Working Directory)
    • 用法: Get-Locationpwd
  • 设置位置 (切换目录):
    • Cmdlet: Set-Location
    • 别名: sl, cd (Change Directory), chdir
    • 用法: Set-Location C:\Windowscd C:\Windows
    • 返回上一级: cd ..
    • 返回根目录: cd \ (Windows) 或 cd / (Linux/macOS PowerShell Core)
  • 获取目录内容 (列出文件和文件夹):
    • Cmdlet: Get-ChildItem
    • 别名: gci, ls (List Segments), dir (Directory)
    • 用法:
      • Get-ChildItemls (当前目录)
      • Get-ChildItem C:\Windows (指定目录)
      • Get-ChildItem -Path C:\Scripts\*.ps1 (使用通配符查找特定文件)
      • Get-ChildItem -Recurse (递归查找子目录)
      • Get-ChildItem -Force (显示隐藏和系统文件/文件夹)
  • 创建项目 (文件或文件夹):
    • Cmdlet: New-Item
    • 用法:
      • New-Item -Path .\NewFolder -ItemType Directory (创建文件夹)
      • New-Item -Path .\NewFile.txt -ItemType File (创建文件)
  • 复制项目:
    • Cmdlet: Copy-Item
    • 别名: copy, cp
    • 用法: Copy-Item .\File.txt .\NewFolder\ (复制文件到文件夹)
    • 用法: Copy-Item .\Folder1 .\Folder2 -Recurse (递归复制文件夹)
  • 移动项目:
    • Cmdlet: Move-Item
    • 别名: move, mv
    • 用法: Move-Item .\File.txt ..\ (移动文件到上一级目录)
  • 重命名项目:
    • Cmdlet: Rename-Item
    • 别名: ren
    • 用法: Rename-Item .\OldName.txt NewName.txt
  • 删除项目:
    • Cmdlet: Remove-Item
    • 别名: del, erase, rd, rm, rmdir
    • 用法:
      • Remove-Item .\File.txt (删除文件)
      • Remove-Item .\NewFolder (删除空文件夹)
      • Remove-Item .\NonEmptyFolder -Recurse -Force (删除非空文件夹及其内容,谨慎使用!)

5.2 内容操作

  • 获取文件内容:
    • Cmdlet: Get-Content
    • 别名: gc, cat, type
    • 用法: Get-Content .\MyFile.txt (显示文件内容)
    • 用法: Get-Content .\MyLog.log -Tail 10 (显示文件末尾10行)
  • 设置文件内容 (覆盖):
    • Cmdlet: Set-Content
    • 别名: sc
    • 用法: Set-Content .\NewFile.txt "这是新内容" (创建或覆盖文件内容)
  • 添加文件内容 (追加):
    • Cmdlet: Add-Content
    • 别名: ac
    • 用法: Add-Content .\ExistingFile.txt "这是追加的内容" (向文件末尾追加内容)

5.3 变量

变量用于存储数据。在 PowerShell 中,变量名前面使用美元符号 $。变量没有固定的数据类型,PowerShell 会根据赋给它的值自动判断。

  • 创建和赋值:
    • $myVariable = "Hello, PowerShell!"
    • $number = 123
    • $date = Get-Date (将 Get-Date 命令的输出对象赋给变量)
  • 使用变量:
    • Write-Host $myVariable (在控制台输出变量的值)
    • "今天日期是: $($date)" (在字符串中使用变量,建议用 $() 包裹复杂变量或表达式)
    • Get-ChildItem -Path $myFolderPath (将变量作为命令参数)

5.4 基本输入输出

  • 输出到控制台:
    • Cmdlet: Write-Host
    • 用法: Write-Host "欢迎来到 PowerShell!"
  • 读取用户输入:
    • Cmdlet: Read-Host
    • 用法:
      powershell
      $userName = Read-Host "请输入你的名字"
      Write-Host "你好,$userName!"

第六章:深入理解对象与管道

掌握如何利用对象的属性和方法以及如何使用管道是 PowerShell 进阶的关键。

6.1 使用管道结合其他 Cmdlet

还记得前面提到的对象吗? Cmdlet 输出的对象可以包含许多信息。通过管道,我们可以将这些信息传递给其他 Cmdlet 进行进一步处理。

  • 获取对象成员 (Get-Member): 查看对象的属性 (Property) 和方法 (Method)。
    powershell
    Get-Process | Get-Member

    输出会告诉你进程对象有哪些属性(如 NameIdCPU)和方法(如 KillRefresh)。
  • 选择对象属性 (Select-Object): 只保留你感兴趣的属性(列)。
    • 别名: select
      powershell
      Get-Process | Select-Object Name, ID, CPU

      这将列出所有进程,但只显示它们的名称、ID 和 CPU 占用率。
      powershell
      Get-Service | Select-Object -First 5 Name, Status

      获取前5个服务,并显示它们的名称和状态。
  • 过滤对象 (Where-Object): 根据对象的属性值进行筛选。
    • 别名: where, ?
    • 语法格式通常是 Where-Object {$_.属性名 比较运算符 值}$_ 代表当前正在通过管道传递的对象。
    • 比较运算符:
      • -eq (等于)
      • -ne (不等于)
      • -gt (大于)
      • -lt (小于)
      • -ge (大于等于)
      • -le (小于等于)
      • -like (匹配通配符,如 *?)
      • -notlike (不匹配通配符)
      • -match (匹配正则表达式)
      • -notmatch (不匹配正则表达式)
    • 用法:
      powershell
      Get-Process | Where-Object {$_.CPU -gt 10} # 查找 CPU 占用大于 10 的进程
      Get-Service | Where-Object {$_.Status -eq 'Running'} # 查找正在运行的服务
      Get-ChildItem | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-7)} # 查找最近7天内修改的文件/文件夹
      Get-Process | Where-Object {$_.Name -like 'c*'} # 查找名称以 'c' 开头的进程
  • 排序对象 (Sort-Object): 根据对象的属性值进行排序。
    • 别名: sort
      powershell
      Get-Process | Sort-Object CPU -Descending # 按 CPU 占用率降序排序
      Get-ChildItem | Sort-Object LastWriteTime # 按最后修改时间升序排序 (默认)
  • 格式化输出 (Format-*): 改变对象在控制台的显示方式。注意,这些命令会销毁对象的结构,输出变为格式化的文本,通常放在管道的最后一步。
    • Format-Table (ft):以表格形式显示 (默认通常是这个)。
    • Format-List (fl):以列表形式显示每个对象的每个属性,适合查看详细信息。
    • Format-Wide (fw):只显示一个属性,多列显示,适合只看名称等简单信息。
      powershell
      Get-Process | Format-List Name, ID, Path # 以列表形式显示特定属性
      Get-Service | Format-Wide Name # 只显示服务名称

第七章:第一个 PowerShell 脚本

虽然你可以在命令行中直接输入 Cmdlet,但对于更复杂的任务,将命令保存在脚本文件中更加方便和可重用。

7.1 什么是 PowerShell 脚本?

PowerShell 脚本是一个包含一系列 PowerShell 命令的文本文件,文件扩展名为 .ps1。你可以像运行单个命令一样运行脚本文件,PowerShell 会按顺序执行其中的命令。

7.2 编写脚本

你可以使用任何文本编辑器(如记事本)编写 PowerShell 脚本,但更推荐使用专门的工具,如 PowerShell ISE (Integrated Scripting Environment)Visual Studio Code (安装 PowerShell 扩展)。这些工具提供了语法高亮、代码智能提示、调试功能等,极大地提高了编写效率。

示例脚本 (MyFirstScript.ps1):

“`powershell

这是一个简单的 PowerShell 脚本

脚本功能:获取当前日期时间并输出

Write-Host “运行脚本:获取当前日期和时间”

获取当前日期和时间对象

$currentDateTime = Get-Date

输出日期时间

Write-Host “当前日期和时间是: $($currentDateTime)”

稍作等待

Start-Sleep -Seconds 2

获取系统信息并输出部分内容

Write-Host “n获取一些系统信息:" #n 表示换行

Get-ComputerInfo | Select-Object OsName, OsVersion, OsHardwareAbstractionLayer | Format-List

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

将上面的代码保存为一个 .ps1 文件,例如 MyFirstScript.ps1

7.3 执行脚本

默认情况下,为了安全起见,Windows 不允许直接双击运行 .ps1 脚本文件(它会打开记事本)。你需要在 PowerShell 窗口中执行脚本。

要执行一个脚本文件,你需要提供它的完整路径或相对路径。

  • 在当前目录下执行: 如果脚本文件在当前 PowerShell 所在的目录下,使用 ./ 表示当前目录:
    powershell
    .\MyFirstScript.ps1
  • 使用完整路径执行:
    powershell
    C:\Path\To\Your\Scripts\MyFirstScript.ps1

7.4 执行策略 (Execution Policy)

当你第一次尝试执行脚本时,可能会遇到错误信息,提示脚本无法运行,这通常是由于 PowerShell 的执行策略 (Execution Policy) 阻止了脚本的运行。

执行策略是 PowerShell 的一项安全功能,用于控制脚本在计算机上运行的条件。常见的策略有:

  • Restricted (默认):不允许任何脚本运行。
  • AllSigned: 只允许运行经过数字签名验证的脚本。
  • RemoteSigned: 允许运行本地自己编写的脚本,但从网上下载的脚本必须经过数字签名。
  • Unrestricted: 允许运行所有脚本,存在安全风险。
  • Bypass: 不加载任何配置,不进行任何检查,完全绕过执行策略,极不安全。

查看当前执行策略:

powershell
Get-ExecutionPolicy

更改执行策略:

你可以根据需要更改执行策略。通常,对于学习和个人使用,将策略设置为 RemoteSigned 是一个比较平衡的选择。你需要以管理员身份运行 PowerShell 来更改全局策略。

powershell
Set-ExecutionPolicy RemoteSigned

执行此命令后,系统会提示你确认更改。输入 YA 并回车即可。

重要提示: 将执行策略设置为 UnrestrictedBypass 存在安全风险,请谨慎操作,尤其是在生产环境或不确定脚本来源的情况下。

第八章:实际应用举例

通过几个简单的例子来感受 PowerShell 的强大之处。

8.1 列出前 5 个占用内存最多的进程:

powershell
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, WorkingSet | Format-Table

  • Get-Process: 获取所有进程对象。
  • Sort-Object WorkingSet -Descending: 按 WorkingSet (工作集内存) 属性降序排序。
  • Select-Object -First 5 Name, WorkingSet: 选择前 5 个对象,并只保留 NameWorkingSet 属性。
  • Format-Table: 以表格形式输出结果。

8.2 查找 C 盘大于 1GB 的文件:

powershell
Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue | Where-Object {$_.Length -gt 1GB} | Format-Table Name, Length, FullName

  • Get-ChildItem C:\ -Recurse: 递归查找 C 盘所有文件和文件夹。
  • -ErrorAction SilentlyContinue: 忽略查找过程中可能出现的权限错误。
  • Where-Object {$_.Length -gt 1GB}: 过滤出 Length (文件大小) 大于 1GB 的对象。注意:文件夹没有 Length 属性,所以 $_.Length 为空,比较时会被忽略,只处理文件。PowerShell 支持单位后缀,如 KB, MB, GB, TB, PB
  • Format-Table Name, Length, FullName: 以表格形式显示文件名、大小和完整路径。

8.3 获取本机所有 IP 地址:

powershell
Get-NetIPAddress | Where-Object {$_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -eq 'Dhcp'} | Select-Object IPAddress, InterfaceAlias

  • Get-NetIPAddress: 获取所有网络适配器的 IP 地址信息。
  • Where-Object {$_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -eq 'Dhcp'}: 过滤出 IPv4 地址且是通过 DHCP 获取的地址。
  • Select-Object IPAddress, InterfaceAlias: 只显示 IP 地址和对应的网络接口名称。

第九章:进阶之路

本教程只是带你入了 PowerShell 的门。PowerShell 的功能远不止这些。接下来,你可以继续学习:

  • 控制流程: If/Else 条件判断,For, ForEach, While 循环。
  • 函数: 编写可重用的代码块。
  • 错误处理: Try/Catch/Finally
  • 模块 (Modules): PowerShell 的功能可以通过模块进行扩展,许多微软产品和第三方软件都提供了 PowerShell 模块来自动化管理(如 Active Directory 模块, Exchange Online 模块, Azure 模块)。
  • 远程处理 (Remoting): 通过 PowerShell 连接到远程计算机执行命令或脚本。
  • Desired State Configuration (DSC): 用于配置管理和部署。
  • 集成脚本环境 (ISE) 或 VS Code 的高级功能: 调试、片段、格式化等。
  • 正则表达式 (Regular Expressions): 结合 -match 等运算符进行更强大的文本匹配。
  • WMI 和 CIM: 访问更底层的 Windows 管理信息。

结语:实践出真知

学习 PowerShell 最好的方法就是动手实践。从简单的命令开始,逐步尝试组合 Cmdlet,解决你日常工作中遇到的实际问题。遇到困难时,不要犹豫使用 Get-Help 和搜索引擎。有很多优秀的在线资源、博客、论坛和社区可以提供帮助。

PowerShell 是一个非常值得投入时间学习的技能。它将极大地提高你在 Windows 环境下的工作效率,为你的职业发展开辟新的道路。

现在,打开你的 PowerShell 窗口,开始你的自动化之旅吧!


发表评论

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

滚动至顶部