前言
大家熟悉的docker、Python,但对于Windows上有一套开配合开发的相对底层的环境设置,包括powershell、winget、WSL、还有开发驱动器什么的,我准备系统学一下,不然地基不牢,也盖不起冲天高楼~
本节,介绍在 Windows 11 上设置开发驱动器。开发人员驱动器是一种新形式的存储卷,可用于提高关键开发人员工作负荷的性能。
往期参考
【基础】Windows开发设置入门1:各种终端比较-CSDN博客
【基础】Windows开发设置入门2:Windows 终端Windows Terminal-CSDN博客
【基础】Windows开发设置入门3:在 Windows 11 上设置开发驱动器,提升性能速度-CSDN博客
【基础】Windows开发设置入门4:Windows、Python、Linux和Node.js包管理器的作用和区别(AI整理)-CSDN博客 【基础】Windows开发设置入门5:WinGet开发者完全指南(AI整理)-CSDN博客
【基础】Windows开发设置入门6:Scoop开发者完全指南(AI整理)-CSDN博客
本文对应官网文档
官方文档:什么是 PowerShell? - PowerShell | Microsoft Learn
本文核心内容
PowerShell是微软开发的跨平台脚本语言与命令行工具,本文介绍相关概念,和基本使用。PowerShell里的东西太多了,累死个神,先了解基本的用法,以后用到其他查帮助吧😭
一、相关基本概念
0. 命令行界面
命令行界面 是用于管理计算机的交互式命令行接口,也称为 读取Eval-Print 循环(REPL)。
shell 从键盘获取输入,评估该输入,并将输入作为 shell 命令执行,或将输入转发到要执行的作系统。 大多数 shell 还可以从脚本文件读取命令,并且可以包括变量、流控制和函数等编程功能。
0.1 命令 shell 的类型
有两种主要的命令行解释器:
-
常规用途命令 shell
常规用途命令行界面旨在与操作系统配合使用,并允许您运行操作系统支持的任何命令。 它们还包括特定于 shell 的命令和编程功能。 以下列表包含常规用途命令 shell 的一些示例:
- PowerShell
- Windows 命令提示符
- bash - Linux 上很受欢迎
- zsh - macOS 上很受欢迎
-
实用命令行 Shell
实用工具命令 shell 旨在与特定应用程序或服务配合使用。 这些 shell 只能运行特定于应用程序或服务的命令。 某些实用工具 shell 支持从批处理脚本运行命令,但不包括编程功能。 通常,这些 shell 只能以交互方式使用。
0.2 命令行工具
命令行工具 是从命令行界面运行的独立程序。 命令行工具通常设计为执行特定任务,例如管理文件、配置设置或查询信息。 命令行工具可用于支持运行外部程序的任何 shell。
- Azure CLI - 一组命令行工具,用于管理可在任何受支持的 shell 中运行的 Azure 资源。
- Azure PowerShell - 一组 PowerShell 模块,用于管理可在任何受支持的 PowerShell 版本中运行的 Azure 资源。
- OpenSSH for Windows - 包括一个命令行客户端和一个通过网络提供安全通信的服务器。
- Windows 命令 - 内置于 Windows 中的命令行工具的集合。
通常,命令行工具不提供命令行界面(REPL)。 Windows 中的 netsh
命令是一个例外,因为它是命令行工具和交互式命令行命令行工具。
0.3 终端
终端 是一个应用程序,它提供用于托管命令 shell 的基于文本的窗口。 某些终端设计用于处理特定 shell,而另一些终端可以托管多个 shell。 它们还可以包括高级功能,例如:
- 能够在单个窗口中创建多个窗格
- 能够创建多个选项卡来托管多个 shell
- 能够更改配色方案和字体
- 支持复制和粘贴操作
以下列表包含终端应用程序的一些示例:
- Windows 终端 - 一个可托管多个 shell 的 Windows 的新式终端应用程序。
- Windows 控制台主机 - Windows 上用于基于文本的应用程序的默认主机应用程序。 它还可以托管 Windows Command Shell 或 PowerShell。
- macOS 终端 - 可托管 bash 或 zsh shell 的 macOS 上的默认终端应用程序。
- iTerm2 for macOS - macOS 的热门第三方终端应用程序。
- Azure Cloud Shell - 一个基于浏览器的终端应用程序,托管在微软 Azure。 Azure Cloud shell 提供使用 bash 或 PowerShell 的选项。 每个 shell 都预配置了许多命令行工具来管理 Azure 资源。
0.4 cmdlet
PowerShell 命令称为 cmdlet(读作 command-let)。 除了 cmdlet 外,使用 PowerShell 还可以在系统上运行任何可用命令。cmdlet 是本机 PowerShell 命令,而不是独立的可执行文件。 cmdlet 收集在 PowerShell 模块中,可按需加载。 可以用任何编译的 .NET 语言或 PowerShell 脚本语言本身来编写 cmdlet。
PowerShell 使用“动词-名词”名称对来命名 cmdlet。 例如,PowerShell 中包含的 Get-Command
cmdlet 用于获取在命令行界面中注册的所有 cmdlet。 谓词标识 cmdlet 执行的操作,名词标识该 cmdlet 执行其操作的所在资源。
1. PowerShell 基础概念与架构
1.1 什么是 PowerShell?
PowerShell 是微软开发的跨平台脚本语言与命令行工具,结合了命令行效率、函数式编程灵活性和面向对象(基于 .NET)的强大数据处理能力。自 2006 年发布以来,已成为系统管理、自动化任务和开发运维的核心工具。
作为一种脚本语言,PowerShell 通常用于自动执行系统管理。 它还用于经常在 CI/CD 环境中生成、测试和部署解决方案。 PowerShell 是在 .NET 公共语言运行时 (CLR) 上构建的。 所有输入和输出都是 .NET 对象。 无需分析文本输出即可从输出中提取信息。
PowerShell 的可扩展性质使 PowerShell 模块的生态系统能够部署和管理使用的几乎所有技术。
总结PowerShell的特点为:
- 跨平台命令行工具:支持 Windows、Linux、macOS 的现代 Shell(PowerShell Core 6.0+)
- 面向对象的管道机制:所有命令输出均为 .NET 对象,支持属性与方法调用,示例:
# 传统文本处理 vs 对象处理对比 Get-Process | Where-Object CPU -gt 100 | Select-Object Name, CPU # 管道扩展示例:网络请求对象流处理 Invoke-RestMethod -Uri "https://api.example.com/data" | Where-Object { $_.status -eq "active" } | Format-List -Property id, created_at
- 多语言交互环境:
- 直接调用 .NET Framework([System.Environment]::OSVersion)
- 支持 COM 对象交互(New-Object -ComObject WScript.Network)
- 调用 REST API(Invoke-RestMethod)
- 可扩展性:通过模块(如
PSReadLine
提供语法高亮)和自定义 Cmdlet 扩展功能。 - 自动化能力:从文件管理到云服务编排,覆盖全生命周期任务。
1.2 核心架构差异
特性 | CMD | PowerShell |
---|---|---|
输出类型 | 纯文本 | 对象流 |
可扩展性 | 固定命令集 | 支持自定义 Cmdlet |
脚本能力 | 批处理文件 | 面向对象的脚本语言 |
错误处理 | 简单退出码 | 详细错误对象 |
1.3 版本兼容性矩阵:
版本号 | 运行时 | 核心特性 |
---|---|---|
5.x | .NET Framework | Windows 专用,完整系统管理 |
7.0+ | .NET Core | 跨平台支持,模块化设计 |
7.4 LTS | .NET 8 | 云原生优化,性能增强 |
2. Windows PowerShell
Windows PowerShell 是 Windows 中随附的 PowerShell 版本。 Microsoft 不再为 Windows PowerShell 的更新提供新功能。 对 Windows PowerShell 的支持与你正在使用的 Windows 版本相关联。
Windows PowerShell 和 PowerShell 是两个独立的产品。 Windows PowerShell是基于.NET Framework的,仅支持Windows,而PowerShell基于.NET Core(后来是.NET 5/6/7/8/9),跨平台运行。在 Windows PowerShell 中,PowerShell 可执行文件名为 powershell.exe
。 在版本 6 及更高版本中,可执行文件命名 pwsh.exe
。
核心区别
特性 | Windows PowerShell 5.1 | PowerShell 7(Core) |
---|---|---|
基础架构 | 基于 .NET Framework | 基于 .NET Core / .NET 5+ |
跨平台支持 | 仅限 Windows | 支持 Windows、Linux、macOS |
开源与更新频率 | 闭源,微软维护 | 开源(GitHub),活跃更新 |
版本迭代 | 停止功能更新(仅安全补丁) | 持续更新(PowerShell 7.x) |
兼容性 | 完全兼容传统 Windows 组件 | 部分 .NET Framework 功能受限 |
默认安装位置 | 系统内置 | 需单独安装(通过 Microsoft Store 或安装包) |
使用场景对比
使用场景 | 推荐版本 | 原因 |
---|---|---|
系统管理(本地 Windows) | Windows PowerShell 5.1 | 兼容所有传统工具(如注册表、WMI、COM 对象) |
跨平台自动化 | PowerShell 7 | 支持 Linux/macOS,统一脚本环境 |
云服务管理(Azure/AWS) | PowerShell 7 | 最新模块(如 Az 、AWS.Tools )需 PowerShell 7 |
遗留脚本维护 | Windows PowerShell | 避免兼容性问题(如 .NET Framework 特定功能) |
开发与CI/CD集成 | PowerShell 7 | 支持容器化、高性能处理、GitHub Actions 集成 |
我在系统里,窗口到他们的安装目录分别是:
PowerShell 7 (x64)
"C:\Program Files\PowerShell\7\pwsh.exe" -WorkingDirectory ~
Windows PowerShell
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe,通常是:C:\Windows\System32\WindowsPowerShell\v1.0
如果你安装了Windows终端,会有他们发分配配置文件:
运行窗口样式有区别,查看版本信息命令:$PSVersionTable
二、安装
2.1 Windows系统安装
使用 WinGet 安装 PowerShell(推荐)
WinGet(Windows 包管理器)是一种命令行工具,允许用户在 Windows 客户端计算机上发现、安装、升级、删除和配置应用程序。 此工具是 Windows 程序包管理器服务的客户端接口。 默认情况下,winget
命令行工具作为应用安装程序与 Windows 11 和现代版本的 Windows 10 捆绑在一起。
搜索最新版本的 PowerShell
winget search Microsoft.PowerShell
执行界面:
使用 id
参数安装 PowerShell 或 PowerShell 预览版
winget install --id Microsoft.PowerShell --source winget
winget install --id Microsoft.PowerShell.Preview --source winget
安装界面:
安装过程,会自动触发安装,过程会有安全提示,
备注:在使用 X86 或 X64 处理器的 Windows 系统上,
winget
安装 MSI 包。 在使用 Arm64 处理器的系统上,winget
安装 Microsoft Store (MSIX) 包。
MSI 包安装
若要在 Windows 上安装 PowerShell,请使用以下链接从 GitHub 下载安装包。
下载后,双击安装程序文件并按照提示进行操作。
安装 ZIP 包
提供有 PowerShell 二进制 ZIP 存档,从而支持高级部署方案。下载以下 ZIP 存档之一,地址如下。
- PowerShell-7.5.1-win-x64.zip
- PowerShell-7.5.1-win-x86.zip
- 【基础】Windows开发设置入门6:Scoop开发者完全指南(AI整理)-CSDN博客
将内容解压到你选择的位置,然后从该位置运行 pwsh.exe
。 与安装 MSI 包不一样,安装 ZIP 存档不会检查先决条件。
2.2 linux系统安装
# Linux(Ubuntu)安装
sudo apt-get install -y powershell
2.3 验证安装
PowerShell 中有自动变量用于存储状态信息。 其中一个变量 $PSVersionTable
包含有关 PowerShell 会话的版本信息。
# 查看版本信息
$PSVersionTable
三、使用
3.1 运行PowerShell
在开始菜单,查找powershell,你可能看到很多版本:
PowerShell 7 和Windows PowerShell 是独立的产品,并行存在,区别见第一部分。PowerShell 7是我们安装的新程序,Windows PowerShell是系统自带的。
在 64 位版本的 Windows 上,有一个 64 位版本的 Windows PowerShell 控制台和 Windows PowerShell 集成脚本环境(ISE),和对应的 32 位版本,在快捷方式上用 (x86) 后缀标识。Microsoft不再更新 PowerShell ISE。 ISE 仅适用于 Windows PowerShell 5.1。
可能还有基于不同开发环境的,如Developer PowerShell for VS2022。
备注:Windows 11 仅作为 64 位操作系统提供。 没有 32 位版本的 Windows 11。 但是,Windows 11 包括 32 位版本的 Windows PowerShell 和 Windows PowerShell ISE。
如果需要使用提升的权限运行 PowerShell, 选择“ 以管理员身份运行”:
3.2 执行策略
PowerShell 执行策略控制运行 PowerShell 脚本的条件。 PowerShell 中的执行策略是一项安全功能,旨在帮助防止无意中执行恶意脚本。 但,确定的用户(高级权限用户)可以绕过 PowerShell 中的执行策略。
可以为本地计算机、当前用户或 PowerShell 会话设置执行策略。 还可以为具有组策略的用户和计算机设置执行策略。
下表显示了当前 Windows 操作系统的默认执行策略。
Windows 操作系统版本 | 默认执行策略 |
---|---|
Windows Server 2022 | 远程签名 |
Windows Server 2019 | 远程签名 |
Windows Server 2016 | 远程签名 |
Windows 11 | 受限 |
Windows 10 | 受限 |
无论执行策略设置如何,都可以以交互方式运行任何 PowerShell 命令。 执行策略仅影响脚本中运行的命令。
使用 Get-ExecutionPolicy
cmdlet 确定当前的执行策略设置。
检查计算机上的执行策略设置。
PowerShell:
Get-ExecutionPolicy
Output:
Restricted
列出所有范围的执行策略设置。
PowerShell:
Get-ExecutionPolicy -List
Output:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
所有 Windows 客户端操作系统都具有默认的执行策略设置 Restricted
。 无法使用执行策略设置运行 PowerShell 脚本 Restricted
。
提示:PowerShell 脚本是一个纯文本文件,其中包含要运行的命令。 PowerShell 脚本文件使用
.ps1
文件扩展名。 若要创建 PowerShell 脚本,请使用代码编辑器(如 Visual Studio Code(VS Code)或任何文本编辑器(如记事本)。
以交互方式运行以下命令时,它将完成且不会出现错误。
PowerShell:
Get-Service -Name W32Time
但是,从脚本中运行相同的命令时,PowerShell 将返回错误。
PowerShell:
.\Get-TimeService.ps1
Output:
.\Get-TimeService.ps1 : File C:\tmp\Get-TimeService.ps1 cannot be loaded
because running scripts is disabled on this system. For more information,
see about_Execution_Policies at
https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\Get-TimeService.ps1
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
请注意错误消息告知命令失败的原因:
...在此系统上禁用正在运行的脚本。
若要启用脚本的执行,请使用 cmdlet 更改执行策略 Set-ExecutionPolicy
。 LocalMachine
如果未指定 Scope 参数, 则为默认范围 。 必须以管理员身份运行 PowerShell 才能更改本地计算机的执行策略。 除非对脚本进行签名,否则建议使用 RemoteSigned
执行策略。 RemoteSigned
阻止运行未由受信任的发布者签名的已下载脚本。
将计算机上的执行策略设置更改为 RemoteSigned
。
PowerShell:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
如果已成功更改执行策略,PowerShell 会显示以下警告:
Output:
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust.
Changing the execution policy might expose you to the security risks
described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the
execution policy?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "N"):y
如果未以管理员身份提升 PowerShell,PowerShell 将返回以下错误消息:
Output:
Set-ExecutionPolicy : Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWAR
E\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. To
change the execution policy for the default (LocalMachine) scope, start
Windows PowerShell with the "Run as administrator" option. To change the
execution policy for the current user, run "Set-ExecutionPolicy -Scope
CurrentUser".
At line:1 char:1
+ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy],
UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.
PowerShell.Commands.SetExecutionPolicyCommand
还可以更改当前用户的执行策略,而无需以管理员身份运行提升的 PowerShell。 如果成功将本地计算机的 RemoteSigned
执行策略设置为 ,则不需要执行此步骤。
PowerShell:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
将执行策略设置为 RemoteSigned
后, Get-TimeService.ps1
脚本将成功运行。
PowerShell:
.\Get-TimeService.ps1
Output:
Status Name DisplayName
------ ---- -----------
Running W32Time Windows Time
四、powershell命令
PowerShell 随附数百个预安装命令。 PowerShell 命令称为 cmdlet(读作 command-let)。
每个 cmdlet 的名称都包含一个“谓词-名词”对。例如,PowerShell 中包含的 Get-Command
命令,用于获取在命令行界面中注册的所有 cmdlet。 谓词标识 cmdlet 执行的操作,名词标识该 cmdlet 执行其操作的所在资源。
PowerShell 中核心cmdlet:
Get-Verb
。 运行此命令时,将返回大多数命令遵循的谓词的列表。 响应包括有关这些谓词的功能的说明。 由于大多数命令都遵循这种命名约定,因此它对命令的功能设置了预期目标。 如果你要创建命令,这有助于选择适当的命令和命令名称。Get-Command
。 此命令会检索计算机上安装的所有命令的列表。Get-Member
。 它在基于对象的输出上运行,并且能够发现可用于命令的对象、属性和方法。Get-Help
。 以命令名称为参数调用此命令,将显示一个帮助页面,其中说明了命令的各个部分。
PowerShell 还可以运行操作系统本机命令,例如传统的命令行程序 ping.exe
和 ipconfig.exe
。
Get-Help
Get-Help
是一个多用途命令,可帮助你了解如何在找到命令后使用命令。
使用 Get-Help
查找命令时,它最初会根据输入对命令名称执行通配符搜索。 如果找不到任何匹配项,它将在系统上的所有 PowerShell 帮助文章中执行全面的全文搜索。 如果这也找不到任何结果,它将返回错误。
使用 Get-Help
查看 Get-Help
cmdlet 的帮助内容。
PowerShell:
Get-Help -Name Get-Help
从 PowerShell 版本 3.0 开始,帮助内容没有随操作系统预装。 首次运行 Get-Help
时,会出现一条消息,询问是否要将 PowerShell 帮助文件下载到计算机。
如果按 Y 来回答是,则会执行 Update-Help
cmdlet,并下载帮助内容。
Output:
Do you want to run Update-Help?
The Update-Help cmdlet downloads the most current Help files for Windows
PowerShell modules, and installs them on your computer. For more information
about the Update-Help cmdlet, see
https:/go.microsoft.com/fwlink/?LinkId=210614.
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"):
如果未收到此消息,请在以管理员身份运行的提升权限的 PowerShell 会话中运行 Update-Help
。
更新完成后,将显示帮助文章。
Get-Help
查找命令时,请为 *
通配符括起要搜索的词,作为参数。 如下面示例
PowerShell:
help *process*
Output:
Name Category Module Synops
---- -------- ------ ------
Enter-PSHostProcess Cmdlet Microsoft.PowerShell.Core Con...
Exit-PSHostProcess Cmdlet Microsoft.PowerShell.Core Clo...
Get-PSHostProcessInfo Cmdlet Microsoft.PowerShell.Core Get...
Debug-Process Cmdlet Microsoft.PowerShell.M... Deb...
Get-Process Cmdlet Microsoft.PowerShell.M... Get...
Start-Process Cmdlet Microsoft.PowerShell.M... Sta...
Stop-Process Cmdlet Microsoft.PowerShell.M... Sto...
Wait-Process Cmdlet Microsoft.PowerShell.M... Wai...
Invoke-LapsPolicyProcessing Cmdlet LAPS Inv...
ConvertTo-ProcessMitigationPolicy Cmdlet ProcessMitigations Con...
Get-ProcessMitigation Cmdlet ProcessMitigations Get...
Set-ProcessMitigation Cmdlet ProcessMitigations Set...
在这种情况下,等同于不添加 *
通配符字符。因为 Get-Help
找不到与所提供的值匹配的命令,它将对该值进行全文搜索。 以下示例与上面的命令执行结果相同。
PowerShell:
help process
在特定位置指定通配符时,Get-Help
仅搜索与提供的模式匹配的命令。 如以下命令,匹配不到任何结果。
PowerShell:
help pr*cess
使用短划线,会被视为参数,而不是要搜索的内容,下面示例会出错, Get-Help
cmdlet 不存在此类参数名称。
PowerShell:
help -process
如果尝试搜索以 -process
结尾的命令,则必须将 *
添加到值的开头。
PowerShell:
help *-process
如果搜索仅找到一个匹配项,Get-Help
显示帮助内容,而不是列出搜索结果。
PowerShell:
help *hotfix*
部分输出:
NAME
Get-HotFix
SYNOPSIS
Gets the hotfixes that are installed on local or remote computers.
SYNTAX
Get-HotFix [-ComputerName <System.String[]>] [-Credential
更多内容,参考官方文档。
Get-Verb
要获取所有可用谓词的完整列表,请使用 Get-Verb
cmdlet,谓词表示你尝试执行的操作,例如读取数据或更改数据。
Get-Verb
cmdlet 返回一个很长的谓词列表。 “说明”为谓词的用途提供上下文。 下面是前几行的输出:
Verb AliasPrefix Group Description
---- ----------- ----- -----------
Add a Common Adds a resource to a container, or attaches an item to another item
Clear cl Common Removes all the resources from a container but does not delete the container
Close cs Common Changes the state of a resource to make it inaccessible, unavailable, or unusab…
Copy cp Common Copies a resource to another name or to another container
Enter et Common Specifies an action that allows the user to move into a resource
Exit ex Common Sets the current environment or context to the most recently used context
...
Get-Command
Get-Command
cmdlet 将返回系统上安装的所有可用命令的列表。 返回的列表会非常大。 可以通过使用参数或帮助程序 cmdlet 筛选响应来限制返回的信息量。
根据名称筛选
你可以使用不同的参数筛选 Get-Command
的输出。 通过筛选,可以查找具有特定属性的命令。 使用 Name 参数,可以按名称查找特定命令。
PowerShell命令:
Get-Command -Name Get-Process
Output:
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Process 7.0.0.0 Microsoft.PowerShell.Management
如果想要查找所有适用于进程的命令,该怎么办? 可以使用通配符 *
来匹配其他形式的字符串。 例如:
PowerShell:
Get-Command -Name *-Process
Output:
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Debug-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Get-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Start-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Wait-Process 7.0.0.0 Microsoft.PowerShell.Management
根据名词和谓词进行筛选
还有其他可筛选谓词和名词值的参数。 命令名称的谓词部分位于最左侧。 谓词应为 Get-Verb
cmdlet 返回的值之一。 命令的最右边是名词部分。 名词可以是任何内容。
-
根据谓词进行筛选。 在命令
Get-Process
中,谓词部分为Get
。 要筛选谓词部分,请使用 Verb 参数。PowerShell:
Get-Command -Verb 'Get'
此示例列举出使用谓词
Get
的所有命令。 -
根据名词进行筛选。 在命令
Get-Process
中,名词部分是Process
。 要筛选名词,请使用 Noun 参数。 以下示例返回包含以字母U
开头的名词的所有 cmdlet。PowerShell:
Get-Command -Noun U*
此外,还可以组合参数来缩小搜索范围,例如:
PowerShell:
Get-Command -Verb Get -Noun U*
Output:
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-UICulture 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Unique 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Uptime 7.0.0.0 Microsoft.PowerShell.Utility
使用其他 cmdlet 筛选结果
还可以使用其他 cmdlet 来筛选结果。
-
Select-Object
。 此通用命令可帮助你从一个或多个对象中选取特定属性。 还可以限制返回的项目数。 以下示例返回当前会话中前 5 个可用命令的 Name 和 Source 属性值。PowerShell:
Get-Command | Select-Object -First 5 -Property Name, Source
Output:
Name Source ---- ------ Add-AppPackage Appx Add-AppPackageVolume Appx Add-AppProvisionedPackage Dism Add-AssertionOperator Pester Add-ProvisionedAppPackage Dism
-
Where-Object
。 此 cmdlet 允许根据属性值筛选返回的对象。 命令采用可以测试属性值的表达式。 以下示例返回以p
开头的ProcessName
的所有进程。PowerShell:
Get-Process | Where-Object {$_.ProcessName -like "p*"}
Get-Process
cmdlet 返回进程对象的集合。 要对响应进行筛选,可以使用管道将输出“发送”到Where-Object
。 使用管道“发送”表示通过管道|
字符连接两个或更多个命令。 一个命令的输出作为下一个命令的输入发送。Where-Object
的筛选表达式使用-like
运算符来匹配以字母p
开头的进程。
Get-Member
找到所需的 cmdlet 后,需要进一步了解它生成的内容, Get-Member
cmdlet 将显示对象的类型、属性和方法。 将你要检查的输出发送到 Get-Member
。
PowerShell:
Get-Process | Get-Member
结果显示返回的 TypeName
类型以及对象的所有属性和方法。 下面是此类结果的一段摘录:
Output:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
...
使用 MemberType 参数可以限制返回的信息。
PowerShell:
Get-Process | Get-Member -MemberType Method
默认情况下,PowerShell 仅显示几个属性。 前面的示例显示了 Name
、MemberType
和 Definition
成员。 可以使用 Select-Object
来指定要查看的属性。 例如,你希望仅显示 Name
和 Definition
属性:
PowerShell:
Get-Process | Get-Member | Select-Object Name, Definition
按参数类型搜索
Get-Member
向我们展示了 Get-Process
返回 Process 类型对象。 Get-Command
的 ParameterType 参数可用于查找将 Process 对象作为输入的其他命令。
PowerShell:
Get-Command -ParameterType Process
Output:
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Debug-Process 7.0.0.0 Microsoft.PowerShell.Managem…
Cmdlet Enter-PSHostProcess 7.1.0.0 Microsoft.PowerShell.Core
Cmdlet Get-Process 7.0.0.0 Microsoft.PowerShell.Managem…
Cmdlet Get-PSHostProcessInfo 7.1.0.0 Microsoft.PowerShell.Core
Cmdlet Stop-Process 7.0.0.0 Microsoft.PowerShell.Managem…
Cmdlet Wait-Process 7.0.0.0 Microsoft.PowerShell.Managem…
了解命令的输出类型有助于缩小相关命令的搜索范围。
五、脚本编程
PowerShell 脚本是一个纯文本文件,其中包含要运行的命令。 PowerShell 脚本文件使用 .ps1
文件扩展名。 若要创建 PowerShell 脚本,请使用代码编辑器(如 Visual Studio Code(VS Code)或任何文本编辑器(如记事本)。
5.1语法
-
变量与数据结构
- 变量定义:
$files = Get-ChildItem
,支持动态类型。 - 数组与哈希表:
- 变量定义:
$array = 1, 2, "Hello"
$hash = @{ Name = "Alice"; Age = 30 }[[3, 19]]
- 控制流结构
- 条件语句:
if ($count -gt 10) { Write-Host "溢出" }
else { Write-Host "正常" }[[14, 19]]
- 循环结构:
foreach ($file in (Get-ChildItem)) { $file.Name }
1..5 | ForEach-Object { $_ * 2 }[[14, 19]]
- 函数与参数
- 定义函数:
function Get-DiskSpace {
param([string]$Drive = "C:")
Get-Volume -DriveLetter $Drive | Select-Object UsedGB, FreeGB
}[[10, 21]]
- 参数验证:
param(
[ValidateSet("Low", "High")]
[string]$Priority[[1]]
)
- 错误处理
- Try/Catch:
try { Restart-Service UnknownService -ErrorAction Stop }
catch { Write-Warning "服务不存在" }[[19]]
- 调试工具:
Set-PSDebug -Trace 1
追踪脚本执行
5.2 代码示例
1) 参数化脚本设计
param(
[Parameter(Mandatory=$true)]
[ValidateSet("Start","Stop","Restart")]
[string]$Action,
[Parameter(Mandatory=$true)]
[ValidatePattern("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")]
[string]$IpAddress
)
function Invoke-Action {
param($actionType, $target)
# 实现逻辑
}
2)异常处理机制
try {
$webRequest = Invoke-WebRequest -Uri "http://invalid-url"
} catch [System.Net.WebException] {
Write-Host "网络错误: $_.Exception.Message"
} catch {
Write-Host "未知错误: $_"
} finally {
if ($webRequest) { $webRequest.Dispose() }
}
3) 高级函数开发
function ConvertTo-Hex {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[int]$Number
)
process {
"0x{0:X}" -f $Number
}
}
# 使用管道
1..10 | ConvertTo-Hex
5.3 高级功能与集成
1) 远程管理
# 启用WinRM
winrm quickconfig
# 创建会话
$session = New-PSSession -ComputerName Server01 -Credential (Get-Credential)
# 执行远程脚本
Invoke-Command -Session $session -FilePath .\deploy.ps1
# 关闭会话
Remove-PSSession $session
2) 正则表达式应用
# 日志分析示例
$pattern = '\[(?<date>\d{4}-\d{2}-\d{2})\] User (?<user>\w+) logged in from (?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
Select-String -Path auth.log -Pattern $pattern |
ForEach-Object {
[PSCustomObject]@{
Date = $_.Matches.Groups['date'].Value
User = $_.Matches.Groups['user'].Value
IP = $_.Matches.Groups['ip'].Value
}
}
3) COM 对象交互
# Excel 自动化
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Add()
$sheet = $workbook.ActiveSheet
$sheet.Cells.Item(1,1) = "Hello PowerShell"
附录:常用资源索引
- 官方文档:https://learn.microsoft.com/zh-cn/powershell/
- 模块仓库:https://www.powershellgallery.com/