【基础】Windows开发设置入门7:PowerShell的相关概念和使用

 前言

大家熟悉的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 的一些示例:

  • 实用命令行 Shell

    实用工具命令 shell 旨在与特定应用程序或服务配合使用。 这些 shell 只能运行特定于应用程序或服务的命令。 某些实用工具 shell 支持从批处理脚本运行命令,但不包括编程功能。 通常,这些 shell 只能以交互方式使用。

    • AI Shell - 一种仅交互式 shell,用于与 Azure OpenAI 等 AI 服务通信。
    • netsh - Network shell (netsh) 是一个命令行实用工具,可用于在 Windows 上配置和显示各种网络组件的状态。 它既是命令行工具和命令行界面。 它还支持从脚本文件运行命令。

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 核心架构差异

特性CMDPowerShell
输出类型纯文本对象流
可扩展性固定命令集支持自定义 Cmdlet
脚本能力批处理文件面向对象的脚本语言
错误处理简单退出码详细错误对象

1.3 版本兼容性矩阵:

版本号运行时核心特性
5.x.NET FrameworkWindows 专用,完整系统管理
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.1PowerShell 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最新模块(如 AzAWS.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 存档之一,地址如下。

 将内容解压到你选择的位置,然后从该位置运行 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 仅显示几个属性。 前面的示例显示了 NameMemberType 和 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语法

  1. 变量与数据结构

    • 变量定义$files = Get-ChildItem,支持动态类型。
    • 数组与哈希表
     $array = 1, 2, "Hello"  
     $hash = @{ Name = "Alice"; Age = 30 }[[3, 19]]
  1. 控制流结构
    • 条件语句
     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]]
  1. 函数与参数
    • 定义函数
     function Get-DiskSpace {
         param([string]$Drive = "C:")
         Get-Volume -DriveLetter $Drive | Select-Object UsedGB, FreeGB
     }[[10, 21]]
  • 参数验证
     param(
         [ValidateSet("Low", "High")]
         [string]$Priority[[1]]
     )
  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"

 附录:常用资源索引

  1. 官方文档:https://learn.microsoft.com/zh-cn/powershell/
  2. 模块仓库:https://www.powershellgallery.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正经教主

有钱捧个钱场,没钱捧个人场👌

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值