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: 基于文本的命令行工具。命令的输出是文本字符串。处理这些输出通常需要使用管道和文本处理工具(如
findstr
、more
等),容易出错,且依赖于输出格式。 - PowerShell: 基于对象的命令行 Shell。命令的输出是结构化的对象。可以使用统一的方式访问对象的属性和方法,并使用管道将对象传递给其他命令进行进一步处理。这使得数据处理更加可靠和灵活。
- 命令语法: Cmd.exe 命令通常是简短的、类似DOS的命令。PowerShell 使用的是更具描述性的 “Verb-Noun” (动词-名词) 结构,如
Get-Process
、Set-Location
等。 - 功能深度: PowerShell 提供了对 .NET Framework (.NET Core) 的全面访问,这意味着你可以利用 .NET 的强大功能来完成复杂的任务,而 Cmd.exe 功能相对有限。
- 脚本能力: PowerShell 的脚本语言功能强大,支持变量、控制流(循环、条件判断)、函数、模块等高级编程特性。
总之,PowerShell 是Cmd.exe 的继任者,它带来了更现代、更强大、更统一的管理和自动化能力。
第二章:获取并启动PowerShell
Windows 10/11 以及 Windows Server 的现代版本都预装了PowerShell。你可以通过几种方式来启动它:
- 通过搜索栏: 点击任务栏的搜索图标或按下
Windows键 + S
,输入 “PowerShell”,你会看到 “Windows PowerShell” 应用程序。 - 通过运行命令: 按下
Windows键 + R
打开“运行”对话框,输入powershell
并按回车。 - 通过开始菜单: 在开始菜单中找到 “Windows PowerShell” 文件夹并打开。
- 作为管理员运行: 对于许多需要修改系统设置的任务,你需要以管理员权限运行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
你看到的输出可能像一个表格,包含 Handles
、NPM(K)
、PM(K)
、WS(K)
、CPU
、Id
、ProcessName
等列。这些列实际上是每个进程对象的属性。
每个对象除了属性,还有方法 (Methods),即可以对该对象执行的动作。
要查看一个 Cmdlet 输出的对象类型、属性和方法,可以使用 Get-Member
Cmdlet,并将前一个 Cmdlet 的输出通过管道传递给它。
例如,查看 Get-Process
输出对象的成员:
powershell
Get-Process | Get-Member
输出会显示该对象是 System.Diagnostics.Process
类型,列出所有可用的属性(AliasProperty
、CodeProperty
、Property
等)和方法(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经验的用户过渡。例如:
dir
是Get-ChildItem
的别名cd
或chdir
是Set-Location
的别名ls
也是Get-ChildItem
的别名copy
是Copy-Item
的别名del
或rm
是Remove-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-Object
和Sort-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 被设计用来接收来自管道的输入。它们通常有一个或多个参数可以接受来自管道的对象,这些参数通常被称为 ValueFromPipeline
或 ValueFromPipelineByPropertyName
参数(可以通过 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-Table
、Format-List
、Format-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
``
“$variableName”
注意,在双引号字符串中,PowerShell 会解释变量 ();在单引号字符串中,变量不会被解释 (
‘$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-Command
和Enter-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-Object
和Select-Object
过滤和选择数据。 - 进行基本的文件、目录、进程和服务管理。
- 使用变量存储信息。
- 编写和运行基础PowerShell脚本,并了解执行策略。
这仅仅是PowerShell世界的冰山一角。要真正掌握它,需要大量的实践和持续的学习。
后续学习资源推荐:
- PowerShell 控制台内置帮助 (
Get-Help
): 这是你的第一手资料,请充分利用。特别是about_*
系列帮助主题。 - Microsoft Learn: 微软官方提供了大量高质量的PowerShell文档和互动学习路径。搜索 “PowerShell Microsoft Learn”。
- PowerShell In A Month Of Lunches 系列书籍: 这是非常经典的入门书籍,以每天一小时的学习量设计。
- 在线社区和论坛: Stack Overflow、Reddit 的 r/PowerShell 版块、微软的技术社区等,可以提问和学习他人的经验。
- 实践!实践!实践! 从自动化一些小任务开始,比如批量重命名文件、清理临时文件夹、生成报告等。动手尝试是学习的最佳方式。
记住,学习PowerShell是一个循序渐进的过程。不要害怕犯错,多尝试,多查阅帮助文档和在线资源。随着你经验的增长,你会发现PowerShell能极大地提升你的工作效率和能力。
祝你学习顺利,享受PowerShell带来的强大力量!