Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

附录

A:常用 Cmdlet 速查表

这张表汇集了在日常管理和脚本编写中最常遇到的 PowerShell Cmdlet。它按照功能进行分类,方便你根据需要快速定位。

分类Cmdlet功能描述常见别名
控制台与帮助Get-Help显示关于 Cmdlet、函数、脚本的帮助信息。help, man
Get-Command获取所有已安装的 Cmdlet、函数、别名等。gcm
Get-History获取当前会话中输入的命令历史。h, history
Clear-Host清空控制台屏幕。cls, clear
文件与目录Get-Location获取当前工作目录的路径。gl, pwd
Set-Location更改当前工作目录。sl, cd, chdir
Get-ChildItem列出指定路径下的文件和目录。gci, ls, dir
New-Item创建新的文件或目录。ni
Remove-Item删除文件或目录。ri, rm, del, erase
Copy-Item复制文件或目录。cpi, cp, copy
Move-Item移动文件或目录。mi, mv, move
Rename-Item重命名文件或目录。rni, ren
Get-Content读取并输出文件的内容。gc, cat, type
Set-Content将内容写入文件(覆盖)。sc
Add-Content将内容追加到文件末尾。ac
对象与管道Get-Member获取对象的属性、方法等成员信息。gm
Select-Object从对象中选择指定的属性。select
Where-Object根据条件筛选对象。where, ?
Sort-Object对对象集合进行排序。sort
Measure-Object计算对象的数值属性(计数、求和、平均值等)。measure
Group-Object根据指定的属性对对象进行分组。group
ForEach-Object对集合中的每个对象执行操作。foreach, %
系统管理Get-Process获取系统中正在运行的进程。gps, ps
Stop-Process停止一个或多个正在运行的进程。spps, kill
Get-Service获取系统中的服务。gsv
Start-Service启动一个服务。sasv
Stop-Service停止一个服务。spsv
Restart-Service重启一个服务。rs
Get-Date获取当前日期和时间。date
Test-Connection向远程计算机发送 ICMP 回显请求(Ping)。ping, tcon
Test-NetConnection诊断网络连接(Ping, TCP 端口测试, 路由跟踪)。tnc
数据处理Export-Csv将对象导出为 CSV 格式的文件。epcsv
Import-Csv从 CSV 文件导入数据并转换为对象。ipcsv
ConvertTo-Json将对象转换为 JSON 格式的字符串。1
ConvertFrom-Json将 JSON 格式的字符串转换为对象。2
ConvertTo-Html将对象转换为 HTML 格式。3
Invoke-RestMethod向 REST API 发送请求并解析响应。irm
Invoke-WebRequest向网页发送 HTTP 请求。iwr, wget, curl

B:常用别名列表

别名是为 Cmdlet 或函数提供的“昵称”,主要用于在交互式控制台中提高输入效率。在编写脚本时,强烈建议使用完整的 Cmdlet 名称以保证可读性。

别名Cmdlet
?Where-Object
%ForEach-Object
acAdd-Content
catGet-Content
cdSet-Location
clsClear-Host
cpCopy-Item
curlInvoke-WebRequest
delRemove-Item
dirGet-ChildItem
echoWrite-Output
flFormat-List
ftFormat-Table
gcGet-Content
gciGet-ChildItem
gcmGet-Command
gmGet-Member
gpsGet-Process
groupGroup-Object
hGet-History
helpGet-Help
iexInvoke-Expression
irmInvoke-RestMethod
iwrInvoke-WebRequest
killStop-Process
lsGet-ChildItem
manGet-Help
mdNew-Item (用于创建目录)
)move
mountNew-PSDrive
mvMove-Item
popdPop-Location
psGet-Process
pushdPush-Location
pwdGet-Location
rInvoke-History
renRename-Item
rmRemove-Item
rmdirRemove-Item
scSet-Content
selectSelect-Object
slSet-Location
sortSort-Object
teeTee-Object
typeGet-Content
wgetInvoke-WebRequest
whereWhere-Object

C:正则表达式快速参考

正则表达式(Regular Expression, Regex)是用于匹配和处理文本的强大模式。PowerShell 在 -match, -split, -replace 等运算符和 Select-String Cmdlet 中广泛使用它。

符号/序列描述示例
基本本符
.匹配除换行符外的任意单个字符。‘a.c’ 匹配 “abc”, “a_c”, “a1c” 配除换行符外的任意单个字符
\d匹配任意一个数字 (等同于 [0-9])。‘\d{3}’ 匹配 “123” 匹任意一个数字 (等同于 [0-9])
\w匹配任意一个单词字符 (字母、数字、下划线)。‘\w+’ 匹配 “word1_23” 匹任意一个单词字符 (字母、数字、下划线)
\s匹配任意一个空白字符 (空格, Tab, 换行符)。‘a\sb’ 匹配 “a b” 匹任意一个空白字符 (空格, Tab, 换行符)
\D, \W, \S分别与 \d, \w, \s 相反。‘\D’ 匹配 “a”, “_” 分别与 \d, , \s 相反
量词
+匹配前面的元素 1 次或多次。‘a+b’ 匹配 “ab”, “aaab” 匹前面的元素 1 次或多次
?匹配前面的元素 0 次或 1 次。‘colou?r’ 匹配 “color”, “colour” 匹前面的元素 0 次或 1 次
{n}匹配前面的元素恰好 n 次。‘\d{4}’ 匹配 “2023” 匹配面的元素恰好 n 次
{n,}匹配前面的元素至少 n 次。‘\d{2,}’ 匹配 “12”, “1234” 匹配面的元素至少 n 次
{n,m}匹配前面的元素至少 n 次,但不超过 m 次。‘\w{3,5}’ 匹配 “cat”, “house” 匹配前的元素至少 n 次,但不超过 m 次
锚点
$匹配字符串的结尾。‘end$’ 匹配 “This is the end” 匹字符串的结尾
\b匹配单词边界。‘\bword\b’ 匹配 “word” 但不匹配 “wording” 匹单词边界
分组与范围
[^…]匹配任意一个不在方括号内的字符。‘[^0-9]’ 匹配任意非数字字符 匹配任一个不在方括号内的字符
( … )分组,将多个元素视为一个整体,并用于捕获。‘(ab)+’ 匹配 “ab”, “abab” 分组,将个元素视为一个整体,并用于捕获
或,匹配
转义
\转义殊字符,使其被视为普通字符。‘C:\Temp’ 匹配 “C:\Temp” 义特殊字符,使其被视为普通字符

结语:代码之外,路在脚下

亲爱的读者,当您翻到这一页时,我们共同的旅程已悄然抵达终点。我仿佛能看到,灯光下,您长舒一口气,眼中闪烁着知识沉淀后的光芒。请允许我,作为您这段旅程的虚拟向导,与您一同回望来路,并遥看前方的星辰大海。

我们从何处启航?从那个闪烁着光标、既熟悉又陌生的命令行窗口。我们怀着一丝忐忑与好奇,敲下了第一行 Get-Date,感受到了 PowerShell 即时回应的脉搏。那是我们与这个强大世界缔结契约的第一个瞬间。我们曾像一个蹒跚学步的孩童,学习着 cdls 这些基础的“单词”,在文件系统的广阔平原上,学会了行走与奔跑。我们曾惊叹于 Get-Process | Sort-Object CPU -Descending 这一行代码所展现出的管道艺术,第一次窥见了“对象”这一核心哲学的无穷魅力。

随后,我们开始构建自己的“语法宫殿”。变量是基石,运算符是钢筋,流程控制则是那精巧的廊柱与穹顶。我们不再仅仅是命令的使用者,我们开始用 function 关键字,创造属于自己的“魔法咒语”。我们学会了用 [CmdletBinding()] 和注释式帮助,将粗糙的脚本,打磨成闪耀着专业光芒的工具。我们探索了作用域的边界,用模块将智慧封装,准备将其分享给世界。我们直面了错误与异常,用 Try-Catch 为我们的代码穿上坚固的铠甲,用调试器赋予我们洞察毫厘的“火眼金睛”。

当我们的“内功”日渐深厚,便开始在更广阔的实战江湖中闯荡。在 Windows 的心脏地带,我们精细地操控着文件权限(ACL),像巡视自家领地一样漫游注册表。我们与 WMI/CIM 进行了深度对话,聆听硬件与软件的低语。我们掌控了 Active Directory 这个庞大的“户籍系统”,将数百用户的创建与管理,浓缩于一杯咖啡的时间。

我们并未就此止步。我们扬帆出海,将 PowerShell 的旗帜插上了 Linux 和 macOS 的土地,见证了它与 grepawk 等原生工具的和谐共舞。我们驾驭着 AzAWS.Tools 这两艘巨轮,驶向了云端的无垠蓝海,以代码定义着未来的基础设施。我们掌握了 Invoke-RestMethod 这把万能钥匙,与世间万千 API 对话,真正实现了与万物互联。

最终,我们登上了精通之境的顶峰。我们用高级函数和模块清单,构建出企业级的解决方案。我们用 classenum 定义着自己的世界模型。我们用 ForEach-Object -Parallel 冲破了单线程的束缚,感受着效率的狂飙。我们用 DSC 描绘着服务器配置的终极蓝图,从“如何做”的工匠,蜕变为“是什么”的架构师。我们为这一切,都加持了安全的封印,注入了最佳实践的灵魂,并用 Git 为我们的智慧成果,找到了永恒的归宿。

掩卷沉思,您学到的仅仅是 PowerShell 吗?不。您学到的是一种结构化的思维方式,一种将复杂问题分解为一系列有序、优雅步骤的能力。您学到的是一种自动化的核心理念,一种将重复、枯燥的劳动,转化为可靠、高效的智慧创造的哲学。您学到的是一种持续学习的工程素养,一种在面对未知系统时,通过 Get-CommandGet-HelpGet-Member 自我探索、自我驱动的专业精神。

这本书的结束,绝非您学习的终点,而恰恰是您真正精彩的 PowerShell 旅程的起点。世界在变,云原生、人工智能、物联网方兴未艾,新的模块、新的 API、新的挑战将层出不穷。但您已经掌握了最核心的“渔”,而非一时的“鱼”。您已经拥有了那把能够开启任何一扇自动化大门的钥匙。

现在,请合上书本,走到您的计算机前。那里有等待您去优化的流程,有等待您去整合的系统,有等待您去构建的自动化方案。去解决一个真实的问题,哪怕它很小。去编写一个能让您或同事每天节省十分钟的脚本。去将您今天学到的一个新知识点,应用到您的下一个项目中。

代码的生命在于运行,知识的价值在于应用。

请永远保持那份初见时的新奇,那份探索中的热情,那份精通后的谦逊。去社区提问,去 GitHub 分享,去博客撰文,去帮助那些像曾经的您一样,站在这扇大门前的好奇的探索者。在分享与交流中,您的技艺将愈发精纯。

感谢您,亲爱的读者,选择这本书,并坚持走到了最后。愿 PowerShell 成为您手中那把无往不利的瑞士军刀,助您在未来的职业生涯中,披荆斩棘,游刃有余。

前路浩荡,未来可期。现在,请开始谱写属于您自己的、独一无二的自动化史诗吧。