发布于 

PowerShell 入门教程推荐和常用代码片段

入门教程推荐

个人经验是:

先快速过一遍,大概知道用法后,然后就开始尝试做一些简单的内容,碰上不会的再查。

直接打算一开始就先 “学全” 是很难坚持下去的。

快速过一遍:PowerShell 在线教程 pstips.netPowerShell 101 | Microsoft Learn

也可以看一下官方的入门视频 快速入门 : PowerShell 3.0快速入门 : PowerShell 3.0 第 5 课

不清楚的命令细节在这里面查 什么是 PowerShell? | Microsoft LearnWindows PowerShell 帮助 (forsenergy.com)

要找已有的例子 PowerShell 技能连载 - 汇总索引 - 叹为观止 (vichamp.com)google.comstackoverflow.com

微软官方教程系列

文档教程:

什么是 PowerShell? - PowerShell | Microsoft Learn

PowerShell 101 | Microsoft Learn


视频教程:

PowerShell 3.0 入门 | Microsoft Learn

使用 PowerShell 3.0 编写高级工具和脚本 | Microsoft Learn

这个两个视频课程 B 站上有翻译过的

快速入门 : PowerShell 3.0【中文字幕】第 5 课没翻译

快速入门 : PowerShell 3.0 第 5 课:深入探讨管道【双语字幕】

PowerShell 教程:制作高级工具和脚本 【中文字幕】

个人博客类

PowerShell 技能连载 - 汇总索引 - 叹为观止 (vichamp.com)

PowerShell 方向的微软 MVP 吴波的博客,有很多 PowerShell 功能的示例代码片段


PowerShell 在线教程 – PowerShell 中文博客 (pstips.net)

比较简要地介绍了 PowerShell 的基础语法,有简单的示例演示。

想快速了解 PowerShell 基础语法可以先看这个,毕竟微软官方文档的确有点太长太全了。

其他网站

Windows PowerShell 帮助 (forsenergy.com)

一个包含了很多微软的帮助资料的网站,不止 PowerShell,全面到我以为是微软的,但是好像不是,微软官方的文档看不惯可以试试这个。

相关书籍

《Windows PowerShell 实战指南 第 3 版 (异步图书出品)》- 京东图书 (jd.com)

如果有京东会员的话,可以在京东电子书上免费看。

如果有知乎会员的话,也可以在知乎电子书上免费看。

PowerShell 工具

Windows PowerShell ISE

Windows 自带的 PowerShell 编辑工具,简单够用


Visual Studio Code

流行而且好用的轻量编辑器,配合各种插件体验极佳。

如果你要使用 VS Code 来写 PowerShell 脚本的话,注意保存的时候要把 .ps1 文件的编码改成 UTF-8 with BOM


SAPIEN PowerShell Studio 强大的 PowerShell GUI 设计器和脚本调试器 (sapien.com)

你可以在这个 SAPIEN PowerShell Studio 里面设计 GUI、打包成 exe、嵌入凭据。

常用代码片段

这里的话我放一些个人比较常用的片段,要参考的话,上面提到的吴波的博客里面的代码片段更多、更全。

我写在这里的代片段和吴波的博客里面的实现方法并不完全一致。

域失联修复

1
2
3
4
# 要在管理员下运行,输入的域账号也要是域的管理员权限

Reset-ComputerMachinePassword -Server "Domain.com" -Credential Domain\Admin

获取 IP 地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function Get-LocalIP
{
# 获取 本机IP 防止拿不到IP用了多次IP获取

# IP地址不为空的,网关也不为空的
$Local_IP_Temp = (
Get-WmiObject -Class Win32_NetworkAdapterConfiguration |
Where-Object { $NULL -ne $_.IPAddress -and $_.DefaultIPGateway -ne $Null } |
Select-Object IPAddress
).IPAddress[0]

# 按要求自行修改

# IP地址不为空的,网关符合 "*.*.*.1" 格式的
#$Local_IP_Temp = (
# Get-WmiObject -Class Win32_NetworkAdapterConfiguration |
# Where-Object { $NULL -ne $_.IPAddress -and $_.DefaultIPGateway -like "*.*.*.1" } |
# Select-Object IPAddress
#).IPAddress[0]

return $Local_IP_Temp
}


# 用法示例

$IP = Get-LocalIP
Write-Host $IP

操作 SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 函数 操作SQL
function Open-SQL {
# 传入SQL数据库名和SQL语句
param (
$SQL_Database_arg,
$SQL_Commandtext_arg
)

#配置SQL服务器信息
$SQL_Server = "192.168.x.x"
$SQL_UserName = "administrator"
$SQL_Password = "password"
$SQL_Database = $SQL_Database_arg
$SQL_Commandtext = $SQL_Commandtext_arg

#创建SQL连接对象
$SQL_Connection = New-Object System.Data.SqlClient.SqlConnection

#使用账号连接SQL
$SQL_Connection.ConnectionString = "Data Source=$SQL_Server; Initial Catalog=$SQL_Database; user id=$SQL_UserName; pwd=$SQL_Password"

#打开数据库连接
try {
$SQL_Connection.Open()
}
catch {
# 如果打开失败的话,提前返回 "Unable to open SQL" 无法打开SQL
return "Unable to open SQL"
}

#创建SQL命令对象
$SQL_Command = New-Object System.Data.SqlClient.SqlCommand
$SQL_Command.Connection = $SQL_Connection
$SQL_Command.Commandtext = $SQL_Commandtext

#创建DataSet和 SQL Server之间的桥接器
$SQL_DataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SQL_DataAdapter.SelectCommand = $SQL_Command

#创建DataSet
$Data_set = New-Object data.dataset
$SQL_DataAdapter.Fill($Data_set) | Out-Null
#$Data_set.Tables | Format-Table -Auto

#关闭数据库连接
$SQL_Connection.Close()

#----------------------

# 得到一份类似表的 DataRow 数据
$SQL_Data_Temp = $Data_set.Tables[0]

# 返回数据
return $SQL_Data_Temp
}


# 用法示例

# 获取SQL
$IP_SQL_info = Open-SQL -SQL_Database_arg "Auto_Install_Soft" -SQL_Commandtext_arg "SELECT * FROM dbo.Auto_Install_Soft WHERE [IP地址] = '$IP'"

# 更新SQL数据
Open-SQL -SQL_Database_arg "Auto_Install_Soft" -SQL_Commandtext_arg "UPDATE dbo.Auto_Install_Soft SET [排除安装] = '', [计划日期] = '2022-09-22', [最后限期] = '2022-12-30', [千牛] = 'True' WHERE [IP地址] = '$IP'"





改 IP 地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 要改的IP地址
$IP_address = "10.10.3.222"

# 要改的子网掩码
$Subnet_mask = "255.255.255.0"

# 要改的网关地址(这里是直接偷懒拿了IP地址,取了前3段,加上"1" 来生成的网关,可以直接定义 $Default_Gateway)
$IP_address -match "^\d+.\d+.\d+." | Out-Null
$Default_Gateway = $matches[0] + "1"

# 要改的DNS地址
$DnsOrderList = @("192.168.4.6", "192.168.4.7")

# 打印一次看看要改的内容
Write-Host $IP_address
Write-Host $Subnet_mask
Write-Host $Default_Gateway
Write-Host $DnsOrderList


Start-Sleep -Seconds 5


# 获取网卡, IP已启用,而且网关不为空
$Wmi_Win32_Network = Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -ne $False -and $_.DefaultIPGateway -ne $Null}

# 只有1张符合条件的网卡才会修改IP
if ($Wmi_Win32_Network.Count -eq 1) {
$Wmi_Win32_Network.EnableStatic($IP_address, $Subnet_mask)
$Wmi_Win32_Network.SetGateways($Default_Gateway, 1)
$Wmi_Win32_Network.SetDNSServerSearchOrder($DnsOrderList)

# 改完后60秒关机
Shutdown /s /t 60
}

# 用法示例

补充

我工作比较忙,有的时候我写的东西要隔一两周、甚至一两个月才能重新捡起来继续写,我命令都忘记怎么写了。

除非你真的很熟练,写的代码也很好理解,不然能多写点注释就多写一点。

不写注释,各种变量命名也偷懒乱取,时间一长再回来看就得花半天时间重新理解之前写的什么。


原文作者:tjxwork
原文链接:https://www.tjxblog.com/blog/2023-0002
发布时间:2023-01-19