一文读懂 PowerShell:核心概念与入门介绍 – wiki基地


一文读懂 PowerShell:核心概念与入门介绍

在现代IT环境中,自动化和高效管理是不可或缺的技能。无论是系统管理员、开发人员还是DevOps工程师,掌握一种强大的自动化工具都至关重要。而对于Windows平台而言,PowerShell无疑是首选的利器。然而,对于刚接触PowerShell的新手来说,它那独特的语法和“对象”概念可能会显得有些陌生。

本文旨在通过深入浅出的方式,为你揭开PowerShell的神秘面纱,详细介绍其核心概念,并提供一份实用的入门指南,让你能够快速上手,开启自动化之旅。

第一部分:PowerShell 是什么?为何选择它?

  1. 不仅仅是命令行:

    • 许多人初见PowerShell时,可能会觉得它只是Windows命令提示符(CMD)的升级版。虽然两者都可以执行命令,但PowerShell的强大之处远不止于此。
    • CMD是基于文本的命令行界面,它的命令通常输出文本字符串,你需要通过复杂的文本解析(如findstr、grep等)来提取所需信息。
    • PowerShell则是一个基于对象的自动化引擎和脚本环境。它的命令(称为Cmdlet)输出的是结构化的对象,这些对象包含属性(Properties)和方法(Methods),可以被下游命令直接处理,而无需进行繁琐的文本解析。
  2. 跨平台的强大力量(PowerShell Core):

    • 最初,PowerShell是为Windows设计的。但随着技术的发展,微软推出了跨平台的PowerShell Core(现在通常直接称为PowerShell),它基于.NET Core,可以在Windows、Linux和macOS上运行。这使得PowerShell成为了一个更加通用的自动化工具。
  3. 为什么选择 PowerShell?

    • 强大的自动化能力: 易于编写脚本来自动化重复性任务,如用户管理、软件部署、系统配置等。
    • 系统管理利器: 提供丰富的Cmdlet,能够深入操作系统底层,管理几乎所有的Windows组件和服务。
    • 与微软生态系统深度集成: 对Azure、Microsoft 365、SQL Server、Exchange等微软产品提供了出色的支持,通过特定的模块进行管理。
    • 面向对象: 数据的处理更加灵活、准确和高效。
    • 可扩展性: 可以轻松地通过模块添加新的功能和Cmdlet。

第二部分:PowerShell 的核心概念

理解PowerShell的核心概念是掌握它的关键。以下是几个最重要的概念:

  1. Cmdlet (Command-let):

    • Cmdlet 是PowerShell中最基本的命令单元,发音类似 “command-let”。
    • 命名规则: Cmdlet 遵循严格的“动词-名词”(Verb-Noun)命名约定。例如:
      • Get-Process:获取当前正在运行的进程。
      • Set-ExecutionPolicy:设置脚本执行策略。
      • New-Item:创建新的文件或目录。
      • Remove-Item:删除文件或目录。
      • Restart-Service:重启服务。
    • 这种命名方式极大地提高了命令的可读性和可发现性。通过动词(如Get, Set, New, Remove, Start, Stop, Restart, Add, Remove, Test, Out等),你可以大致猜测命令的功能。通过名词(如Process, Service, Item, Computer, User, ACL等),你可以知道命令操作的对象类型。
    • 你可以使用 Get-Verb 查看所有已定义的动词,使用 Get-Noun 查看所有已定义的Cmdlet名词,使用 Get-Command 查看系统上所有可用的Cmdlet。
  2. 对象 (Objects):

    • 这是PowerShell与CMD最本质的区别。PowerShell中的命令输出不是简单的文本,而是包含结构化数据的对象。
    • 什么是对象? 对象可以理解为现实世界中某个实体(如一个文件、一个进程、一个服务)在计算机中的抽象表示。每个对象都有一系列属性 (Properties) 来描述它的特征,以及一系列方法 (Methods) 来执行相关的操作。
    • 示例: 当你运行 Get-Process 时,它会返回一系列代表当前运行进程的 进程对象。每个进程对象都有属性,如 Name (进程名称)、ID (进程ID)、Path (可执行文件路径)、CPU (CPU使用率)、Memory (内存使用量)等。进程对象还可能有方法,如 Kill() (终止进程)。
    • 好处: 因为输出是结构化的对象,你可以轻松地访问、筛选、排序或修改这些对象的属性,或者调用对象的方法。这比解析无格式的文本输出要准确、高效得多。
  3. 管道 (Pipeline) |

    • 管道是PowerShell中最强大的特性之一,它允许你将一个命令的输出对象作为另一个命令的输入。
    • 使用管道符号 | 连接两个命令。左边命令输出的对象会通过管道传递给右边的命令。
    • 示例:
      • Get-Process | Where-Object {$_.CPU -gt 10}:获取所有CPU使用率大于10%的进程对象。Where-Object 是一个Cmdlet,用于根据条件筛选对象。$_ 代表当前通过管道传递的对象。
      • Get-Process | Select-Object -Property Name, ID, WorkingSet:获取所有进程对象,但只显示它们的 NameIDWorkingSet (内存)属性。Select-Object 用于选择对象的特定属性或创建自定义属性。
      • Get-Service | Stop-Service:停止所有服务 (谨慎使用,这会尝试停止 所有 通过管道传来的服务对象)。
    • 管道的强大之处在于它可以将简单的Cmdlet组合起来,构建复杂而强大的自动化任务。
  4. 变量 (Variables):

    • 变量用于存储数据或对象,以便在脚本中重复使用或进行处理。
    • 在PowerShell中,变量名前面使用 $ 符号。
    • 示例:
      • $myProcess = Get-Process notepad:将名为“notepad”的进程对象存储在 $myProcess 变量中。
      • $filePath = "C:\temp\mydata.txt":将一个字符串存储在 $filePath 变量中。
      • $myProcess.ID:访问 $myProcess 变量中对象的 ID 属性。
    • 变量是构建灵活脚本的基础。
  5. 参数 (Parameters):

    • Cmdlet 通常接受参数来修改其行为或指定操作的对象。
    • 参数名前面使用 - 符号。
    • 示例:
      • Get-ChildItem -Path C:\WindowsGet-ChildItem (获取子项,类似 dir) Cmdlet 使用 -Path 参数指定要列出内容的目录。
      • Get-Service -Name *sql*:获取所有名称中包含“sql”的服务。-Name 参数用于按名称过滤。
      • Stop-Process -ID 1234 -Force:终止ID为1234的进程。-ID 指定进程,-Force 参数强制执行操作。
    • Cmdlet 通常有很多参数,你可以使用 Get-Help <Cmdlet名称> 来查看 Cmdlet 的详细帮助信息,包括所有参数及其用法。
  6. 提供程序 (Providers):

    • PowerShell提供了一种统一的方式来访问不同的数据存储,如文件系统、注册表、证书存储、环境变量等。这些数据存储是通过提供程序 (Providers) 来暴露的。
    • 这意味着你可以使用相同的Cmdlet(如 Get-ChildItemSet-LocationNew-ItemRemove-Item)来操作文件、注册表项、环境变量等不同类型的数据。
    • 示例:
      • Set-Location HKLM:\SOFTWARE:切换到注册表的 HKEY_LOCAL_MACHINE\SOFTWARE 路径,就像切换文件目录一样。
      • Get-ChildItem Env::列出所有环境变量,就像列出文件一样。
      • Get-ChildItem Cert:\CurrentUser\My:列出当前用户的个人证书。
    • 你可以使用 Get-PSProvider 查看所有可用的提供程序。
  7. 执行策略 (Execution Policy):

    • PowerShell的执行策略是一种安全功能,用于控制脚本是否允许在系统上运行以及在什么条件下运行。
    • 常见的执行策略有:
      • Restricted (默认):不允许运行任何脚本。
      • RemoteSigned:允许本地创建的脚本运行,但从网上下载的脚本需要有数字签名。
      • AllSigned:只允许运行有数字签名的脚本(本地和远程都需要)。
      • Bypass:不阻止任何脚本,存在安全风险。
      • Unrestricted:允许所有脚本运行,但会警告从网上下载的脚本。
    • 为了运行自己编写的脚本,通常需要将执行策略设置为 RemoteSigned。可以使用 Set-ExecutionPolicy <PolicyName> 命令进行设置(可能需要管理员权限)。建议了解执行策略的风险后再进行更改。

第三部分:PowerShell 入门实践

理论结合实践才能真正掌握一个工具。让我们开始一些简单的PowerShell操作:

  1. 打开 PowerShell:

    • 在Windows搜索栏输入“PowerShell”,你会看到“Windows PowerShell”(旧版)和“PowerShell”(新版,通常是PowerShell Core)。建议使用新版“PowerShell”。
    • 你也可以右键点击,选择“以管理员身份运行”以获得更高的权限。
  2. 初识界面:

    • 你将看到一个蓝色的命令行窗口,等待你输入命令。光标通常显示为 PS C:\Users\YourUsername>,这表示你当前所在的路径是文件系统的 C:\Users\YourUsername
  3. 学习如何获取帮助:

    • 学习一个新工具,首先要知道如何寻求帮助。PowerShell内置了强大的帮助系统。
    • Get-Help <Cmdlet名称>:获取特定Cmdlet的详细帮助信息。
      • 示例:Get-Help Get-Process
    • Get-Help <Cmdlet名称> -Examples:只显示Cmdlet的使用示例。
      • 示例:Get-Help Get-ChildItem -Examples
    • Get-Help <Cmdlet名称> -Full:显示Cmdlet的完整帮助信息,包括详细描述、参数、示例等。
    • Get-Help <Cmdlet名称> -Online:如果Cmdlet有在线帮助文档,会打开浏览器跳转到相关页面。
    • Update-Help:首次使用帮助系统时,或者想获取最新帮助文档时,需要运行此命令下载帮助文件(可能需要管理员权限)。
  4. 常用基础命令示例:

    • 获取当前目录下的文件和文件夹:
      • Get-ChildItem 或简写 dirls (为了兼容Linux/macOS用户)
    • 切换目录:
      • Set-Location C:\ 或简写 cd C:\
      • Set-Location ..cd .. (返回上一级目录)
    • 创建新目录:
      • New-Item -Path C:\temp\MyNewFolder -ItemType Directory
    • 创建新文件:
      • New-Item -Path C:\temp\MyNewFolder\MyNewFile.txt -ItemType File
    • 删除文件或目录:
      • Remove-Item C:\temp\MyNewFolder -Recurse -Force (删除目录及其内容,需要-Recurse-Force参数)
      • Remove-Item C:\temp\MyNewFolder\MyNewFile.txt (删除文件)
    • 查看系统进程:
      • Get-Process
      • Get-Process notepad (查看特定进程)
      • Get-Process | Select-Object -Property Name, ID, WS (只显示进程名称、ID和工作集内存)
    • 查看系统服务:
      • Get-Service
      • Get-Service spooler (查看特定服务)
      • Get-Service | Where-Object {$_.Status -eq "Running"} (查看所有正在运行的服务)
      • Get-Service | Sort-Object -Property DisplayName (按显示名称排序服务列表)
    • 获取电脑信息:
      • Get-ComputerInfo
    • 测试网络连接:
      • Test-Connection www.baidu.com (类似ping)
  5. 编写简单的脚本:

    • PowerShell脚本文件的扩展名是 .ps1
    • 你可以使用任何文本编辑器编写脚本,推荐使用 Visual Studio Code (VS Code) 并安装 PowerShell 扩展,它提供了语法高亮、智能感知、调试等强大功能。PowerShell ISE (Integrated Scripting Environment) 也是一个选项,但VS Code功能更强大且是跨平台的。
    • 示例脚本 (MyFirstScript.ps1):
      “`powershell
      # 这是一个简单的PowerShell脚本

      Write-Host “你好,欢迎来到PowerShell世界!” # 输出文本

      获取当前日期和时间

      $currentDate = Get-Date
      Write-Host “当前日期和时间是: $($currentDate)” # 使用$()在字符串中嵌入表达式

      获取并显示正在运行的进程数量

      $processCount = (Get-Process).Count # .Count 属性获取集合中的元素数量
      Write-Host “系统上正在运行 $($processCount) 个进程。”

      获取前5个占用CPU最多的进程

      Write-Host “前5个占用CPU最多的进程:”
      Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5 -Property Name, CPU
      ``
      * **运行脚本:**
      * 在PowerShell控制台中,切换到脚本所在的目录。
      * 输入脚本的完整路径或相对路径来运行,例如
      ./MyFirstScript.ps1。记住,默认执行策略下,直接输入脚本名可能无法运行,需要指定路径./.`。
      * 如果执行失败,请检查你的执行策略 (Get-ExecutionPolicy),如果不是 RemoteSigned 或更宽松的策略,你可能需要更改它 (Set-ExecutionPolicy RemoteSigned -Scope CurrentUser)。

第四部分:进阶方向与资源

一旦掌握了基础,PowerShell的学习之路还很长远:

  1. 深入学习脚本编程: 学习控制流语句(If/Else, For, While, ForEach)、函数、模块、错误处理(Try/Catch/Finally)等。
  2. 探索更多 Cmdlet: 使用 Get-Command 探索不同类别的Cmdlet,如用于网络 (NetTCPIP模块)、安全 (Security模块)、存储 (Storage模块)等的命令。
  3. 学习模块: 模块是PowerShell功能的扩展单元。许多微软和第三方的产品都提供了PowerShell模块来管理它们。例如,Az 模块用于管理Azure资源,ExchangeOnlineManagement 模块用于管理Exchange Online。使用 Find-ModuleInstall-Module 来发现和安装模块。
  4. 远程管理: PowerShell Remoting 允许你在远程计算机上执行命令和脚本,这对于管理多台服务器非常有用。
  5. 期望状态配置 (DSC): PowerShell DSC 是一种管理配置数据和部署配置的方法,用于确保软件服务在开发、测试和生产环境中的标准化。

学习资源:

  • 官方文档: Microsoft Learn上的PowerShell文档是权威且详细的资源。
  • 社区: Stack Overflow、GitHub上的PowerShell仓库、Reddit上的r/PowerShell社区等。
  • 在线课程和图书: 有很多优质的在线课程和纸质书籍专门讲解PowerShell。

结论

PowerShell 是现代 Windows 系统管理和自动化领域的基石。通过理解其核心概念——Cmdlet、对象、管道、变量、参数和提供程序,并勤于动手实践,你就能释放PowerShell的强大潜力,显著提升你的工作效率。

从简单的系统信息查询到复杂的自动化脚本编写,PowerShell都能为你提供支持。不要被它最初的陌生感所吓倒,花时间去理解它的工作原理,尤其是对象和管道的概念,你将发现一个全新的、高效的自动化世界。

现在,就打开你的PowerShell控制台,从 Get-CommandGet-Help 开始探索吧!祝你在PowerShell的学习旅程中取得成功!


发表评论

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

滚动至顶部