Windows PowerShell 入门 – wiki基地


驾驭命令行:Windows PowerShell 入门完全指南

在现代计算世界中,自动化和效率是永恒的追求。无论是管理个人电脑、维护企业服务器,还是进行日常的系统配置,我们都希望能找到更快捷、更强大的方式来完成任务。对于 Windows 用户而言,PowerShell 正是这样一款为效率而生的强大工具。

如果你曾被黑乎乎的命令行窗口吓倒,或者认为那只是极客们才玩的东西,那么请稍作停留。PowerShell 并非一个遥不可及的概念,它是 Windows 系统内置的、现代化的命令行外壳(Shell)和脚本语言,旨在取代传统的 Command Prompt (cmd.exe),并提供前所未有的系统管理和自动化能力。

本文将带你从零开始,详细探索 Windows PowerShell 的世界,理解它的核心概念、优势,以及如何迈出第一步,开始利用它来提升你的工作效率。无论你是IT管理员、开发者,还是仅仅一个对技术充满好奇的普通用户,掌握 PowerShell 都将是一项极具价值的技能。

文章目录

  1. 什么是 Windows PowerShell?

    • 不仅仅是另一个命令行
    • Shell 与脚本语言
    • 基于 .NET Framework/.NET
    • 历史与演进
  2. 为何要使用 PowerShell? 它的优势何在?

    • 告别文本处理:强大的对象处理能力
    • 一致性与可发现性:动词-名词命名规则
    • 管道的力量:串联命令,实现复杂任务
    • 强大的远程管理能力
    • 丰富的内置功能与模块
    • 超越 GUI 的自动化潜力
    • 相较于 Command Prompt 的显著提升
  3. 入门第一步:如何启动 PowerShell

    • 几种启动方式介绍
    • PowerShell 控制台界面概览
    • 认识 PowerShell ISE (集成脚本环境)
    • VS Code 与 PowerShell 扩展
  4. PowerShell 的核心基石:Cmdlets (命令小工具)

    • 什么是 Cmdlet?
    • 动词-名词结构:理解 Cmdlet 命名规则
    • 常用 Cmdlet 示例:Get-Command, Get-Help, Get-Process, Get-Service
  5. 学习的秘钥:Get-HelpGet-Command

    • 如何查找命令:Get-Command 的用法
    • 如何了解命令:Get-Help 的深度探索
    • 使用别名 (Aliases) 提高效率 (了解即可)
  6. 理解核心概念:对象 (Objects)

    • PowerShell 输出的是对象,而非文本
    • 对象的属性 (Properties) 和方法 (Methods)
    • 如何查看对象的结构:Get-Member Cmdlet
  7. PowerShell 的灵魂:管道 (The Pipeline)

    • 管道符号 | 的作用
    • 如何通过管道传递对象
    • 结合 Where-ObjectSelect-Object 进行筛选和过滤
    • 管道的实际应用示例
  8. 动手实践:执行第一个 PowerShell 命令

    • 获取当前日期和时间:Get-Date
    • 列出当前目录内容:Get-ChildItem (或 dir)
    • 切换目录:Set-Location (或 cd)
    • 获取正在运行的进程:Get-Process
    • 获取系统服务状态:Get-Service
  9. 更进一步:简单的脚本与自动化

    • 什么是 PowerShell 脚本 (.ps1 文件)
    • 变量 ($) 的使用
    • 简单的控制流(If 语句简介)
    • 让任务自动运行:计划任务与 PowerShell
  10. 安全须知:执行策略 (Execution Policies)

    • 什么是执行策略?为何存在?
    • 常见的执行策略类型
    • 如何查看和修改执行策略 (Get-ExecutionPolicy, Set-ExecutionPolicy)
    • 重要警告:理解风险
  11. 持续学习的资源

    • Microsoft Learn 文档
    • Hey Scripting Guy 博客
    • PowerShell 社区与论坛
    • 书籍与在线课程
  12. 总结与展望


1. 什么是 Windows PowerShell?

在很多人的印象中,命令行界面(CLI)是与老旧、复杂、技术感强烈的系统管理联系在一起的。传统的 Windows Command Prompt (cmd.exe) 确实提供了一些基础的命令,但它的能力非常有限,主要基于文本处理,且命令语法体系缺乏一致性。

PowerShell 的诞生,正是为了解决这些问题。

  • 不仅仅是另一个命令行: PowerShell(全称 Windows PowerShell,自 PowerShell Core 6.0 起跨平台后简称为 PowerShell)不仅仅是一个运行命令的窗口,它是一个强大的 命令行外壳 (Command-Line Shell)脚本语言 (Scripting Language),同时也是一个 自动化引擎 (Automation Engine)。它为系统管理员、开发者以及高级用户提供了一个统一的平台,用于管理 Windows 系统及其上的各种应用程序和服务。

  • Shell 与脚本语言: 作为 Shell,它允许你直接输入并执行命令来与操作系统交互。作为脚本语言,它允许你将一系列命令组合起来,写成脚本文件(以 .ps1 为扩展名),从而实现复杂的自动化任务。

  • 基于 .NET Framework/.NET: PowerShell 最重要的特性之一是它是构建在 Microsoft .NET Framework (或 .NET Core / .NET) 之上的。这意味着 PowerShell 可以直接访问 .NET 类库,从而具备了处理对象(Objects)的能力,这是它与传统命令行最大的区别和优势。

  • 历史与演进: PowerShell 于 2006 年首次发布,最初名为 Monad。它被设计用来取代 cmd.exe,并与当时微软新的管理理念(如服务器核心安装)相契合。从 Windows 7 / Server 2008 R2 开始,PowerShell 成为了 Windows 的内置组件。自 PowerShell 6.0 (2018年) 起,它演变为跨平台的开源项目,可以在 Windows、Linux 和 macOS 上运行,基于 .NET Core (现在的 .NET)。虽然本文主要关注 Windows 上的使用,但理解其跨平台能力有助于认识其现代性和未来发展方向。

简而言之,PowerShell 是微软为 Windows 打造的现代化、面向任务、基于对象的命令行界面和脚本环境。它是你进行 Windows 系统管理、配置和自动化的得力助手。

2. 为何要使用 PowerShell? 它的优势何在?

你可能会问,如果 Windows 有图形用户界面 (GUI),我为什么要学习使用命令行工具呢?或者,如果我已经熟悉了 cmd.exe,为什么还要切换到 PowerShell?答案在于效率、能力和自动化潜力。

  • 告别文本处理:强大的对象处理能力: 这是 PowerShell 最核心的优势。传统的 cmd.exe 命令输出的是纯文本。如果你想从这些文本中提取信息(例如,找到进程 ID),你需要使用 findstr 或其他工具来解析文本行,这通常很麻烦且容易出错。PowerShell 的命令(Cmdlets)输出的是对象。一个对象包含结构化的数据(属性)和可以执行的操作(方法)。你可以轻松地访问、过滤、排序和操作这些对象的属性,而无需进行繁琐的文本解析。

    • 示例: 获取进程列表:Get-Process 会输出一系列进程对象,每个对象都有 Name, ID, CPU, Memory 等属性。你可以直接访问这些属性,例如 $process.ID
  • 一致性与可发现性:动词-名词命名规则: PowerShell 的 Cmdlets 遵循严格的 “动词-名词” (Verb-Noun) 命名规则,例如 Get-Process, Set-Location, Stop-Service, New-Item。这种一致性使得命令易于记忆和猜测。动词表示要执行的操作 (Get, Set, New, Remove, Stop, Start),名词表示操作的对象 (Process, Service, Item, Location, ADUser)。一旦你掌握了一些基本动词和名词,你就可以很大程度上预测未知 Cmdlet 的名称和功能。

  • 管道的力量:串联命令,实现复杂任务: PowerShell 使用管道操作符 | 将一个 Cmdlet 的输出(对象)直接传递给另一个 Cmdlet 作为输入。这种机制允许你将简单的命令链式组合起来,构建出非常强大的自动化工作流。

    • 示例: 查找所有正在运行且内存使用量超过 100MB 的进程:Get-Process | Where-Object {$_.WorkingSet -gt 100MB}。这里 Get-Process 获取所有进程对象,通过管道传递给 Where-Object 进行筛选,筛选条件是对象的 WorkingSet 属性大于 100MB。这种链式操作在传统命令行中几乎不可能实现或异常复杂。
  • 强大的远程管理能力: PowerShell 原生支持远程管理(PowerShell Remoting),允许你通过网络连接到其他 Windows 计算机,并在其上执行命令或脚本,极大地简化了跨多台服务器的管理任务。

  • 丰富的内置功能与模块: PowerShell 提供了大量的内置 Cmdlets 来管理 Windows 的方方面面,包括文件系统、注册表、服务、进程、事件日志、网络配置等等。此外,微软和第三方提供了大量的 PowerShell 模块,用于管理 Active Directory、Exchange Server、SQL Server、Azure、Microsoft 365 等各种产品和服务。几乎所有微软的企业级产品都提供了 PowerShell 接口。

  • 超越 GUI 的自动化潜力: GUI 操作直观易学,但重复性高,难以记录和重现。命令行操作可以被记录在脚本中,方便重复执行、定时运行、批量处理,实现真正的自动化。将复杂的配置步骤编写成脚本,可以确保每次执行的一致性,避免人为错误,并大大节省时间。

  • 相较于 Command Prompt 的显著提升: PowerShell 不仅保留了 cmd.exe 的一些常用命令(作为别名存在,如 dir -> Get-ChildItem, cd -> Set-Location),还提供了更强大的功能、更一致的语法、更丰富的信息输出和更强的脚本能力。对于任何严肃的 Windows 管理或自动化任务,PowerShell 都是远超 cmd.exe 的选择。

总而言之,学习 PowerShell 意味着你将获得一种更高效、更灵活、更强大的方式来与 Windows 系统交互,实现自动化管理,释放大量重复性工作的时间。

3. 入门第一步:如何启动 PowerShell

既然 PowerShell 如此强大,那么如何开始使用它呢?启动 PowerShell 有多种方法:

  • 通过搜索启动: 这是最简单快捷的方式。点击 Windows 的开始按钮,在搜索框中输入 “PowerShell”,你将看到 “Windows PowerShell” 或 “PowerShell” 应用。点击即可启动。通常建议以管理员身份运行 (Run as administrator),以便执行需要提升权限的任务(右键点击应用图标选择)。

  • 通过运行窗口: 按下 Win + R 组合键打开运行窗口,输入 powershell 并按回车。同样,输入 powershell -ExecutionPolicy Bypass -NoExit 并按 Ctrl + Shift + Enter 可以尝试以管理员身份运行(取决于UAC设置)。

  • 通过文件资源管理器: 在文件资源管理器中,按住 Shift 键,然后在文件夹的空白处右键点击,选择 “在此处打开 PowerShell 窗口” 或 “在此处打开 PowerShell 窗口(管理员)”。

  • 替换命令提示符: 在 Windows 10 及更高版本中,可以在设置中将 Win+X 菜单(右键点击开始按钮或按 Win+X)中的 “命令提示符” 替换为 “Windows PowerShell”。

启动后,你将看到一个蓝色的窗口(默认主题),这就是 PowerShell 控制台。

PowerShell 控制台界面概览

控制台窗口是你输入命令和查看输出的地方。它通常会显示当前路径(例如 PS C:\Users\YourName>)和光标,等待你输入命令。

你可以自定义控制台的外观,比如字体、字号、颜色等,通过右键点击窗口标题栏,选择 “属性”。

认识 PowerShell ISE (集成脚本环境)

PowerShell ISE (Integrated Scripting Environment) 是微软为 PowerShell 脚本开发提供的内置集成开发环境。它提供了一个更友好的界面,包括:

  • 脚本编辑窗格: 用于编写和编辑 PowerShell 脚本文件(.ps1)。支持语法高亮、智能感知(IntelliSense)、代码折叠等功能。
  • 控制台窗格: 用于执行命令和脚本,显示输出。
  • 命令窗格: (默认可能不显示,可在 “视图” 菜单中打开)可以方便地查找 Cmdlets 及其参数。

对于初学者来说,ISE 提供了一个比纯控制台更便利的编写和调试脚本的环境。你可以通过搜索 “PowerShell ISE” 来启动它。

VS Code 与 PowerShell 扩展

对于更专业的脚本开发和日常使用,许多用户选择使用 Visual Studio Code (VS Code) 搭配 PowerShell 扩展。VS Code 是一个免费、轻量级的跨平台代码编辑器,PowerShell 扩展提供了更高级的脚本编辑、调试、格式化、代码分析等功能,是目前社区最推荐的 PowerShell 开发环境。虽然不是 Windows 内置,但非常值得安装和学习。

作为初学者,你可以先从控制台或 ISE 开始,熟悉基本命令的执行。当你开始编写更长的脚本时,ISE 或 VS Code 会显得更加有用。

4. PowerShell 的核心基石:Cmdlets (命令小工具)

在 PowerShell 中,用于执行特定任务的命令被称为 Cmdlets (发音为 “command-lets”)。Cmdlets 是 PowerShell 的基本操作单位。

  • 什么是 Cmdlet? Cmdlet 是一个轻量级的命令,通常由 PowerShell 运行时在内存中直接调用执行。它们不是独立的 EXE 程序(尽管 PowerShell 也能运行 EXE 程序,但这与 Cmdlets 的工作方式不同)。Cmdlets 的设计宗旨是执行单一、特定的功能。

  • 动词-名词结构:理解 Cmdlet 命名规则: 前面提到,Cmdlets 遵循严格的 Verb-Noun 命名规则。

    • 动词 (Verb): 表示要执行的操作。PowerShell 有一个批准的动词列表,以确保一致性。常见的动词包括:
      • Get: 获取资源(例如,数据、服务、进程)
      • Set: 配置或设置资源
      • New: 创建资源
      • Remove: 删除资源
      • Add: 向资源中添加内容
      • Clear: 清除资源中的内容
      • Write: 将数据写入某个地方(例如,文件、控制台)
      • Read: 从某个地方读取数据
      • Start: 启动资源(例如,服务、进程)
      • Stop: 停止资源
      • Restart: 重启资源
      • Suspend: 暂停资源
      • Resume: 恢复资源
      • Move: 移动资源
      • Copy: 复制资源
      • Rename: 重命名资源
      • Invoke: 执行操作
      • Test: 运行测试
      • Out: 将输出发送到某个地方(例如,文件、打印机)
    • 名词 (Noun): 表示操作的对象。名词通常是单数形式,并且首字母大写。例如:Process, Service, Item, Location, Content, Date, Command, Help 等等。

    将动词和名词用连字符 - 连接起来,就构成了一个 Cmdlet 的名称,例如 Get-Service, Stop-Process, New-Item, Set-Date

  • 常用 Cmdlet 示例:

    • Get-Command: 用于查找其他 Cmdlets 和命令。
    • Get-Help: 用于获取 Cmdlets 的帮助文档。
    • Get-Process: 获取系统当前正在运行的进程列表。
    • Get-Service: 获取系统服务列表及其状态。
    • Set-Location: 更改当前工作目录(类似于 cd)。
    • Get-ChildItem: 获取文件或文件夹中的子项(类似于 dirls)。
    • New-Item: 创建新的文件或文件夹。
    • Remove-Item: 删除文件或文件夹。
    • Copy-Item: 复制文件或文件夹。
    • Move-Item: 移动文件或文件夹。
    • Rename-Item: 重命名文件或文件夹。

这些 Cmdlets 通常还接受参数 (Parameters) 来修改其行为。参数通常以连字符 - 开头,后跟参数名,例如 Get-Process -Name "chrome*"Get-ChildItem -Path C:\Windows -Filter *.log。你可以使用空格分隔参数,对于带空格的值,需要用引号括起来。

5. 学习的秘钥:Get-HelpGet-Command

面对成百上千的 Cmdlets,如何知道它们的功能和用法呢?这就是 Get-HelpGet-Command 这两个 Cmdlets 存在的意义。它们是你在 PowerShell 世界中学习和探索的最重要工具。

  • 如何查找命令:Get-Command 的用法
    Get-Command 用来查找可用的 Cmdlets、函数、别名、脚本或应用程序。

    • 查找所有 Cmdlets:Get-Command
    • 查找与 “Process” 相关的所有命令:Get-Command *Process* (使用通配符 *)
    • 查找所有以 “Get-” 开头的 Cmdlets:Get-Command Get-*
    • 查找某个特定 Cmdlet:Get-Command Get-Service
    • 查找某个模块中的命令:Get-Command -Module NetAdapter (前提是该模块已导入)

    通过 Get-Command,你可以快速找到你可能需要的命令名称。

  • 如何了解命令:Get-Help 的深度探索
    一旦你知道了 Cmdlet 的名称,Get-Help 就是你的详细手册。

    • 获取基本帮助信息:Get-Help <CmdletName> (例如 Get-Help Get-Service)。这会显示 Cmdlet 的简要说明、语法和一些备注。
    • 获取详细帮助信息:Get-Help <CmdletName> -Detailed。包含参数描述、输入/输出类型等更详细的信息。
    • 获取示例:Get-Help <CmdletName> -Examples。显示 Cmdlet 的常见用法示例,这对于理解如何使用命令非常有用。
    • 获取完整帮助信息:Get-Help <CmdletName> -Full。包含所有帮助部分。
    • 在线获取最新帮助:Get-Help <CmdletName> -Online。在新窗口中打开该 Cmdlet 的微软官方文档页面,通常包含最新和最全面的信息。强烈推荐使用 -Online 参数,尤其当你连接到互联网时。
    • 更新本地帮助文档:Update-Help。 Cmdlets 的帮助文档是可以通过 Update-Help Cmdlet 进行更新的。初次使用或长时间未更新时运行 Update-Help 可以下载最新帮助文件到本地,这样即使离线也能获取较新的帮助信息(但不包含 -Online 的实时内容)。运行 Update-Help 通常需要管理员权限。

掌握 Get-Help 是学习 PowerShell 的最重要一步! 遇到不熟悉的命令或参数时,请立即使用 Get-Help 查看。

6. 理解核心概念:对象 (Objects)

理解对象是理解 PowerShell 强大之处的关键。如前所述,PowerShell 的 Cmdlets 不像传统的命令行工具那样输出简单的文本,它们输出的是结构化的对象 (Objects)

  • PowerShell 输出的是对象,而非文本: 当你在 cmd.exe 中运行 tasklist 时,你得到的是格式化好的文本行。如果你想从中提取某个进程的 PID,你需要编写复杂的文本解析代码。在 PowerShell 中,当你运行 Get-Process 时,你得到的是一系列 Process 对象。每个对象都有 Name, ID, CPU, WorkingSet 等属性。你可以直接通过这些属性名来访问或操作数据。

  • 对象的属性 (Properties) 和方法 (Methods):

    • 属性 (Properties): 描述对象特征的数据。例如,一个 Process 对象可能有 Name (进程名称)、ID (进程ID)、WorkingSet (内存使用量)、StartTime (启动时间) 等属性。
    • 方法 (Methods): 对象可以执行的操作。例如,一个 Process 对象可能有 Kill() (终止进程)、Refresh() (刷新进程信息) 等方法。
  • 如何查看对象的结构:Get-Member Cmdlet
    Get-Member (简写 gm) 是用于探索对象结构的神器 Cmdlet。它可以显示一个对象有哪些属性、方法、事件等成员。

    • 将一个 Cmdlet 的输出通过管道传递给 Get-MemberGet-Process | Get-Member
    • 这将列出 Get-Process Cmdlet 输出的对象的类型名称(TypeName)以及它拥有的所有属性、方法等成员的名称和类型。
    • 通过 Get-Member,你可以知道你可以从这个对象中获取哪些信息 (属性),或者对它执行哪些操作 (方法)。

    • 示例: 运行 Get-Service | Get-Member 你会看到 Get-Service Cmdlet 输出的是 System.ServiceProcess.ServiceController 类型的对象,它有 Name, Status, DisplayName 等属性,以及 Start(), Stop() 等方法。

理解对象和 Get-Member 的用法,将极大地提升你在 PowerShell 中进行数据处理和自动化的能力。你可以轻松地筛选、排序和导出对象的特定属性。

7. PowerShell 的灵魂:管道 (The Pipeline)

管道是 PowerShell 中实现命令组合和自动化工作流的核心机制。它允许你将一个命令的输出传递给下一个命令作为输入。

  • 管道符号 | 的作用: 在 PowerShell 中,管道符号 | (通常是键盘上的反斜杠 \ 上方的键) 用于连接两个 Cmdlets 或命令。它的作用是将左侧命令的输出对象传递给右侧命令。

  • 如何通过管道传递对象: 重要的是要理解,管道传递的是对象,而不是像传统命令行那样传递文本字符串。右侧的 Cmdlet 接收到的是一个或多个完整的对象,它可以直接访问这些对象的属性和方法,并基于这些信息进行操作。

  • 结合 Where-ObjectSelect-Object 进行筛选和过滤:
    这是管道最常见的用途之一。

    • Where-Object (简写 where?): 根据指定的条件过滤对象。它通常接受一个脚本块 {} 作为参数,其中 $_ 代表当前管道中的对象。
      • 示例: 查找所有正在运行的服务:Get-Service | Where-Object {$_.Status -eq "Running"}
      • 示例: 查找所有名称以 “B” 开头的进程:Get-Process | Where-Object {$_.Name -like "B*"} (这里 -like 是一个比较运算符,-eq 是等于)
      • 示例: 查找内存使用大于 50MB 的进程:Get-Process | Where-Object {$_.WorkingSet -gt 50MB} (使用 M, G, K 等后缀表示大小单位)
    • Select-Object (简写 select): 选择对象的一个或多个属性来显示或进一步处理。
      • 示例: 只显示进程的名称和 ID:Get-Process | Select-Object Name, ID
      • 示例: 获取所有服务,并只显示其名称和状态:Get-Service | Select-Object DisplayName, Status
      • 示例: 获取进程列表,按内存使用量排序,然后只显示前10个进程的名称和内存:Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 Name, WorkingSet (这里还使用了 Sort-Object 进行排序)
  • 管道的实际应用示例:

    • 停止所有记事本进程:Get-Process -Name notepad | Stop-Process (注意:执行此命令前请保存记事本内容! 可以在 Stop-Process 后加上 -WhatIf 参数先模拟执行,看看会发生什么:Get-Process -Name notepad | Stop-Process -WhatIf)
    • 获取磁盘空间使用情况,并格式化输出:Get-Volume | Format-Table DriveLetter, FileSystem, SizeRemaining, Size (这里使用了 Format-Table 将对象格式化为表格输出,方便阅读)
    • 查找大于 1GB 的文件:Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue | Where-Object {$_.Length -gt 1GB} (-Recurse 递归查找子文件夹,-ErrorAction SilentlyContinue 忽略权限不足的错误,$_.Length 是文件对象的大小属性)

通过管道,你可以将简单的 Cmdlets 像乐高积木一样组合起来,实现非常复杂的任务,而无需编写大量的代码。这是 PowerShell 提高效率的基石。

8. 动手实践:执行第一个 PowerShell 命令

理论讲了不少,现在是时候亲自尝试一些基本的 PowerShell 命令了。打开你的 PowerShell 控制台(最好是以管理员身份运行)。

  • 获取当前日期和时间:Get-Date
    输入:Get-Date
    按回车。你会看到当前的日期和时间信息。Get-Date Cmdlet 返回一个 DateTime 对象,你可以通过 Get-Date | Get-Member 查看它的属性和方法。

  • 列出当前目录内容:Get-ChildItem (或 dir)
    输入:Get-ChildItem
    按回车。你会看到当前工作目录下的文件和文件夹列表。你可以试试 dir,它是一个别名,执行的也是 Get-ChildItem
    输入:Get-ChildItem -Path C:\ (查看 C 盘根目录)
    输入:Get-ChildItem -Path $env:USERPROFILE\Documents (查看当前用户的文档文件夹,$env:USERPROFILE 是一个环境变量,存储了用户目录的路径)

  • 切换目录:Set-Location (或 cd)
    输入:Set-Location C:\Windows (进入 C:\Windows 目录)
    输入:Set-Location .. (返回上一级目录)
    输入:Set-Location ~ (回到用户主目录)
    输入:cd C:\Program Files (使用别名 cd)

  • 获取正在运行的进程:Get-Process
    输入:Get-Process
    按回车。你会看到一个表格,列出了所有正在运行的进程,包括进程名、ID、CPU 使用率、内存使用量等。
    输入:Get-Process -Name chrome (只查找名称为 “chrome” 的进程)
    输入:Get-Process | Sort-Object CPU -Descending (按 CPU 使用率降序排列进程)

  • 获取系统服务状态:Get-Service
    输入:Get-Service
    按回车。你会看到系统中的服务列表、它们的名称、显示名称和当前状态 (Running/Stopped)。
    输入:Get-Service -Name spooler (查找打印服务)
    输入:Get-Service | Where-Object {$_.Status -eq "Stopped"} (查找所有已停止的服务)

通过执行这些基本命令,你已经开始与 PowerShell 互动了。尝试结合管道和 Where-Object, Select-Object 来进一步处理这些 Cmdlets 的输出。例如:
Get-Process | Where-Object {$_.WorkingSet -gt 100MB} | Select-Object Name, ID, WorkingSet
这条命令获取所有进程,筛选出内存使用大于 100MB 的,然后只显示它们的名称、ID 和内存使用量。

9. 更进一步:简单的脚本与自动化

当你的任务需要执行多个命令,或者需要重复运行时,将这些命令保存到一个脚本文件 (.ps1 文件) 中会非常方便。

  • 什么是 PowerShell 脚本 (.ps1 文件): PowerShell 脚本就是一个包含一系列 PowerShell 命令和逻辑的纯文本文件,扩展名为 .ps1。你可以使用任何文本编辑器(如记事本)、PowerShell ISE 或 VS Code 来创建和编辑 .ps1 文件。

  • 如何运行脚本: 在 PowerShell 控制台中,可以直接输入脚本文件的完整路径来运行,例如 C:\Scripts\MyScript.ps1。需要注意的是,默认情况下,PowerShell 的执行策略可能会阻止你运行本地或从网络下载的脚本。你可能需要先调整执行策略(见下一节)。

  • 变量 ($) 的使用: 在脚本中,你可以使用变量来存储和操作数据。变量名以 $ 符号开头。

    • 示例: $currentDate = Get-Date (将当前日期时间对象存储到 $currentDate 变量中)
    • 示例: $filePath = "C:\Logs\system.log"
    • 你可以直接在命令中使用变量:Get-Content $filePath (获取文件内容)
    • 你可以在字符串中使用变量(双引号):Write-Host "当前的日期是:$currentDate" (Write-Host 用于向控制台输出文本)
  • 简单的控制流(If 语句简介): 脚本语言的一个重要特性是控制流,允许你根据条件执行不同的代码块。

    • 示例: 检查服务状态,如果停止则启动它。
      “`powershell
      $serviceName = “Spooler”
      $service = Get-Service -Name $serviceName

      if ($service.Status -eq “Stopped”) {
      Write-Host “$serviceName 服务已停止,正在尝试启动…”
      Start-Service -Name $serviceName
      # 等待几秒并再次检查状态(可选)
      Start-Sleep -Seconds 5
      $service = Get-Service -Name $serviceName # 刷新服务对象
      if ($service.Status -eq “Running”) {
      Write-Host “$serviceName 服务启动成功。”
      } else {
      Write-Host “$serviceName 服务启动失败。”
      }
      } else {
      Write-Host “$serviceName 服务当前状态是:$($service.Status)”
      }
      ``
      这个例子引入了
      If语句、变量、Write-Host输出以及调用Start-ServiceCmdlet。$()` 用于在双引号字符串中执行表达式(这里是获取服务对象的 Status 属性)。

  • 让任务自动运行:计划任务与 PowerShell: 你可以将写好的 PowerShell 脚本通过 Windows 的任务计划程序 (Task Scheduler) 设置为定时运行,实现无人值守的自动化任务,例如定期清理文件、备份数据、检查系统状态等。

脚本编写是一个更深入的话题,这里只是一个简单的引子。当你开始编写脚本时,ISE 或 VS Code 的代码编辑和调试功能会变得非常重要。

10. 安全须知:执行策略 (Execution Policies)

为了保护用户免受恶意脚本的侵害,PowerShell 引入了执行策略 (Execution Policies)。它控制了 PowerShell 在你的计算机上加载和运行配置文件及脚本的条件。

  • 什么是执行策略?为何存在? 执行策略是一种安全功能,它不是一个真正的安全边界(不是阻止所有恶意行为),而是一种预防措施,类似于 Web 浏览器的安全区域。它的目的是阻止用户意外地运行他们不信任的脚本。

  • 常见的执行策略类型:

    • Restricted (默认设置): 不允许运行任何脚本,只能交互式地输入和执行命令。
    • AllSigned: 只允许运行由可信发布者签名的脚本。
    • RemoteSigned: 允许运行本地创建的脚本;来自网络的脚本必须由可信发布者签名。这是许多用户为了方便运行自己编写的脚本但又保持一定网络安全性的常用设置。
    • Unrestricted: 允许运行所有脚本,不检查签名(但会提示你运行来自网络的脚本)。不建议在生产环境中使用此策略。
    • Bypass: 完全不阻止任何内容或给出任何警告。极不安全,仅用于特定、受控的场景(例如某些安装程序)。
    • Undefined: 在当前作用域没有设置特定的执行策略,将继承父作用域或默认策略。
  • 如何查看和修改执行策略 (Get-ExecutionPolicy, Set-ExecutionPolicy):

    • 查看当前执行策略:输入 Get-ExecutionPolicy
    • 查看所有作用域的执行策略:输入 Get-ExecutionPolicy -List。执行策略可以设置在 LocalMachine (所有用户)、CurrentUser (当前用户)、Process (当前 PowerShell 会话) 等不同作用域。
    • 修改执行策略:使用 Set-ExecutionPolicy Cmdlet。例如:
      • Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (将当前用户的策略设置为 RemoteSigned)
      • Set-ExecutionPolicy Restricted -Scope LocalMachine (将所有用户的策略设置为 Restricted,通常需要管理员权限)
  • 重要警告:理解风险: 修改执行策略涉及到安全风险。将策略设置为 UnrestrictedBypass 会让你的系统更容易受到恶意脚本的攻击。对于初学者和日常使用,建议将策略设置为 RemoteSignedAllSigned,并在运行来自不明来源的脚本时保持警惕。如果你只是想临时运行一个本地脚本进行测试,可以使用 -ExecutionPolicy Bypass 参数启动 PowerShell 会话,但这仅限于该会话有效。

11. 持续学习的资源

PowerShell 是一个功能丰富的工具,本文仅仅触及了皮毛。要深入掌握它,你需要持续学习和实践。以下是一些推荐的学习资源:

  • Microsoft Learn 文档: 微软官方提供了最权威和全面的 PowerShell 文档,包括概念介绍、Cmdlets 参考、脚本编写指南等。这是学习的基石。在命令行中使用 Get-Help <CmdletName> -Online 可以直接跳转到相关在线文档。
  • Hey Scripting Guy 博客: 微软的技术社区中有一个非常著名的博客 “Hey Scripting Guy!” (或现在合并到 Microsoft Tech Community 的 PowerShell 博客),其中包含了大量关于 PowerShell 的文章、示例和技巧,非常适合通过实际案例学习。
  • PowerShell 社区与论坛: 如 Reddit 的 r/PowerShell 板块、Stack Overflow 上的 PowerShell 标签、微软的技术社区论坛等,你可以在这里提问、交流经验、查看其他用户的解决方案。
  • 书籍与在线课程: 有许多优秀的 PowerShell 入门和进阶书籍可供选择。Coursera、Udemy、Pluralsight 等在线教育平台也提供 PowerShell 课程。
  • 实践!实践!实践! 最重要的学习方法是动手实践。尝试解决一些小的自动化任务,遇到问题时使用 Get-Help 查找答案,参考网上的示例,不断尝试和摸索。

12. 总结与展望

恭喜你!如果能读到这里,你已经对 Windows PowerShell 有了一个相对全面的初步认识。你了解了它是什么、为什么值得学习,以及它的核心概念:Cmdlets、对象和管道。你还掌握了如何获取帮助和开始执行一些基本命令。

PowerShell 不仅仅是一个命令工具,它是一扇通往高效系统管理和自动化的门。它的对象处理能力、一致的命名规则和强大的管道机制,使其在处理复杂任务和批量操作时,远远超越了传统的命令行工具和重复性的 GUI 操作。

入门只是第一步,PowerShell 的世界非常广阔。随着你的深入,你将学习如何编写更复杂的脚本、使用控制流和循环、处理错误、使用模块、进行远程管理,以及利用它与 Active Directory、Azure、Microsoft 365 等服务进行交互。

不要害怕命令行,将 PowerShell 视为你的新伙伴。从简单的命令开始,逐步深入。多使用 Get-HelpGet-Command,多动手实践。

现在,打开你的 PowerShell 控制台,开始你的探索之旅吧!输入 Get-Command,看看你的系统里有多少个 Cmdlets 等待你去发现。输入 Get-Help Get-Process -Examples,看看如何使用 Get-Process 来获取进程信息。

未来是自动化的世界,掌握 PowerShell,你就掌握了驾驭 Windows 系统的强大能力。祝你学习愉快!


发表评论

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

滚动至顶部