Windows PowerShell 基础教程:入门必看 – wiki基地


Windows PowerShell 基础教程:入门必看

欢迎来到Windows PowerShell的世界!如果你是系统管理员、开发者,或者仅仅是对自动化和更高效地管理Windows系统感兴趣,那么学习PowerShell绝对是一个值得的投资。它不仅仅是一个命令行工具,更是一个强大的自动化和配置管理平台。

本教程将从零开始,带你了解PowerShell是什么,为什么它如此重要,以及如何使用它的核心功能。我们将深入浅出地讲解 cmdlet、对象、管道、变量、脚本等概念,并提供大量实用示例。准备好了吗?让我们开始这段激动人心的学习旅程!

第一章:初识PowerShell – 它是什么以及为何重要

1.1 什么是Windows PowerShell?

简单来说,Windows PowerShell 是微软开发的一种命令行 Shell、脚本语言和自动化平台。它最初是为Windows系统设计的,但现在也有了跨平台的版本——PowerShell Core,可以在Linux、macOS和Windows上运行。

与传统的命令行工具(如Windows的 cmd.exe 或 Linux 的 Bash)不同,PowerShell 的核心优势在于它是面向对象的。这意味着命令的输出不仅仅是文本字符串,而是结构化的对象,这些对象拥有属性(Properties)和方法(Methods)。这种特性使得处理、过滤、排序和操作数据变得异常强大和灵活。

1.2 为什么需要学习PowerShell?

在现代IT环境中,自动化是提高效率、减少错误和应对复杂性的关键。PowerShell正是微软为实现这一目标而构建的核心工具。学习PowerShell能为你带来诸多好处:

  • 强大的自动化能力: 批量处理任务、自动化软件部署、定时执行维护脚本等等。
  • 高效的系统管理: 轻松管理本地和远程的Windows系统、Active Directory、Exchange Server、SQL Server、Azure、Microsoft 365等。
  • 标准化的管理方式: 微软的很多新产品和技术都优先或只提供PowerShell管理接口。
  • 更好的故障排查: 利用PowerShell收集系统信息、分析日志、诊断问题。
  • 提升工作效率: 将重复的手动操作转化为一行命令或一个脚本。
  • 面向对象的优势: 相比文本处理,操作对象更精确、更高效,不易出错。
  • 丰富的生态系统: 大量模块和Cmdlet可供使用,几乎覆盖了Windows系统的方方面面。

如果你想成为一名更高效、更有竞争力的IT专业人士,掌握PowerShell已不再是可选项,而是必备技能。

1.3 PowerShell vs. Cmd.exe

了解PowerShell与传统的Cmd.exe(命令提示符)之间的区别对于理解PowerShell的优势至关重要:

  • Cmd.exe: 基于文本的命令行工具。命令的输出是文本字符串。处理这些输出通常需要使用管道和文本处理工具(如findstrmore等),容易出错,且依赖于输出格式。
  • PowerShell: 基于对象的命令行 Shell。命令的输出是结构化的对象。可以使用统一的方式访问对象的属性和方法,并使用管道将对象传递给其他命令进行进一步处理。这使得数据处理更加可靠和灵活。
  • 命令语法: Cmd.exe 命令通常是简短的、类似DOS的命令。PowerShell 使用的是更具描述性的 “Verb-Noun” (动词-名词) 结构,如 Get-ProcessSet-Location 等。
  • 功能深度: PowerShell 提供了对 .NET Framework (.NET Core) 的全面访问,这意味着你可以利用 .NET 的强大功能来完成复杂的任务,而 Cmd.exe 功能相对有限。
  • 脚本能力: PowerShell 的脚本语言功能强大,支持变量、控制流(循环、条件判断)、函数、模块等高级编程特性。

总之,PowerShell 是Cmd.exe 的继任者,它带来了更现代、更强大、更统一的管理和自动化能力。

第二章:获取并启动PowerShell

Windows 10/11 以及 Windows Server 的现代版本都预装了PowerShell。你可以通过几种方式来启动它:

  1. 通过搜索栏: 点击任务栏的搜索图标或按下 Windows键 + S,输入 “PowerShell”,你会看到 “Windows PowerShell” 应用程序。
  2. 通过运行命令: 按下 Windows键 + R 打开“运行”对话框,输入 powershell 并按回车。
  3. 通过开始菜单: 在开始菜单中找到 “Windows PowerShell” 文件夹并打开。
  4. 作为管理员运行: 对于许多需要修改系统设置的任务,你需要以管理员权限运行PowerShell。在搜索结果或开始菜单中,右键点击 “Windows PowerShell”,选择 “以管理员身份运行”。

通常,你会看到一个蓝色的窗口,里面有一个提示符,看起来像这样:

PS C:\Users\YourUserName>

PS 表示你正在使用PowerShell。C:\Users\YourUserName 是你当前所在的目录。光标闪烁处是你输入命令的地方。

除了标准的 PowerShell 控制台,你可能还会看到 PowerShell ISE (Integrated Scripting Environment)。ISE 提供了一个更友好的图形界面,包含代码编辑器(支持语法高亮、智能感知)、交互式控制台和一个命令窗口,非常适合编写和调试脚本。对于初学者,控制台更适合练习单行命令,而ISE则适合开始编写脚本。

对于更高级的开发和跨平台需求,推荐使用 Visual Studio Code 并安装PowerShell扩展。

在本教程中,我们将主要使用标准的PowerShell控制台进行演示。

第三章:PowerShell的核心概念 – Cmdlet、对象、参数与帮助系统

3.1 Cmdlet (命令let) – PowerShell的命令单元

PowerShell 中的基本命令单元被称为 Cmdlet(读作 “command-let”)。Cmdlet 总是遵循 Verb-Noun (动词-名词) 的命名约定,通过连字符 - 连接动词和名词。

  • 动词 (Verb): 表示要执行的操作,如 Get (获取)、Set (设置)、New (新建)、Remove (删除)、Start (启动)、Stop (停止) 等。使用标准动词有助于保持命令的一致性和可预测性。你可以通过 Get-Verb 命令查看所有标准的PowerShell动词。
  • 名词 (Noun): 表示操作的对象,如 Process (进程)、Service (服务)、Item (项,可以是文件、文件夹、注册表项等)、Command (命令)、EventLog (事件日志) 等。

这种命名方式使得Cmdlet 的功能一目了然。例如:

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

要查看系统中可用的 Cmdlet,可以使用 Get-Command Cmdlet。例如,要查找所有与“进程”相关的命令,可以输入:

powershell
Get-Command *Process*

这里的 * 是通配符,表示匹配任何字符。

3.2 参数 (Parameters) – 定制你的命令

Cmdlet 通常接受一个或多个参数来修改其行为或指定操作的对象。参数以连字符 - 开头,后面跟着参数名称,然后是参数值(如果需要)。

例如,Get-Process Cmdlet 可以接受 -Name 参数来指定你想获取哪个进程的信息:

powershell
Get-Process -Name notepad

这将只获取名为 notepad 的进程信息。

有些参数不需要值,它们被称为开关参数 (Switch Parameters)。它们的存在本身就开启了某个功能。例如,很多 Cmdlet 有一个 -Force 参数,用来强制执行某个操作(如删除只读文件)。

powershell
Remove-Item C:\path\to\readonlyfile.txt -Force

Cmdlet 还可以有多个参数:

powershell
Copy-Item C:\source\file.txt -Destination D:\target\folder

这里的 -Path 参数通常是位置参数(第一个参数),所以很多时候可以省略参数名 Path,直接写路径。但为了清晰起见,特别是对于初学者,建议总是写出参数名。

3.3 对象 (Objects) – PowerShell的真正力量

这是PowerShell与传统Shell最大的不同点。PowerShell Cmdlet 的输出是结构化的对象,而不是简单的文本。

例如,运行 Get-Process

powershell
Get-Process

你看到的输出可能像一个表格,包含 HandlesNPM(K)PM(K)WS(K)CPUIdProcessName 等列。这些列实际上是每个进程对象属性

每个对象除了属性,还有方法 (Methods),即可以对该对象执行的动作。

要查看一个 Cmdlet 输出的对象类型、属性和方法,可以使用 Get-Member Cmdlet,并将前一个 Cmdlet 的输出通过管道传递给它。

例如,查看 Get-Process 输出对象的成员:

powershell
Get-Process | Get-Member

输出会显示该对象是 System.Diagnostics.Process 类型,列出所有可用的属性(AliasPropertyCodePropertyProperty 等)和方法(Method)。

面向对象的优势体现在哪里?

  • 精确的数据访问: 你可以轻松地访问对象的特定属性。例如,只想看进程的名称和ID:
    powershell
    Get-Process | Select-Object ProcessName, Id
  • 灵活的数据处理: 你可以基于对象的属性来过滤、排序或分组数据。例如,查找CPU使用率大于100的进程:
    powershell
    Get-Process | Where-Object {$_.CPU -gt 100}

    这里的 $_ 代表管道中当前处理的对象。
  • 与其他Cmdlet无缝协作: 一个 Cmdlet 的对象输出可以直接作为另一个 Cmdlet 的对象输入(通过管道)。

理解“对象”是掌握PowerShell的关键。它让数据处理变得更加结构化和强大。

3.4 别名 (Aliases) – 方便的快捷方式

PowerShell 提供了一些别名,它们是 Cmdlet 的简短名称或常用命令的快捷方式。这样做有几个目的:

  • 兼容性: 提供一些与Cmd.exe 或 Linux Bash 类似的命令别名,方便有其他Shell经验的用户过渡。例如:
    • dirGet-ChildItem 的别名
    • cdchdirSet-Location 的别名
    • ls 也是 Get-ChildItem 的别名
    • copyCopy-Item 的别名
    • delrmRemove-Item 的别名
  • 提高输入速度: 对于常用的 Cmdlet,别名可以减少输入量。

要查看所有别名及其对应的 Cmdlet,使用 Get-Alias Cmdlet。要查找特定 Cmdlet 的别名,可以使用:

powershell
Get-Alias -Definition Get-ChildItem

重要提示: 虽然别名在交互式命令行中很方便,但在编写脚本时,强烈建议使用 Cmdlet 的完整名称。这样可以提高脚本的可读性,避免混淆,并确保脚本在不同环境下的兼容性(因为自定义的别名可能不存在)。

3.5 强大的帮助系统 – 你的最佳学习伙伴

PowerShell 拥有一个非常全面和易于使用的帮助系统。这是学习任何新 Cmdlet 或概念时最重要的资源。

核心 Cmdlet 是 Get-Help

  • 获取 Cmdlet 的基本帮助:
    powershell
    Get-Help Get-Process

    这将显示 Cmdlet 的功能、语法、参数列表。

  • 获取完整帮助信息:
    powershell
    Get-Help Get-Process -Full

    包含详细的功能描述、语法、所有参数及其说明、输入/输出类型、相关链接等。

  • 获取 Cmdlet 的示例:
    powershell
    Get-Help Get-Process -Examples

    直接查看该 Cmdlet 的使用示例,这是学习 Cmdlet 用法的极好方式。

  • 在线查看帮助:
    powershell
    Get-Help Get-Process -Online

    在你的浏览器中打开该 Cmdlet 的最新在线文档。强烈推荐使用此方式,因为在线文档通常更及时和全面。

  • 更新帮助文件: PowerShell 的帮助文件可以离线存储在你的电脑上,但可能不是最新的。定期更新帮助文件是一个好习惯。以管理员身份运行PowerShell,执行:
    powershell
    Update-Help

    这会下载最新的帮助文档到你的本地。首次运行或长时间未运行可能会花费一些时间。

  • 搜索帮助主题: 如果你不确定 Cmdlet 名称,可以搜索关键词:
    powershell
    Get-Help process

    或搜索概念性帮助主题:
    powershell
    Get-Help about_objects

    概念性帮助主题(about_*)解释了PowerShell的核心概念,对于深入理解非常有帮助。

掌握 Get-Help 的使用方法,你就掌握了 PowerShell 自学的钥匙。遇到不熟悉的 Cmdlet 或想了解更多细节时,请务必使用 Get-Help

第四章:基础操作示例 – 文件、目录与进程管理

现在,让我们通过一些实际的例子来应用之前学到的概念。

4.1 文件和目录管理

这可能是命令行中最常用的操作之一。PowerShell 使用以 -Item 结尾的 Cmdlet 来处理文件和目录。

  • 获取当前目录内容 (dir / ls / Get-ChildItem):
    powershell
    Get-ChildItem
    # 或者使用别名
    dir
    ls

    这会列出当前目录下的文件和子目录。

  • 列出特定目录内容: 使用 -Path 参数。
    powershell
    Get-ChildItem -Path C:\Windows

  • 只列出文件或目录: 使用 -File-Directory 开关参数。
    powershell
    Get-ChildItem -Path C:\Windows -File # 只列出文件
    Get-ChildItem -Path C:\Windows -Directory # 只列出目录

  • 递归列出子目录内容: 使用 -Recurse 参数。
    powershell
    Get-ChildItem -Path C:\MyFolder -Recurse

    这会列出指定文件夹及其所有子文件夹中的内容。谨慎在大型文件夹上使用,可能会产生大量输出。

  • 过滤文件或目录: 使用 -Filter 参数(通常更快,使用文件系统提供者进行过滤)或 Where-Object Cmdlet(更灵活,可以基于任何对象属性过滤)。
    “`powershell
    # 使用 -Filter (适用于文件系统)
    Get-ChildItem -Path C:\MyFolder -Filter *.log # 查找所有 .log 文件

    使用 Where-Object (基于对象属性过滤)

    Get-ChildItem -Path C:\MyFolder | Where-Object {$.LastWriteTime -gt (Get-Date).AddDays(-7)} # 查找过去7天内修改过的文件/文件夹
    ``
    注意
    Where-Object后面的脚本块{}$
    代表当前通过管道传递的对象,$_.LastWriteTime访问对象的LastWriteTime` 属性。

  • 切换目录 (cd / Set-Location):
    powershell
    Set-Location C:\Program Files
    # 或者使用别名
    cd C:\Program Files

    切换到上级目录:
    powershell
    cd ..

    切换到用户主目录:
    powershell
    cd ~

    切换回上一个目录:
    powershell
    cd -

  • 创建新目录 (mkdir / New-Item):
    powershell
    New-Item -Path C:\MyNewFolder -ItemType Directory
    # 或者使用别名
    mkdir C:\MyNewFolder

  • 创建新文件 (New-Item):
    powershell
    New-Item -Path C:\MyNewFolder\mytextfile.txt -ItemType File

  • 复制文件或目录 (copy / Copy-Item):
    powershell
    Copy-Item -Path C:\MyNewFolder\mytextfile.txt -Destination C:\AnotherFolder\copiedfile.txt
    # 复制整个目录及其内容 (-Recurse)
    Copy-Item -Path C:\MyFolder -Destination C:\BackupFolder -Recurse
    # 或者使用别名
    copy C:\MyNewFolder\mytextfile.txt C:\AnotherFolder\copiedfile.txt

  • 移动文件或目录 (move / Move-Item):
    powershell
    Move-Item -Path C:\MyNewFolder\mytextfile.txt -Destination C:\AnotherFolder\movedfile.txt
    # 或者使用别名
    move C:\MyNewFolder\mytextfile.txt C:\AnotherFolder\movedfile.txt

  • 重命名文件或目录 (ren / Rename-Item):
    powershell
    Rename-Item -Path C:\AnotherFolder\movedfile.txt -NewName renamedfile.txt
    # 或者使用别名
    ren C:\AnotherFolder\movedfile.txt renamedfile.txt

  • 删除文件或目录 (del / rm / Remove-Item):
    powershell
    Remove-Item -Path C:\AnotherFolder\renamedfile.txt
    # 删除非空目录 (-Recurse -Force)
    Remove-Item -Path C:\MyNewFolder -Recurse -Force
    # 或者使用别名
    del C:\AnotherFolder\renamedfile.txt
    rm C:\MyNewFolder -Recurse -Force

    使用 Remove-Item -Recurse -Force 时要非常小心,它会删除指定路径下的所有内容而不进行提示!

  • 查看文件内容 (type / cat / Get-Content):
    powershell
    Get-Content -Path C:\path\to\somefile.log
    # 或者使用别名
    type C:\path\to\somefile.log
    cat C:\path\to\somefile.log

4.2 进程管理

Get-Process 是最常用的 Cmdlet 之一。

  • 获取所有进程:
    powershell
    Get-Process

    输出包括句柄、内存使用、CPU 使用、ID、进程名等信息。

  • 获取特定进程: 使用 -Name 参数。
    powershell
    Get-Process -Name chrome, firefox

    可以同时指定多个进程名(用逗号分隔)。

  • 按ID获取进程: 使用 -Id 参数。
    powershell
    Get-Process -Id 1234

  • 查找占用CPU较高的进程: 结合 Where-ObjectSort-Object
    powershell
    Get-Process | Where-Object {$_.CPU -gt 100} | Sort-Object CPU -Descending

    这将获取所有进程,过滤出CPU使用率大于100的,然后按CPU使用率降序排列。

  • 停止进程: 使用 Stop-Process Cmdlet,通常通过 -Id-Name 指定进程。
    “`powershell
    # 停止 ID 为 1234 的进程
    Stop-Process -Id 1234

    停止 notepad 进程 (如果名称唯一)

    Stop-Process -Name notepad
    “`
    重要: 停止进程可能会导致数据丢失或系统不稳定,请谨慎使用。对于一些系统关键进程,你可能没有权限停止,或者系统会阻止你停止。

4.3 服务管理

  • 获取所有服务:
    powershell
    Get-Service

  • 获取特定服务: 使用 -Name 参数。
    powershell
    Get-Service -Name wuauserv # 获取 Windows Update 服务信息

  • 查找正在运行的服务:
    powershell
    Get-Service | Where-Object {$_.Status -eq "Running"}

  • 查找已停止的服务:
    powershell
    Get-Service | Where-Object {$_.Status -eq "Stopped"}

  • 启动服务: 使用 Start-Service
    powershell
    Start-Service -Name wuauserv

  • 停止服务: 使用 Stop-Service
    powershell
    Stop-Service -Name wuauserv

  • 重启服务: 使用 Restart-Service
    powershell
    Restart-Service -Name wuauserv

4.4 查看系统信息

  • 获取计算机信息: 使用 Get-ComputerInfo
    powershell
    Get-ComputerInfo

    这个 Cmdlet 提供大量的系统信息,包括操作系统、硬件、时区等。

  • 获取操作系统信息 (传统方法): Get-CimInstance 是访问 WMI/CIM (Windows Management Instrumentation / Common Information Model) 的主要方式。
    powershell
    Get-CimInstance -ClassName Win32_OperatingSystem

    WMI/CIM 是一个非常强大的接口,可以查询和管理几乎所有 Windows 系统的组件和配置。

  • 获取磁盘空间信息:
    powershell
    Get-Volume
    # 或者使用 WMI
    Get-CimInstance -ClassName Win32_LogicalDisk | Format-Table DeviceID, FreeSpace, Size, @{Name="PercentFree"; Expression={$_.FreeSpace/$_.Size * 100}}

    这个例子展示了如何计算并显示磁盘的剩余空间百分比,再次体现了对象和属性处理的便利性。Format-Table Cmdlet 用于将输出格式化为表格,@{} 语法用于创建自定义的计算列。

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

管道 (|) 是PowerShell中最强大和最具标志性的特性之一。它允许你将一个命令的输出对象发送给另一个命令作为输入。这种设计哲学被称为“管道对象,而不是管道文本”。

5.1 管道的工作原理

当你在两个 Cmdlet 之间使用管道符号 | 时,左侧 Cmdlet 输出的每个对象都会被发送给右侧 Cmdlet 的输入。右侧 Cmdlet 会逐个处理这些输入的对象

许多 Cmdlet 被设计用来接收来自管道的输入。它们通常有一个或多个参数可以接受来自管道的对象,这些参数通常被称为 ValueFromPipelineValueFromPipelineByPropertyName 参数(可以通过 Get-Help CmdletName -Full 查看)。

5.2 常见的管道应用场景

  • 筛选 (Filtering) – 使用 Where-Object
    用于根据对象的属性值选择符合条件的 subset。
    “`powershell
    # 查找所有启动类型为 Automatic 的服务
    Get-Service | Where-Object {$_.StartType -eq “Automatic”}

    查找内存占用大于 500MB 的进程

    Get-Process | Where-Object {$.WS -gt 500MB} # WS 单位是 KB, 需要转换为 MB
    ``{$
    .PropertyName -operator Value}Where-Object最常见的语法。$_代表当前对象,PropertyName是你要检查的属性,operator是比较运算符(如-eq相等,-ne不等,-gt大于,-lt小于,-ge大于等于,-le小于等于,-like模式匹配,-match正则表达式匹配),Value` 是用于比较的值。

  • 选择特定属性 (Selecting) – 使用 Select-Object
    用于从对象中提取指定的属性,或创建新的计算属性。
    “`powershell
    # 只显示进程的名称和ID
    Get-Process | Select-Object ProcessName, Id

    选择部分属性并重命名,或进行计算

    Get-Service | Select-Object Name, Status, StartType, @{Name=”CanPauseAndContinue”; Expression={$_.CanPauseAndContinue}}
    ``@{}语法用于创建计算属性或自定义属性。Name是新属性的名称,Expression` 是一个脚本块,用于计算属性的值。

  • 排序 (Sorting) – 使用 Sort-Object
    用于根据对象的属性值对对象进行排序。
    “`powershell
    # 按进程名称排序
    Get-Process | Sort-Object ProcessName

    按 CPU 使用率降序排序

    Get-Process | Sort-Object CPU -Descending

    按多个属性排序 (先按状态升序,再按名称升序)

    Get-Service | Sort-Object Status, Name
    “`

  • 格式化输出 (Formatting) – 使用 Format-* Cmdlet:
    虽然 Cmdlet 默认会根据对象类型进行适当的格式化输出(通常是列表或表格),但你可以使用 Format-TableFormat-ListFormat-Wide 等 Cmdlet 来控制输出的样式。注意: Format-* Cmdlet 会破坏对象的结构,它们的输出是格式化后的文本,不应再通过管道传递给其他处理对象的 Cmdlet。它们通常是管道的最后一个 Cmdlet。
    “`powershell
    # 将进程信息格式化为列表显示所有属性
    Get-Process | Format-List *

    将进程信息格式化为表格显示特定属性

    Get-Process | Format-Table Name, Id, WS -AutoSize
    “`

  • 导出数据 – 使用 Export-Csv / Export-CliXml / Out-File 等:
    将 Cmdlet 输出的对象导出到文件。
    “`powershell
    # 将所有服务信息导出到 CSV 文件
    Get-Service | Export-Csv C:\temp\services.csv -NoTypeInformation

    将占用 CPU 较高的进程信息导出到文本文件

    Get-Process | Where-Object {$_.CPU -gt 100} | Select-Object Name, Id, CPU | Out-File C:\temp\high_cpu_processes.txt
    “`

  • 输入数据 – 使用 Import-Csv / Import-CliXml / Get-Content 等:
    从文件读取结构化或非结构化数据作为输入。
    powershell
    # 从 CSV 文件导入数据作为对象
    Import-Csv C:\temp\services.csv | Where-Object {$_.Status -eq "Running"}

管道和对象处理是PowerShell的基石。通过组合 Get-*, Where-Object, Select-Object, Sort-Object 等 Cmdlet,你可以非常灵活地获取、处理和分析系统中的各种数据。

第六章:变量与基础脚本编写

在PowerShell中,你可以使用变量来存储信息,这使得命令更易读,也为编写脚本提供了基础。

6.1 变量 (Variables)

变量在PowerShell中以 $ 符号开头,后面跟着变量名。你不需要提前声明变量的数据类型,PowerShell会根据赋给它的值自动确定(或尝试确定)数据类型。

  • 创建和赋值变量:
    powershell
    $service = Get-Service -Name spooler
    $filePath = "C:\temp\mylog.txt"
    $number = 100
    $date = Get-Date
    $isServiceRunning = $service.Status -eq "Running"

  • 使用变量: 直接在命令中使用变量名即可。
    “`powershell
    # 使用变量查看服务状态
    $service.Status

    使用变量显示文件路径

    Write-Host “The log file is located at: $filePath”

    使用变量进行计算

    $result = $number * 2
    Write-Host $result
    ``
    注意,在双引号字符串中,PowerShell 会解释变量 (
    “$variableName”);在单引号字符串中,变量不会被解释 (‘$variableName’`)。

  • 特殊变量: PowerShell有一些内置的特殊变量,如 $true, $false, $null, $Error, $ErrorActionPreference, $_ 等。

6.2 基础脚本编写

将一系列PowerShell命令保存在一个 .ps1 后缀的文件中,就成为了一个PowerShell脚本。脚本允许你自动化更复杂的任务。

  • 创建脚本文件: 使用任何文本编辑器(如记事本、VS Code、PowerShell ISE)创建一个新文件,输入你的命令,然后以 .ps1 扩展名保存。例如,创建一个名为 Get-RunningServices.ps1 的文件,内容如下:
    “`powershell
    # 这是一个获取正在运行服务的脚本
    Write-Host “Getting running services…”

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

    Write-Host “Done.”
    “`

  • 运行脚本:
    默认情况下,Windows 为了安全考虑,PowerShell 的执行策略 (Execution Policy) 可能设置为 Restricted,这阻止了脚本的运行。你需要根据你的需求更改执行策略。

    • 查看当前执行策略:
      powershell
      Get-ExecutionPolicy

    • 常见的执行策略:

      • Restricted: 不允许运行脚本。(默认设置)
      • AllSigned: 只允许运行由信任的发布者签名的脚本。
      • RemoteSigned: 允许运行本地创建的脚本,但从网上下载的脚本必须有信任的签名。这是许多用户选择的策略,提供了不错的安全性和灵活性平衡。
      • Unrestricted: 允许运行所有脚本。(风险较高)
    • 更改执行策略: 以管理员身份运行PowerShell,使用 Set-ExecutionPolicy Cmdlet。
      “`powershell
      # 设置为 RemoteSigned (常用且推荐)
      Set-ExecutionPolicy RemoteSigned

      可能会询问你是否确认,输入 Y 并回车

      ``
      **注意:** 更改执行策略是一个安全决定,请理解每个策略的含义并选择适合你环境的策略。不建议将生产环境设置为
      Unrestricted`。

    • 执行脚本文件: 在PowerShell控制台中,输入脚本文件的完整路径或相对路径。如果脚本在当前目录,需要加上 .\ 前缀。
      “`powershell
      # 如果脚本在当前目录
      .\Get-RunningServices.ps1

      如果脚本在其他目录

      C:\Scripts\Get-RunningServices.ps1
      “`

第七章:入门之外 – 进阶之路

掌握了以上基础知识,你已经迈入了PowerShell的大门。PowerShell的功能远不止于此。未来的学习方向可以包括:

  • 模块 (Modules): 学习如何发现、安装和使用PowerShell模块来扩展功能,例如 ActiveDirectory 模块、Exchange 模块、AzureAD 模块等。
  • 远程管理 (Remoting): 学习如何使用 Invoke-CommandEnter-PSSession 在远程计算机上执行命令。
  • WMI/CIM: 深入学习如何使用 Get-CimInstance 查询和管理 Windows 系统的各种配置和状态。
  • 错误处理 (try/catch): 学习如何在脚本中优雅地处理错误。
  • 控制流 (Loops and Conditions): 学习 ForEach, For, While 循环和 If/Else 条件语句来编写更复杂的逻辑。
  • 函数 (Functions): 学习如何编写自己的函数来组织和重用代码。
  • 高级 Cmdlet 参数: 了解参数集 (Parameter Sets)、参数验证等。
  • Desired State Configuration (DSC): 学习如何使用PowerShell进行配置管理。
  • PowerShell Core: 了解跨平台版本的特性和差异。
  • 与其他技术的集成: 如 REST API 调用、JSON/XML 处理等。

第八章:总结与后续学习资源

恭喜你!你已经完成了这篇PowerShell基础教程。你学会了:

  • PowerShell是什么以及为什么它很重要。
  • 如何启动PowerShell控制台。
  • PowerShell的核心概念:Cmdlet、Verb-Noun命名规则、参数、对象、别名。
  • 如何利用 Get-Help 探索和学习 Cmdlet。
  • 如何使用管道 (|) 连接命令并处理对象。
  • 使用 Where-ObjectSelect-Object 过滤和选择数据。
  • 进行基本的文件、目录、进程和服务管理。
  • 使用变量存储信息。
  • 编写和运行基础PowerShell脚本,并了解执行策略。

这仅仅是PowerShell世界的冰山一角。要真正掌握它,需要大量的实践和持续的学习。

后续学习资源推荐:

  1. PowerShell 控制台内置帮助 (Get-Help): 这是你的第一手资料,请充分利用。特别是 about_* 系列帮助主题。
  2. Microsoft Learn: 微软官方提供了大量高质量的PowerShell文档和互动学习路径。搜索 “PowerShell Microsoft Learn”。
  3. PowerShell In A Month Of Lunches 系列书籍: 这是非常经典的入门书籍,以每天一小时的学习量设计。
  4. 在线社区和论坛: Stack Overflow、Reddit 的 r/PowerShell 版块、微软的技术社区等,可以提问和学习他人的经验。
  5. 实践!实践!实践! 从自动化一些小任务开始,比如批量重命名文件、清理临时文件夹、生成报告等。动手尝试是学习的最佳方式。

记住,学习PowerShell是一个循序渐进的过程。不要害怕犯错,多尝试,多查阅帮助文档和在线资源。随着你经验的增长,你会发现PowerShell能极大地提升你的工作效率和能力。

祝你学习顺利,享受PowerShell带来的强大力量!


发表评论

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

滚动至顶部