欢迎各位兄弟 发布技术文章
这里的技术是共享的
powerShell的优势:
一、扩展性: import-module
在Windows Server 2012中,已经大量扩展了基础角色的管理命令。
二、易用性:
1.语法:命令由动词和名词组成,例如:
Get-EventLog
Set-Aduser
New-VM
2、利用Tab键自动补全命令。
3、PoxerShell快速入门]命令:
Get-command:支持通配符。
Get-Help: Windows Server 2012默认不包含详细信息,需要Update Help
4、自动向下兼容传命令行工具:利用别名实现,也可以自定义别名。
三、脚本的支持:可以在http://technet.microsoft com/zh-cn/的脚本中心获取脚本以及学习制作脚本
四、批量处理:灵活使用管道符“|”:
Get-ADUser | Where-0bject {$_.distinguishedname -ilike "*ou=sales, dc=adatum, dc=com" }| Enable-Mailbox -database "Mailbox Database 1"
五、轻松实现远程管理。
PS C:\Windows\system32> Import-Module ActiveDirectory #导入 AD 模块
PS C:\Windows\system32>
PS C:\Windows\system32>New-ADUser #新建 AD用户
来自 https://www.bilibili.com/video/BV1j44115727?p=2&vd_source=346847773d1f74962a4daab9ddf7f228 有大用
因为可能涉及到权限的问题,如下图,最好以管理员身份来运行 powershell
1) 算术运算计算
PS C:\Users\16666739> 1+1
2
PS C:\Users\16666739>
PS C:\Users\16666739> $var1=1
PS C:\Users\16666739> $var2=2
PS C:\Users\16666739> $var1+$var2
3
PS C:\Users\16666739>
comlet是一种在powershell中使用的命令,, 由.net库编写,命令规范遵循 动词-名称 的格式
# Get-Process 获取当前进程
# Set-Location 切换目录,
# Get-Process:获取当前运行的进程。
# Set-ExecutionPolicy:设置脚本执行策略。
# New-Item:创建新的项(如文件、文件夹等)。
comlet 返回的是 .net对象
poweshell ,,,get-aduser 获取 用户名为 11111111 的用户信息,以表格显示出来
Import-Module ActiveDirectory # 确保导入AD模块
# 使用Get-ADUser获取用户信息,并通过Format-Table(或别名ft)以表格形式显示
Get-ADUser -Filter "SamAccountName -eq '11111111'" | Format-Table Name, SamAccountName, UserPrincipalName, EmailAddress, DisplayName
旧版的cmd命令在powershell中通过别名链接到一个cmdlet命令,,,也有 linux 命令别名到cmdlet
别名
cd ---------------> Set-Location
ls ---------------> Get-ChildItem
PS C:\Users\16666739> Get-Alias cd
CommandType Name Version Source
----------- ---- ------- ------
Alias cd -> Set-Location
PS C:\Users\11111111>
PS C:\Users\16666739> Get-Alias #查看所有别名
CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias asnp -> Add-PSSnapin
Alias cat -> Get-Content
Alias cd -> Set-Location
Alias CFS -> ConvertFrom-String 3.1.0.0 Microsoft.PowerShell.Utility
Alias chdir -> Set-Location
Alias clc -> Clear-Content
PS C:\Users\11111111> Get-Command ls
CommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem #可以看出 ls 是别名
PS C:\Users\11111111>
PS C:\Users\16666739> Get-Command get-ad*
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-ADAccountAuthorizationGroup 1.0.1.0 ActiveDirectory
Cmdlet Get-ADAccountResultantPasswordReplicationPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADAuthenticationPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADAuthenticationPolicySilo 1.0.1.0 ActiveDirectory
Cmdlet Get-ADCentralAccessPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADCentralAccessRule 1.0.1.0 ActiveDirectory
Cmdlet Get-ADClaimTransformPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADClaimType 1.0.1.0 ActiveDirectory
Cmdlet Get-ADComputer 1.0.1.0 ActiveDirectory
Cmdlet Get-ADComputerServiceAccount 1.0.1.0 ActiveDirectory
Cmdlet Get-ADDCCloningExcludedApplicationList 1.0.1.0 ActiveDirectory
Cmdlet Get-ADDefaultDomainPasswordPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADDomain 1.0.1.0 ActiveDirectory
Cmdlet Get-ADDomainController 1.0.1.0 ActiveDirectory
Cmdlet Get-ADDomainControllerPasswordReplicationPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADDomainControllerPasswordReplicationPolicy... 1.0.1.0 ActiveDirectory
Cmdlet Get-ADFineGrainedPasswordPolicy 1.0.1.0 ActiveDirectory
Cmdlet Get-ADFineGrainedPasswordPolicySubject 1.0.1.0 ActiveDirectory
Cmdlet Get-ADForest 1.0.1.0 ActiveDirectory
Cmdlet Get-ADGroup 1.0.1.0 ActiveDirectory
Cmdlet Get-ADGroupMember 1.0.1.0 ActiveDirectory
Cmdlet Get-ADObject 1.0.1.0 ActiveDirectory
Cmdlet Get-ADOptionalFeature 1.0.1.0 ActiveDirectory
Cmdlet Get-ADOrganizationalUnit 1.0.1.0 ActiveDirectory
Cmdlet Get-ADPrincipalGroupMembership 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationAttributeMetadata 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationConnection 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationFailure 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationPartnerMetadata 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationQueueOperation 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationSite 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationSiteLink 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationSiteLinkBridge 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationSubnet 1.0.1.0 ActiveDirectory
Cmdlet Get-ADReplicationUpToDatenessVectorTable 1.0.1.0 ActiveDirectory
Cmdlet Get-ADResourceProperty 1.0.1.0 ActiveDirectory
Cmdlet Get-ADResourcePropertyList 1.0.1.0 ActiveDirectory
Cmdlet Get-ADResourcePropertyValueType 1.0.1.0 ActiveDirectory
Cmdlet Get-ADRootDSE 1.0.1.0 ActiveDirectory
Cmdlet Get-ADServiceAccount 1.0.1.0 ActiveDirectory
Cmdlet Get-ADTrust 1.0.1.0 ActiveDirectory
Cmdlet Get-ADUser 1.0.1.0 ActiveDirectory
Cmdlet Get-ADUserResultantPasswordPolicy 1.0.1.0 ActiveDirectory
PS C:\Users\16666739>
PS C:\Users\16666739> Get-ADComputer -filter *
PS C:\Users\16666739> Get-aduser -filter *
PS C:\Users\16666739> get-aduser -filter *
PS C:\Users\16666739> Get-ADUser -Filter "DistinguishedName -like '1111111*'"
PS C:\Users\16666739> Get-ADUser -Filter "DistinguishedName -like '*1111111*'"
PS C:\Users\16666739>
# Get-Process #获取所有进程
# Sort-Object CPU -Descending #根据cpu的时间进行倒序排序
# Select-Object -First 5 #是获取前5个对象
PS C:\Users\16666739> Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 #获取cpu占用率最高的前5个进程
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
1825 91 402920 268220 975.38 14384 1 chrome
9638 0 196 1060 797.31 4 0 System
928 40 695192 659376 686.64 15216 1 chrome
545 26 865308 811052 677.81 3644 1 chrome
3897 153 262480 211192 567.94 9672 1 chrome
PS C:\Users\16666739>
PS C:\Users\shipingzhong> Get-ChildItem $env:windir -Filter *.exe | Measure-Object -sum Length
#求出 C:\windows 下的 exe 文件的大小之和
Count : 12
Average :
Sum : 11062184
Maximum :
Minimum :
Property : Length
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> Import-Csv data.csv | Where-Object {$_.age -gt 30} | ConvertTo-Html | Out-File output.html
PS C:\Users\shipingzhong>
# Import-Csv data.csv #读取data.csv
# Where-Object {$_.age -gt 30} #筛选出年龄大于30岁的用户
# ConvertTo-Html #转换成html格式
# Out-File output.html #输出成output.html文件
CMD的脚本语会扩展名是.bat文件
PowerShell的扩展名是.ps15文件
bat 文件不友好
powershell代码比较友好
PS C:\Users\shipingzhong> Get-Command #获取powershell所有的命令
CommandType Name Version Source
----------- ---- ------- ------
Alias Add-AppPackage 2.0.1.0 Appx
Alias Add-AppPackageVolume 2.0.1.0 Appx
Alias Add-AppProvisionedPackage 3.0 Dism
PS C:\Users\shipingzhong> Update-Help #更新命令的帮助文档
PS C:\Users\shipingzhong> Get-Help Get-Command #获取单个命令 Get-Command 的帮助文档
名称
Get-Command
语法
Get-Command [[-ArgumentList] <Object[]>] [<CommonParameters>]
Get-Command [[-Name] <string[]>] [[-ArgumentList] <Object[]>] [<CommonParameters>]
别名
gcm
备注
Get-Help 在此计算机上找不到该 cmdlet 的帮助文件。它仅显示部分帮助。
-- 若要下载并安装包含此 cmdlet 的模块的帮助文件,请使用 Update-Help。
-- 若要联机查看此 cmdlet 的帮助主题,请键入: "Get-Help Get-Command -Online" 或
转到 https://go.microsoft.com/fwlink/?LinkID=113309。
PS C:\Users\shipingzhong>
与 linux 完全相同的命令
PS C:\Users\shipingzhong> pwd #输出当前的工作目录
Path
----
C:\Users\shipingzhong
PS C:\Users\shipingzhong> Get-Alias pwd #查看pwd是哪个命令的别名
CommandType Name Version Source
----------- ---- ------- ------
Alias pwd -> Get-Location
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> ls #列出当前目录的文件和文件夹
目录: C:\Users\shipingzhong
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/6/29 11:40 .cisco
d----- 2024/6/29 11:53 .config
d----- 2024/6/29 22:45 .vscode
d----- 2024/6/30 1:15 .WebIde90
d-r--- 2024/6/29 9:43 3D Objects
d-r--- 2024/6/29 9:43 Contacts
d-r--- 2024/9/16 16:05 Desktop
d-r--- 2024/9/18 21:06 Documents
d-r--- 2024/9/16 15:22 Downloads
d-r--- 2024/6/29 9:43 Favorites
d----- 2024/6/29 10:30 Intel
d-r--- 2024/6/29 9:43 Links
d-r--- 2024/6/29 9:43 Music
d-r--- 2024/6/29 14:23 OneDrive
d----- 2024/7/17 20:07 OpenVPN
d-r--- 2024/6/29 13:19 Pictures
d----- 2024/8/3 19:43 PycharmProjects
d----- 2024/7/14 21:42 sangfor
d-r--- 2024/6/29 9:43 Saved Games
d-r--- 2024/7/7 11:25 Searches
d-r--- 2024/6/30 12:55 Videos
-a---- 2024/9/18 21:06 32 data.csv
-a---- 2024/6/29 20:35 475 my.js
-a---- 2024/9/18 21:06 762 output.html
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> clear #清屏命令
PS C:\Users\shipingzhong> cat data.csv #cat文件,查看data.csv文件的内容
Age
20
30
40
50
60
70
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> mkdir 测试2 #新建文件夹 "测试2"
目录: C:\Users\shipingzhong
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/9/18 21:28 测试2
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> mv .\data.csv 测试2 #把 data.csv 移动到 "测试2"文件夹
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> cp .\测试2\data.csv ./ #把 ".\测试2\data.csv" 复制到当前目录下
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> rm .\data.csv #删除文件
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> ps | Export-csv test1.csv #把所有进程输出到test1.csv 文件里面
PS C:\Users\shipingzhong> ps | Export-Csv -Path test.csv #这个命令里多出一个-path ,似乎不理想,界面一直在等待
PS C:\Users\shipingzhong> ps | ConvertTo-Html > test.html #输出为 test.html文件
PS C:\Users\shipingzhong>
PowerShell入门
01 | PowerShell编程基础
02| 对象与.NET
03 | Cmdlets与Pipeline
04 | 高级编程
05 | 模块创建
PowerShell编程基础
变量
●
运行时数据的存储
数据结构
●运行时数据的组织
控制结构
程序流控制
变量
●运行时数据的存储
-如:计算结果,字符串等
●PowerShell 是动态类型
●$<变量名> = <值>
-例子: $surname = "John'
$length = 32
变量名称不区分大小写
预定义变量
●$null ---> 空值
●$true ---> 真值为真
●$false ---> 真值为假
●$_ ---> 当前处理的元素
创建 @(<元素>,<元素>,...)
索引 <数组>[<索引>]
运用赋值操作符,可将数组元素添加到对应的位置
因为 powershell 是动态类型,所以 powershell 数组可以储存不同类型的数据,如数字,字符串
powershell中数组的索引是从零开始
哈希表通过键值对来组织数据
我们不需要事先知道哈希表的大小
创建 -> @{<键> = <值>;...}
索引 -> <哈希表>[<键>]
括号里用赋值操作符给键值对赋值 ,, 用分号或者换行来分隔键值对
数据结构的索引也是用变量名后加方括号 ,, 但不同于数组,方括号里不添加下标,而是对应的键名
PS C:\Windows\system32> $var = 5
PS C:\Windows\system32> $var
5
PS C:\Windows\system32> $var.GetType() #获取变量的类型信息
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
PS C:\Windows\system32>
PS C:\Windows\system32> $var = "Hello world" #将变量赋为字符串类型
PS C:\Windows\system32> $var.GetType() #获取变量的类型信息
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\Windows\system32>
PS C:\Windows\system32> $uninitalized # 未赋值,自动初始化为$null
PS C:\Windows\system32> $uninitalized -eq $null
True
PS C:\Windows\system32> $uninitalized -eq 0 #与0比较,结果为假
False
PS C:\Windows\system32>
PS C:\Windows\system32> $a = @('john',42,'jane') #定义数组,里面的字符串可为单引号或双引号
PS C:\Windows\system32> $a[0]
john
PS C:\Windows\system32>
PS C:\Windows\system32> $a[0] = "jenny" #给数组元素赋值
PS C:\Windows\system32> $a #逐行输出数组的所有值,
jenny
42
jane
PS C:\Windows\system32>
PS C:\Windows\system32> $person = @{name="john";age=12} #定义哈希表,每个元素以键值对的形式表示,每个元素以分号分隔
PS C:\Windows\system32> $person['name'] #以变量名后面加上方括号取一个元素的值
john
PS C:\Windows\system32> $person.age #以变量名后面加上点来取一个元素的值
12
PS C:\Windows\system32> $person.age = 33 #给哈希表某一个元素赋值
PS C:\Windows\system32> $person.age
33
PS C:\Windows\system32>
控制结构-分支
●程序流的控制
-lf-Else分支
- Switch语句.
控制结构-lf-Else
, 或条件决定后面语句的进一步执行
If (<条件>)
{
<语句>
}
ElseIf (<条件>)
{
<语句>
}
Else
{
<语句>
}
控制结构-Switch
●值决定后面语句的进一 步执行
Switch (<表达式>)
{
<测试值> { <语句> ;break}
Default { <语句> }
}
使用 visual studio code 开发工具 安装 powershell 扩展
$_ 美元符下划线,在 switch 语句中,指的是当前的测试的变量的值
$_ 美元符下划线,在 循环或迭代语句中, 通过 $_ 的属性 可以获取当前的迭代数,当前的元素等
控制结构~循环
条件
语句
语句
控制结构循环
条件
语句
语句
控制结构-For循环
For (<开始值>; <循环条件>; <迭代步骤>) { <语句> }
-例子:For($i=0;$i-1t10;i++)
{
...
}
ForEach (<元素> in <集合>) { <语句> }
-例子: ForEach ($number in $NumbersArray )
{
...
}
控制结构-While循环
While (<循环条件>) { <语句> }
-例子: While ($something -eq $true)
{
...
}
Do
{ <语句> } While |Until (<循环条件>)
例子: Do
{
...
} While ($something -eq $true )
Do
{
...
} Until ($something -eq $true)
示例
来自 https://www.bilibili.com/video/BV1yb411g7n7?p=1&vd_source=346847773d1f74962a4daab9ddf7f228 有大用
章节概览
对象与.NET
类与对象
●PowerShell是面向对象的
.NET
●
访问.NET类
PowerShell中的类
●自定义类
powershell 是基于对象,而不是基于文本的,,,通过 pipeline 传递到下一个的是对象,而不是文本
对象通过 点 加上属性名来访问对象的属性,这与哈希表一样
什么是对象?
●
, 对象.属性
●
, 对象.方法()
●
对象.方法(参数1,参数2)
PS C:\Users\shipingzhong> Get-Location #返回当前目录,,, 类似于 # cd 命令
# 但是 Get-Location 返回的是一个对象,,,Path 是它的一个属性,,这个命令显示为一个表格
#有些 cmdlet 的命令 的结果显示为一个列表
Path
----
C:\Users\shipingzhong
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> $location = Get-Location
PS C:\Users\shipingzhong> $location.Path #通过 点 加上属性来访问属性的值
C:\Users\shipingzhong
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> $location | gm # gm 是 GET-Member 的别名
TypeName:System.Management.Automation.PathInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Drive Property System.Management.Automation.PSDriveInfo Drive {get;}
Path Property string Path {get;}
Provider Property System.Management.Automation.ProviderInfo Provider {get;}
ProviderPath Property string ProviderPath {get;}
PS C:\Users\shipingzhong>
System.Management.Automation.PathInfo 是 .net 框架中的一个类
PS C:\Users\shipingzhong> $location.Drive #它的Drive 属性,,,它含用关于底层驱动器目录的信息,,,它作为一个表格来显示,说明这个信息是一个对象的属性
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
C 301.81 98.19 FileSystem C:\ Users\shipingzhong
PS C:\Users\shipingzhong>
PowerShell中使用.NET
●完全访问.NET框架类
●
New-Object 创建对象
- New-Object <类型名> <构造函数参数>
PowerShell中使用.NET
访问类通过[<类型名>]
-例如: [System.Version]
类型转换
-例如: [System.Version] "1.0.3.4"
●访问类的静态元素
-类方法枚举,
-例如: [System.Version]::New0
(Ssystem.ConsoleColor::Red
来自 https://learn.microsoft.com/de-de/dotnet/api/system.version?view=net-8.0 有大用
PowerShell的类
●PowerShellv5.0-自定义类
新关键字
- Class
- Enum
- Static
一...
New-Object
PS C:\Windows\system32> $version = New-Object System.Version #创建对象
PS C:\Windows\system32> $version
Major Minor Build Revision
----- ----- ----- --------
0 0 -1 -1
PS C:\Windows\system32>
PS C:\Windows\system32> $version= New-Object System.Version 3,6 #创建对象
PS C:\Windows\system32> $version
Major Minor Build Revision
----- ----- ----- --------
3 6 -1 -1
PS C:\Windows\system32>
PS C:\Windows\system32> [System.Version]::New() #创建对象
Major Minor Build Revision
----- ----- ----- --------
0 0 -1 -1
PS C:\Windows\system32>
PS C:\Windows\system32> [System.Version]::New(3,6) #另一种方法来创建对象
Major Minor Build Revision
----- ----- ----- --------
3 6 -1 -1
PS C:\Windows\system32>
PS C:\Windows\system32> $version = New-Object System.Version 3,6
PS C:\Windows\system32> $version.ToString() #对象的ToString 方法
3.6
PS C:\Windows\system32>
PS C:\Windows\system32> [Int] 1.7 #类型转换 左方括号 类名 右方括号 加上参数
2
PS C:\Windows\system32>
PS C:\Windows\system32> [System.Version]"2.0.1.3" #字符串转换为 .net类 (System.Version类) 的对象
Major Minor Build Revision
----- ----- ----- --------
2 0 1 3
PS C:\Windows\system32>
PowerShell的类
●PowerShellv5.0 →自定义类
●新关键字
- Class
- Enum .
-Static
-...
●New-Object
class <类名>
{
<hidden | static>
[<类型名>]$<属性名>
<hidden| static>
<构造函数名>(<参数>,...)
{...}
<hidden| static>
[<返回类型>]<方法名>(<参数>,...)
{...}
}
PowerShell枚举
为什么结果是 SoftwareVersion 而不是 1 见 /node-admin/21549
课程概览
PowerShell入门
01|PowerShell编程基础
02| 对象与.NET
●对象
●类
●访问 .NET类
03 | Cmdlets与Pipeline
章节概览
Cmdlets 与Pipeline
Cmdlets
PowerShell命令/函数
Pipeline
● 连接Cmdlets
重要的Cmdlets与操作符
● ForEach, Where, Select, -Replace, -Join
脚本
● Windows版本字符串的格式化输出
什么是Cmdlets?
●可执行命令/PowerShell中的函数
●[<动词>-<名词>] [-<参数> <值>]
- Get-Content -Path 'C:\Logs\Log-040191.bxt'
- Set-ADAccountPassword -ldentity 'John' -NewPassword
#Get-Verb #获取所有可用的动词列表。
Begin 里面的代码初始化
End 最终执行一次
Process 代码块里面的所有指令都将对每一个通过pipeliine接收的的对象执行一次,,,通过变量 $_ (美元符下划线 ) 来访问当前处理的元素
ForEach-Object
● 迭代对象
● -Begin, -Process, -End
● ForEach, For, %
'You',Me'| ForEach-Object { "Say $_" }
=> Say You
Say Me
# ForEach, For, 百分号% ,,这三个都是别名 ,,但是我见到的例子 只看到 百分号 % 别名
ForEach-Object 详解 见 /node-admin/21673
Where-Object
● 筛选对象
● Where, ?
'You', 'Me' | Where-Object { $_ -match 'u' }
=> You
# Where, 问号 ? ,,这两个都是别名 ,,但是我见到的例子 只看到 问号 ? 别名
# $_ -match 'u' 它的结果为 真 True 或 假 False, 表示 $_ 包含 字符串 u ,,这是一个正则表达式的匹配吧
# Where-Object 表示筛选出 $_ -match 'u' 为 True 的对象
Select-Object
● 选择对象/属性
● -First, -Last, -Skip, -SkipLast, -Property, -Unique,
-ExpandProperty
● Select
Get -ComputerInfo | Select-Object - ExpandProperty OsName
=> Microsoft Windows 10 Enterprise
#Select 是 Select-Object 的别名
Select-Object 详解 见 /node-admin/21674
-Replace
● 搜索或替换字符串中的文本
● 支持正则表达式
'i like tea' -replace 'tea','coffee'
=> ilike coffee
'i like tea' -replace '\s','_'
=> i_ like_ _coffee
# '\s' 在正则表达式中,表示空格
-Join
连接字符串
支持插入分隔符
-join ('a','b','c')
=>abc
127','0','0','1' -join '.'
=> 127.0.0.1
# -join ('a','b','c') ,,,,因为-join 优先级比 逗号,高,所以 后面的 'a','b','c' 要用括号括起来
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 #没有就是 $nulll 相当于 -ShowBuild $false
Windons 10/Mindows Server 2016
Mindows 8.1/Mindows Server 2012R2
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild $false
Windows 10/Windows Server 2016
Windows 8.1/Windows Server 2012R2
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild $true
Windows 10/Windows Server 2016 Build 0
Windows 8.1/Windows Server 2012R2 Build 0
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild 1
Windows 10/Windows Server 2016 Build 0
Windows 8.1/Windows Server 2012R2 Build 0
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild
C:\Users\shipingzhong\Desktop\pw\Format-WindowsVesion.ps1 : 缺少参数“ShowBuild”的某个参数。请指定一个类型为“System.Object”的参数,然后再试一次。
所在位置 行:1 字符: 51
+ "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -ShowBuild
+ ~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Format-WindowsVesion.ps1],ParameterBindingException
+ FullyQualifiedErrorId : MissingArgument,Format-WindowsVesion.ps1
PS C:\Users\shipingzhong\Desktop\pw>
PS C:\Windows\system32> Get-WmiObject win32_operatingSystem
SystemDirectory : C:\Windows\system32
Organization :
BuildNumber : 19045
RegisteredUser : shipingzhong
SerialNumber : 00331-10000-00001-AA518
Version : 10.0.19045
PS C:\Windows\system32>
PS C:\Windows\system32> Get-WmiObject win32_operatingSystem | Select-Object -expandproperty Version
10.0.19045
PS C:\Windows\system32>
# Get-WmiObject win32_operatingSystem | Select-Object -expandproperty Version | .\Format-WindowsVesion.ps1
来自 https://learn.microsoft.com/en-us/windows/win32/sysinfo/operating-system-version 有大用
PowerShell 入门
02|对象与.NET
03|Cmdlets与Pipeline
Cmdlets
Pipeline
ForEach-Object, Where-Object, Select-Object
-Replace 与-Join
脚本编写
04高级编程
来自 https://www.bilibili.com/video/BV1yb411g7n7?p=3 有大用
章节概览
高级编程
高级函数
定义与使用
结构与语法
元素与属性
通用参数,风险缓解参数,参数验证
从脚本到 Cmdlet
脚本的调整与扩展
什么是高级函数?
脚本/函数 →Cmdlet
- 参数验证
- 通用参数
- 风险缓解参数
- ...
什么是高级函数?
· [CmdletBinding()] 属性 #要启用高级函数,就要指定 [CmdletBinding()]属性 ,,,,[CmdletBinding()]
是 PowerShell 中的一个属性,用于将函数提升为高级函数(Advanced Function),
. Param Block
(
...
)
通用参数 #激活 [CmdletBinding()] 属性,下面的参数可以自动供用户使用
. -Verbose -> Write-Verbose
. -Debug -> Write-Debug
. -ErrorAction
- Continue
- SilentlyContinue
- Inquire
- Stop
- ...
风险缓解参数
. -Whatlf与-Confirm # Whatlf查看将要执行的操作,不实际执行,,,Confirm,确认是否真的执行
. [CmdletBinding(supportsShouldProcess)] #当使用 风险缓解参数-Whatlf与-Confirm 时,不能仅使用 [CmdletBinding()],而应该使用 [CmdletBinding(supportsShouldProcess)]
. If($PSCmdlet.shouldProcess(<目标>,<操作>))
# $PSCmdlet 是内置的变量(对象),,,,$PSCmdlet.shouldProcess 是内置变量(对象)的方法
#在Whatif的情况下,永远返回假,不执行操作,仅仅是查看操作的输出
#<目标>,<操作> 是两个字符串
#在Confirm的情况下,会有一个让用户确认的交互,以确定程序是否继续执行
. If($PSCmdlet.shouldProcess(<目标>,<操作>))
{
<关键语句>
}
参数配置
# 用属性来装饰参数
. [Parameter()]属性
. [<Typ>]期望的类型
. $<Name>参数名
参数一属性
. [Parameter(Mandatory =<$false $true>)]
- $false →可选的 #不指定值的时候,也是不强制(Mandatory)的,相当于$false,,,未指定Mandatory ,也相当于不强制
- $true →必需的
参数一属性
. [Parameter(Position =<Int>)] # 位置参数,可以理解为 (参数名 值) 仅为参数名 或仅为值
-从0开始
. 无需明确指定形参来分配传递的实参
参数一属性
. [Parameter(ValueFromPipeline = <$false $true>)]
- $false →不接受
- $true →接受
无需明确指定形参来通过pipeline分配传递的实参
参数验证
. [Validateset(<元素>,<元素>,...)]
. [ValidateLength(<最小值>,<最大值>)]
. [ValidateRange(<最小值>,<最大值>)]
. [ValidateScript({<表达式>})]
. [ValidatePattern(<正则表达式>)]
PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0" | .\format-windowsversion.ps1
Windows 10/Windows Server 2016
Windows 8.1/Windows Server 2012R2
PS C:\Users\16666739\Desktop\pw>
PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0" | .\format-windowsversion.ps1 -verbose
详细信息: Processing Version String 10.0.0.0
详细信息: Convertingto System.Version Object
详细信息: Derivating actual OS from Object
Windows 10/Windows Server 2016
详细信息: Processing Version String 6.3.0.0
详细信息: Convertingto System.Version Object
详细信息: Derivating actual OS from Object
Windows 8.1/Windows Server 2012R2
PS C:\Users\16666739\Desktop\pw>
PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0" | .\format-windowsversion.ps1 -verbose -Showbuild $true
详细信息: Processing Version String 10.0.0.0
详细信息: Convertingto System.Version Object
详细信息: Derivating actual OS from Object
Windows 10/Windows Server 2016 Build 0
详细信息: Processing Version String 6.3.0.0
详细信息: Convertingto System.Version Object
详细信息: Derivating actual OS from Object
Windows 8.1/Windows Server 2012R2 Build 0
PS C:\Users\16666739\Desktop\pw>
PS C:\Users\16666739\Desktop\pw> "10.0","6.3..0" | .\format-windowsversion.ps1 -verbose -Showbuild $true
C:\Users\16666739\Desktop\pw\format-windowsversion.ps1 : 无法对参数“VersionString”执行参数验证。参数“10.0”
与模式“^(\d+\.){3}\d+$”不匹配。请提供一个与“^(\d+\.){3}\d+$”匹配的参数,然后重试此命令。
所在位置 行:1 字符: 20
+ ... .0","6.3..0" | .\format-windowsversion.ps1 -verbose -Showbuild $true
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (10.0:String) [format-windowsversion.ps1],ParameterBindingValidati
onException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,format-windowsversion.ps1
C:\Users\16666739\Desktop\pw\format-windowsversion.ps1 : 无法对参数“VersionString”执行参数验证。参数“6.3..0
”与模式“^(\d+\.){3}\d+$”不匹配。请提供一个与“^(\d+\.){3}\d+$”匹配的参数,然后重试此命令。
所在位置 行:1 字符: 20
+ ... .0","6.3..0" | .\format-windowsversion.ps1 -verbose -Showbuild $true
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (6.3..0:String) [format-windowsversion.ps1],ParameterBindingValida
tionException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,format-windowsversion.ps1
PS C:\Users\16666739\Desktop\pw>
PS C:\Users\16666739\Desktop\pw> "10.0.0.0","6.3.0.0" | .\format-windowsversion.ps1 -verbose -Showbuild #我们只需要参数名 -Showbuild ,不需要参数值 $true,,,,,, 我们代码中的 , [Switch]$ShowBuild 参数的值就是 $true,,,因为我们的 $ShowBuild 是 Switch类型(即开关类型)
详细信息: Processing Version String 10.0.0.0
详细信息: Convertingto System.Version Object
详细信息: Derivating actual OS from Object
Windows 10/Windows Server 2016 Build 0
详细信息: Processing Version String 6.3.0.0
详细信息: Convertingto System.Version Object
详细信息: Derivating actual OS from Object
Windows 8.1/Windows Server 2012R2 Build 0
PS C:\Users\16666739\Desktop\pw>
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -Whatif #Whatif 只是查看要执行的哪些操作,并没有真正的执行
WhatIf: 正在目标“10.0.0.0”上执行操作“Convert”。
WhatIf: 正在目标“10.0.0.0”上执行操作“Derivate OS”。
WhatIf: 正在目标“6.3.0.0”上执行操作“Convert”。
WhatIf: 正在目标“6.3.0.0”上执行操作“Derivate OS”。
PS C:\Users\shipingzhong\Desktop\pw>
PS C:\Users\shipingzhong\Desktop\pw> "10.0.0.0","6.3.0.0" | .\Format-WindowsVesion.ps1 -Confirm #Confirm 确认是否执行
确认
是否确实要执行此操作?
正在目标“10.0.0.0”上执行操作“Convert”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”): Y
确认
是否确实要执行此操作?
正在目标“10.0.0.0”上执行操作“Derivate OS”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”): Y
Windows 10/Windows Server 2016
确认
是否确实要执行此操作?
正在目标“6.3.0.0”上执行操作“Convert”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”): Y
确认
是否确实要执行此操作?
正在目标“6.3.0.0”上执行操作“Derivate OS”。
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“Y”): Y
Windows 8.1/Windows Server 2012R2
PS C:\Users\shipingzhong\Desktop\pw>
来自 https://www.bilibili.com/video/BV1yb411g7n7?p=4&vd_source=346847773d1f74962a4daab9ddf7f228 有大用
课程概览
PowerShell入门
01|PowerShell编程基础
02|对象与.NET
03|Cmdlets与Pipeline
04|高级编程
05|创建PowerShell模块
章节概览
PowerShell编程基础
模块的结构和使用
模块的创建和导入
模块清单
什么是PowerShll模块?
● 集合相关的PowerShell功能
- Cmdlets
- 变量
- 别名
●●●
模块vs 脚本
● 模块的优点
-多个相关的任务/函数
-提供组合功能
-易于分发
-重用
● 脚本和模块的结合
模块的结构
●文件夹<模块名>→文件<模块名>. psm1 #模块扩展名是 .psm1,,存在于同名文件夹中,(即文件夹名与模块文件名同名)
●定义和实现
- Cmdlets
- 函数
- 变量
- 别名
模块清单(可选)
模块清单
文件夹 <模块名>→文件<模块名>.psd1
● 包含模块信息的键值对
- 作者,说明,模块版本...
- PowerShell 版本,.NET 版本,依赖性...
-功能导出
● New-ModuleManifest
#模块清单的扩展名为 .psd1
导入模块
● Import-Module <名称/路径> #导入模块
● $PSModulePath #这个目录下的模块不需要指定完整路径,只需要模块名称就行了
● Get-Module #获取加载到当前上下文当中的所有模块
C:\Users\my\Desktop\WindowsVersion\WindowsVersion.psm1 文件 #模块文件必须与它所有的文件夹名称相同
PS C:\Users\16666739\Desktop\WindowsVersion> pwd
Path
----
C:\Users\16666739\Desktop\WindowsVersion
PS C:\Users\16666739\Desktop\WindowsVersion> dir
目录: C:\Users\16666739\Desktop\WindowsVersion
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/10/3 14:04 120 test.ps1
-a---- 2024/10/3 13:35 1621 WindowsVersion.psm1
PS C:\Users\16666739\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psm1 #导入模块
PS C:\Users\16666739\Desktop\WindowsVersion> Get-Module
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest 3.0.0.0 Microsoft.PowerShell.Security {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-Au...
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script 0.2.0 PowerShellEditorServices.Commands {Clear-Host, ConvertFrom-ScriptExtent, ConvertTo-ScriptExtent, Fin...
Script 2024.7.0 PowerShellProTools {ConvertTo-WinForm, Merge-Script, Show-WinFormDesigner, Expand-Obj...
Binary 0.0.1 PowerShellProTools.VSCode {Add-VSCodeTextDocumentText, Clear-VSCodeDecoration, Get-Completio...
Script 2.4.0 PSReadLine {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLine...
Script 0.0 WindowsVersion Format-WindowsVersion #看到 WindowsVersion 模块已经导入到当前的 powershell 上下文中,,, WindowsVersion 模块已经导出了 ormat-WindowsVersion CmdLet
PS C:\Users\16666739\Desktop\WindowsVersion>
PS C:\Users\16666739\Desktop\WindowsVersion> "10.0.0.0" | Format-WindowsVersion
Windows 10/Windows Server 2016
PS C:\Users\16666739\Desktop\WindowsVersion>
因为模块已经加载到内存中了,,又由于我们在硬盘上修改了模块,所以必须强制 powershell 重新读取模块(强制导入)
PS C:\Users\16666739\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psm1 -Force #强制导入
PS C:\Users\16666739\Desktop\WindowsVersion> Get-Module
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest 3.0.0.0 Microsoft.PowerShell.Security {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-Au...
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script 0.2.0 PowerShellEditorServices.Commands {Clear-Host, ConvertFrom-ScriptExtent, ConvertTo-ScriptExtent, Fin...
Script 2024.7.0 PowerShellProTools {ConvertTo-WinForm, Merge-Script, Show-WinFormDesigner, Expand-Obj...
Binary 0.0.1 PowerShellProTools.VSCode {Add-VSCodeTextDocumentText, Clear-VSCodeDecoration, Get-Completio...
Script 2.4.0 PSReadLine {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLine...
Script 0.0 WindowsVersion {Format-WindowsVersion, Get-WindowsVersion} #可以看到第二个函数 Get-WindowsVersion 也在导出的功能列表中,,,Get-WindowsVersion 同样是一个CmdLet
PS C:\Users\16666739\Desktop\WindowsVersion>
PS C:\Users\16666739\Desktop\WindowsVersion> Get-WindowsVersion | Format-WindowsVersion #执行这两个自定义的comlet 通过管道把第一个 comlet 的输出 作为 第二个comlet的输入 #获取系统的版本字符串,然后格式化输出
Windows 10/Windows Server 2016
PS C:\Users\16666739\Desktop\WindowsVersion>
PS C:\Users\16666739\Desktop\WindowsVersion> Get-Help New-ModuleManifest -Online #查看 New-ModuleManifest cmdlet 的帮助 ,Online 表示在浏览器中在线打开帮助文档
PS C:\Users\16666739\Desktop\WindowsVersion>
PS C:\Users\shipingzhong\Desktop\WindowsVersion> New-ModuleManifest -author "shipinzhong" -companyname "lixun" -description "windows version string module"
位于命令管道位置 1 的 cmdlet New-ModuleManifest
请为以下参数提供值:
Path: WindowsVersion.psd1 #没有 path 参数,自动进入交互式模式,输入 模块清单文件名称(或者路径???) #模块清单文件名称以 .psd1 结尾,模块清单文件名称并且必须与模块文件名称相同
PS C:\Users\shipingzhong\Desktop\WindowsVersion>
C:\Users\shipingzhong\Desktop\WindowsVersion\WindowsVersion.psd1 #不完整的版本
PS C:\Users\shipingzhong\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psd1 -force # 从模块清单导入模块,,,,,,-force 强制导入
PS C:\Users\shipingzhong\Desktop\WindowsVersion> get-Module -name WindowsVersion #此时,看到 导出命令(ExportedCommands) 中的内容为空,,因为模块文件中
FunctionsToExport = @() 它为空 # get-Module -name WindowsVersion
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.0 WindowsVersion
PS C:\Users\shipingzhong\Desktop\WindowsVersion>
C:\Users\shipingzhong\Desktop\WindowsVersion\WindowsVersion.psd1 #最终版本
PS C:\Users\shipingzhong\Desktop\WindowsVersion> Import-Module .\WindowsVersion.psd1 -force # 从模块清单强制重新加载模块(导入模块)
PS C:\Users\shipingzhong\Desktop\WindowsVersion> get-Module -name WindowsVersion # 看到了ExportCommand 中 不为空了 (导出了 CmdLet 有 Format-WindowsVersion, Get-WindowsVersion)
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Script 1.0 WindowsVersion {Format-WindowsVersion, Get-WindowsVersion}
PS C:\Users\shipingzhong\Desktop\WindowsVersion>
为了让我们做的这个模块在全局范围内可用,,我们可以将它整个模块文件夹 移动到环境变量 $PSModulePath ($env:PSModulePath )下列出的目录之一,,,或者也可以将这个模块文件夹所在的目录 增加到环境变量 $PSModulePath 中
PS C:\Windows\system32> $env:PSModulePath #查看环境变量
C:\Users\shipingzhong\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
PS C:\Windows\system32>
其中 C:\Windows\system32\WindowsPowerShell\v1.0\Modules 包含特定于windows的系统模块,,该目录不应该用于自己的用户模块,,,,,自己的用户模块只能通过用户文件夹中相应路径分发给特定用户,,,,,,,为了使模块可以被全局使用,,我们可以将 C:\Users\shipingzhong\Desktop\WindowsVersion 模块 复制到 C:\Program Files\WindowsPowerShell\Modules 目录(属于$PSModulePath的路径)下面
模块里有两个文件:模块文件和清单文件
复制模块文件到 到 C:\Program Files\WindowsPowerShell\Modules 下面
PS C:\Windows\system32> get-module
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script 2.0.0 PSReadline {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...
PS C:\Windows\system32> Import-Module WindowsVersion #发生报错,可以执行下面的一行命令,,详情见 /node-admin/21706 /node-admin/21676
Import-Module : 无法加载文件 C:\Program Files\WindowsPowerShell\Modules\WindowsVersion\WindowsVersion.psm1,因为在此系
统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ Import-Module WindowsVersion
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [Import-Module],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess,Microsoft.PowerShell.Commands.ImportModuleCommand
PS C:\Windows\system32> Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Unrestricted
执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170 中的
about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”): A
PS C:\Windows\system32>
#这是新复制到 C:\Program Files\WindowsPowerShell\Modules 的模块,所以要导入一下,,, 当然重启后,再打开powershell窗口,就无须再导入了,,,,,,
PS C:\Windows\system32> Import-Module WindowsVersion #直接通过指定名称来导入模块,,,不必使用 .\WindowsVersion.psd1 或 .\WindowsVersion.psm1 #此时系统当中的其它用户都可以访问该模块
PS C:\Windows\system32> Get-Module
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 3.1.0.0 Microsoft.PowerShell.Management {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
Manifest 3.0.0.0 Microsoft.PowerShell.Security {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-AuthenticodeSignature...
Manifest 3.1.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script 2.0.0 PSReadline {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLineKeyHandler, Set-PSR...
Script 1.0 WindowsVersion {Format-WindowsVersion, Get-WindowsVersion}
PS C:\Windows\system32>
课程概览
PowerShell入门
04|高级编程
05 |创建PowerShell模块
● 模块的结构和使用
● 模块的创建和导入
● 模块清单
来自 https://www.bilibili.com/video/BV1yb411g7n7?p=5 有大用
1.认识PowerShell
PS C:\Users\16666739> $psversiontable #查看 powershell 版本
Name Value
---- -----
PSVersion 5.1.19041.2364
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.2364
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS C:\Users\16666739>
来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?p=1&vd_source=dc680bf12084f74c551f474664c2b741
2.PowerShell强大之处
PS C:\Users\16666739> 1GB #1GB 换算成多少字节
1073741824
PS C:\Users\16666739> 1024*1024*1024 #算术运算
1073741824
PS C:\Users\16666739> (8*9*9)/2 #算术运算
324
PS C:\Users\16666739>
PS C:\Users\16666739> get-service #得到服务 动词-名词 的形式
Status Name DisplayName
------ ---- -----------
Stopped .Winhlpsvr Windows Helper Service
Running 2345BrowserServcie 2345加速浏览器服务
Running 2345HaoZip 好压压缩服务
Running 2345Pic 看图服务
Running 2345SafeCenterSvc 2345SafeCenterSvc
# services.msc # dos 中,以图形化的方式展示出来
3.自定义PowerShell控制台
4.PowerShell快捷键
ALT+F7 清除命令的历史记录
PgUp PgDn 翻页的效果
Enter 执行当前命令
End 将光标移至当前命令的末尾
Del 从右开始删除输入的命令字符
Esc 清空当前命令行
F2 自动补充历史命令至指定字符
F4 删除命令行至光标右边指定字符处
F7 对话框显示命令行历史记录
F8 检索包含指定字符的命令行历史记录
F9 根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看
左/右 左箭头,右箭头 左右移动光标
上/下 上箭头,下箭头 切换命令行的历史记录
Home 光标移至命令行最左端
Backspace 从右删除命令行字符
Ctrl+C 取消正在执行的命令
Tab 自动补齐命令或者文件名
来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?p=4&vd_source=dc680bf12084f74c551f474664c2b741
5.PowerShell管道和重定向
PS C:\> ls
PS C:\> ls | Format-Table mode,name
PS D:\> d:
PS D:\> ls | Format-Table name,mode > demo.txt #一个大于号覆盖输出
PS D:\> type demo.txt
Name Mode
---- ----
360Downloads d-----
backup d-----
BaiduNetdiskDownload d-----
ftp 客户端 d-----
HRAppStoreDownload d-----
demo.txt -a----
PS D:\> ls | Format-Table name,mode >> demo.txt #两个大于号,是附加输出
6.PowerShell数学运算
PS D:\> ls | Format-Table name,mode >> demo.txt
PS D:\> 1+6
7
PS D:\> 1*6+5%2
7
PS D:\>
PS D:\> (1+7)/2
4
PS D:\> 1gb/1mb
1024
PS D:\> 1gb/1mb*188kb
197132288
PS D:\> 1024*18*1024
18874368
PS D:\> 1gb -gt 2mb
True
PS D:\> 0xabc #十六进制转换为10进制
2748
PS D:\> 0xabcd #十六进制转换为10进制
43981
PS D:\>
7.PowerShell执行外部命令
Dos 程序打开
# netstat --ano #查看端口信息
# ipconfig #查看ip
# route print #打印路由
# start \ #打开路径,也可以打开程序
# start notepad #打开记事本程序
# notepad #打开记事本程序
Powershell 程序打开
# netstat --ano #查看端口信息
# ipconfig #查看ip
# route print #打印路由
# start \ #打开路径,也可以打开程序
# start notepad #打开记事本程序
# notepad #打开记事本程序
# &"notepad" #打开notepad ,,,执行命令的话,用与符号&
# $env:path #打印系统环境变量
8.PowerShell命令集
# Get-Command #获取所有命令
所有的命令 就是 动词-名词 的形式 (动词 中短横 (杠) 名词)
# Get-help Get-Command #查看 Get-Command 命令的帮助信息
# Get-Process #获取所有进程信息
# Get-Aliase #获取别名
# get-history #获取历史命令的信息
# get-date #获取当前时间
9.PowerShell别名使用
# get-childitem #列出当前目录的文件和子目录
# get-alias #获取所有的别名
# Get-Alias ls # 查询某一个别名 ls 对应的真实的命令 get-childitem
# Get-Alias -name ls # 也是查询某一个别名 ls 对应的真实的命令 get-childitem
# Get-Alias -name dir #查询某一个别名 dir 对应的真实的命令 get-childitem
# Get-Alias -name fl # 查询某一个别名 fl 对应的真实的命令( Format-List 格式化为列表 )
# Get-Alias -name ft # 查询某一个别名 fl 对应的真实的命令( Format-Table格式化为表格 )
# get-alias | where {$_.definition.startswith("Remove")} #查找出以 Remove 开头的别名
# 为什么它有这个属性 definition , 查看 $_ 的所有属性 ,见 /node-admin/21718
# get-alias | where {$_.definition.startswith("Remove-Item")} #查找出 Remove-Item 的所有别名
# Get-Alias | Group-Object Definition | sort -Descending Count #获取所有的别名,降序排列 详解 见 /node-admin/21717
Count Name Group
----- ---- -----
6 Remove-Item {del, erase, rd, ri...}
3 Get-ChildItem {dir, gci, ls}
3 Get-History {ghy, h, history}
3 Copy-Item {copy, cp, cpi}
3 Invoke-WebRequest {curl, iwr, wget}
3 Set-Location {cd, chdir, sl}
3 Get-Content {cat, gc, type}
.........
10.PowerShell自定义别名
# Set-Alias -name pad -value notepad # 设置别名 -name是别名 -value 是原命令名称 ,,,它时临时生效的
# pad #此时可以直接打开记事本了
# del alias:pad #删除别名 del
# Export-Alias demo.ps1 #导出别名
# type demo.ps1 #可以看到所有的别名被导出了
如下图,为 demo.ps1 的内容
# Import-Alias demo.ps1 #导入别名,会报错,提示别名已存在
# Import-Alias -force demo.ps1 #强制导入别名,就不会报错了
来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?p=10&vd_source=346847773d1f74962a4daab9ddf7f228
11.PowerShell变量基础
PS D:\> $name="xiaoming" #字符串赋值给变量
PS D:\> $name
xiaoming
PS D:\> $age=26 #数字赋值给变量
PS D:\> $age
26
PS D:\> ${"i am a" var()}="haha" #特殊字符 "i am a" var() 赋值给变量,要用大括号括起来
PS D:\> ${"i am a" var()}
haha
PS D:\> $n=(7*6+8)/2 #表达式赋值给变量
PS D:\> $n
25
PS D:\> $n=ls #命令的结果赋值给变量
PS D:\> $n
目录: D:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024/6/28 22:08 360Downloads
d----- 2024/10/6 14:54 aaa
d----- 2024/6/27 22:36 backup
d----- 2024/9/25 22:31 BaiduNetdiskDownload
d----- 2024/10/6 14:57 bbb
d----- 2024/8/3 18:28 ftp 客户端
d----- 2024/8/2 21:27 HRAppStoreDownload
-a---- 2024/10/6 14:12 954 demo.txt
PS D:\>
PS D:\> $num1=$num2=35
PS D:\> $num1
35
PS D:\> $num2
35
PS D:\>
来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?p=11&vd_source=346847773d1f74962a4daab9ddf7f228
12.PowerShell变量操作
PS C:\Windows\system32> $num1=20
PS C:\Windows\system32> $num1=10
PS C:\Windows\system32> $num2=20
PS C:\Windows\system32> $temp=$num1
PS C:\Windows\system32> $num1=$num2
PS C:\Windows\system32> $num2=$temp
PS C:\Windows\system32> $num1
20
PS C:\Windows\system32> $num2
10
PS C:\Windows\system32>
PS C:\Windows\system32> $num1=10
PS C:\Windows\system32> $num2=20
PS C:\Windows\system32> $num1,$num2=$num2,$num1
PS C:\Windows\system32> $num1
20
PS C:\Windows\system32> $num2
10
PS C:\Windows\system32>
PS C:\Windows\system32> ls variable: #当前正在使用的所有的字符串变量
Name Value
---- -----
$ varible:
? False
^ ls
args {}
ConfirmPreference High
ConsoleFileName
DebugPreference SilentlyContinue
Error {找不到驱动器。名为“varible”的驱动器不存在。}
ErrorActionPreference Continue
ErrorView NormalView
ExecutionContext System.Management.Automation.EngineIntrinsics
false False
FormatEnumerationLimit 4
HOME C:\Users\shipingzhong
Host System.Management.Automation.Internal.Host.InternalHost
InformationPreference SilentlyContinue
input System.Collections.ArrayList+ArrayListEnumeratorSimple
MaximumAliasCount 4096
MaximumDriveCount 4096
MaximumErrorCount 256
MaximumFunctionCount 4096
MaximumHistoryCount 4096
MaximumVariableCount 4096
MyInvocation System.Management.Automation.InvocationInfo
NestedPromptLevel 0
null
num1 20
num2 10
OutputEncoding System.Text.ASCIIEncoding
PID 13292
PROFILE C:\Users\shipingzhong\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
ProgressPreference Continue
PSBoundParameters {}
PSCommandPath
PSCulture zh-CN
PSDefaultParameterValues {}
PSEdition Desktop
PSEmailServer
PSHOME C:\Windows\System32\WindowsPowerShell\v1.0
PSScriptRoot
PSSessionApplicationName wsman
PSSessionConfigurationName http://schemas.microsoft.com/powershell/Microsoft.PowerShell
PSSessionOption System.Management.Automation.Remoting.PSSessionOption
PSUICulture zh-CN
PSVersionTable {PSVersion, PSEdition, PSCompatibleVersions, BuildVersion...}
PWD C:\Windows\system32
ShellId Microsoft.PowerShell
StackTrace
temp 10
true True
VerbosePreference SilentlyContinue
WarningPreference Continue
WhatIfPreference False
PS C:\Windows\system32>
PS C:\Windows\system32> ls variable:num* #查找出所有num开头的变量
Name Value
---- -----
num1 20
num2 10
PS C:\Windows\system32> ls variable:num1 #查找出所有num1的变量
Name Value
---- -----
num1 20
PS C:\Windows\system32>
PS C:\Windows\system32> test-path variable:num1 #查找出num1的变量是否存在
True
PS C:\Windows\system32> test-path variable:num0 #查找出num0的变量是否存在
False
PS C:\Windows\system32>
PS C:\Windows\system32> del variable:num1 #删除一个变量
PS C:\Windows\system32> test-path variable:num1 #num1 变量已经不存在
False
PS C:\Windows\system32>
clear-variable
remove-variable
get-variable
set-variable
new-variable
也可以创建只读变量(写保护,只允许读,不能重新修必赋值)
来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?p=12&vd_source=346847773d1f74962a4daab9ddf7f228
13.PowerShell自动化变量
自动化变量 是 powershell 自己创建并维护的
PS C:\Windows\system32> $home #当前用户目录
C:\Users\shipingzhong
PS C:\Windows\system32>
PS C:\Windows\system32> $pid #当前powershell 的进程id,是只读的,写保护的
13292
PS C:\Windows\system32>
PS C:\Windows\system32> $$ #两个美元符,最后一次运行的命令,运行的令牌
$pid
PS C:\Windows\system32>
PS C:\Windows\system32> $? #美元符号问号,上一个命令的运行状态是真还是假
True
PS C:\Windows\system32>
PS C:\Windows\system32> $null #空变量,
PS C:\Windows\system32>
14.PowerShell环境变量
PS C:\Windows\system32> ls env: # 查看环境变量
PS C:\Windows\system32> $env:path #环境变量path的值
C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\EmEditor;C:\ProgramData\chocolatey\bin;D:\aaa;D:\bbb;D:\CCC
PS C:\Windows\system32> $env:windir #环境变量windir的值
C:\Windows
PS C:\Windows\system32>
PS C:\Windows\system32> $env:OS #环境变量OS的值
Windows_NT
PS C:\Windows\system32>
PS C:\Windows\system32> $env:name="xiaohua" #自定义环境变量
PS C:\Windows\system32> ls env: #可以发现自定义的环境变量 name
PS C:\Windows\system32> ls env:na* #找到名为 na 开头的环境变量
Name Value
---- -----
name xiaohua
PS C:\Windows\system32>
PS C:\Windows\system32> del env:name #删除环境变量 name
PS C:\Windows\system32> $env:name #看不到环境变量 name的值了
PS C:\Windows\system32>
PS C:\Windows\system32> ls env:name #查找不到了环境变量 name 了
ls : 找不到路径“name”,因为该路径不存在。
所在位置 行:1 字符: 1
+ ls env:name
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (name:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\Windows\system32>
PS C:\Windows\system32> $env:OS #查看环境变量
Windows_NT
PS C:\Windows\system32> $env:OS="Linux" #修改环境变量,只是临时生效
PS C:\Windows\system32> $env:OS #查看环境变量,发现值变了
Linux
PS C:\Windows\system32>
用.net 的方法修改环境变量,可以永久生效 见 /node-admin/21716
PS C:\Users\Administrator> [environment]::SetEnvironmentVariable("PATH","D:\","User" ) #设置User的环境变量PATH
PS C:\Users\Administrator> [environment]::getEnvironmentVariable("PATH","User") #获取User的环境变量PATH
D:\
PS C:\Users\Administrator>
下图也可以看到 PATH 变成D:\
用户变量仅对当前用户生效,,,系统变量对所有用户生效
15.PowerShell脚本执行策略
demo.ps1
Get-Command
# C: \Users\Admini strator\Desktop\demo. ps1 #报错,在此系统上禁止运行脚本
# get-help set-executionpolicy #查看 set-executionpolicy 帮助
# set-executionpolicy RemoteSigned #设置策略
# get-executionpolicy #返回策略
# C: \Users\Admini strator\Desktop\demo. ps1 已经能够正确运行,不报错了
16.PowerShell与其他脚本程序的互相调用
PS C:\Users\shipingzhong> cd .\Desktop\
PS C:\Users\shipingzhong\Desktop> .\demo.bat #执行 bat 文年
hello world
PS C:\Users\shipingzhong\Desktop>
PS C:\Users\shipingzhong\Desktop>
PS C:\Users\shipingzhong\Desktop> C:\Users\shipingzhong\Desktop\demo.bat #执行 bat 文件
hello world
PS C:\Users\shipingzhong\Desktop>
demo.vbs # vb vbscript 脚本
msgbox "hello world"
PS C:\Users\shipingzhong\Desktop> .\demo.vbs #这样,就执行了这样一个 vbs 文件
PS C:\Users\shipingzhong\Desktop>
PS C:\Users\shipingzhong\Desktop> C:\Users\shipingzhong\Desktop\pw\test1.ps1 #执行 powshell 文件
Hello, ! You are 0 years old.
PS C:\Users\shipingzhong\Desktop>
demo.bat # 下面的与符号 & 表示执行
@echo off
powershell "&' C:\Users\shipingzhong\Desktop\pw\test1.ps1'"
C:\Users\shipingzhong>C:\Users\shipingzhong\Desktop\demo.bat #bat 里面 执行了 powershell
Hello, ! You are 0 years old.
C:\Users\shipingzhong>
C:\Users\shipingzhong>cd Desktop
C:\Users\shipingzhong\Desktop>start demo.bat
C:\Users\shipingzhong\Desktop>
C:\Users\shipingzhong\Desktop>.\demo.bat #这样可以执行 bat 文件
Hello, ! You are 0 years old.
C:\Users\shipingzhong\Desktop>demo.bat #这样也可以执行 bat 文件
Hello, ! You are 0 years old.
C:\Users\shipingzhong\Desktop>
也可以在powershell 调用 python 脚本文件
17.PowerShell条件操作符
-eq
-nq
-gt
-lt
-le
-contains
-notcontains
PS C:\Users\16666739> 89 -eq 67
False
PS C:\Users\16666739> 89 -eq 89
True
PS C:\Users\16666739> 1gb -gt 1mb
True
PS C:\Users\16666739> 1gb -gt 1tb
False
PS C:\Users\16666739>
PS C:\Users\16666739>
PS C:\Users\16666739> (1,2,3) -contains 1
True
PS C:\Users\16666739> (1,2,3) -contains 2
True
PS C:\Users\16666739> (1,2,3) -contains 8
False
PS C:\Users\16666739> (1,2,3) -notcontains 8
True
PS C:\Users\16666739>
PS C:\Users\16666739> $a=1gb -gt 1mb
PS C:\Users\16666739> $a
True
PS C:\Users\16666739> -not $a #求反
False
PS C:\Users\16666739>
-and
-or
-not
-xor #异或
PS C:\Users\16666739> 1 -and 1
True
PS C:\Users\16666739> 1 -and 2
True
PS C:\Users\16666739>
PS C:\Users\16666739> $true -and $true
True
PS C:\Users\16666739> $true -and $false
False
PS C:\Users\16666739> $true -or $false
True
PS C:\Users\16666739> $false -or $false
False
PS C:\Users\16666739>
PS C:\Users\16666739> -not $true
False
PS C:\Users\16666739>
PS C:\Users\16666739> 1,5,8,0,9 -ne 0 # 1,5,8,0,9 这是一个数组,可以加上括号 即 (1,5,8,0,9) ,,,,, 筛选出 不等于 0 的值
1
5
8
9
PS C:\Users\16666739>
PS C:\Users\16666739> 1,5,8,0,9 -eq 0 #筛选出 等于 0 的值
0
PS C:\Users\16666739>
PS C:\Users\16666739> 1,5,8,0,9 -contains 0 #判断是否包含 0
True
PS C:\Users\16666739> 1,5,8,0,9 -notcontains 0 #判断是否不包含 0
False
18.PowerShell条件判断【if语句】
PS C:\Users\16666739>
PS C:\Users\16666739> $num=100
PS C:\Users\16666739> if($num -gt 90) {"1"}
1
PS C:\Users\16666739> if($num -gt 100) {"1"}
PS C:\Users\16666739> if($num -gt 100) {"1"} else{"-1"}
-1
PS C:\Users\16666739> if($num -gt 100) {"1"} elseif ($num -eq 100){"0"} else{"-1"}
0
PS C:\Users\16666739>
19.PowerShell条件判断【switch语句】
20.PowerShell循环结构【foreach语句】
21.PowerShell循环结构【while语句】
do while 至少运行一次
来自 https://www.bilibili.com/video/BV1Et4y1C7ZB?p=21&vd_source=dc680bf12084f74c551f474664c2b741
22.break和continue关键字使用
23.PowerShell循环结构【for语句】
24.PowerShell循环结构【switch循环】
switch 这里是一个循环
25.PowerShell数组的创建
数组示例一:
4
[Done] exited with code=0 in 0.262 seconds
# 为什么 ipconfig 是一个数组?它并不是cmdlet的一个命令,它会将每一行当作一个元素组织起来,组成一个数组,赋给变量$arr
26.PowerShell访问数组
下图这几种各种不同的执行
数组 也有 add remove 方法 来添加删除元素
27.PowerShell自定义函数及调用
无参的函数 可以不写括号
有参的函数
两个参数的函数
28.PowerShell函数返回值
为什么我这里没有输出$sum的值 ,但是视频中有输出$sum的值
# $sum=add 3 4 #如果这里赋了值这里不会打印出任何值
add 3 4 #如果这里没有赋值,,所以打印出了 7
29.PowerShell定义文本
`n 换行符
`r 回车符
`t 制表符
`b 退格符
30.PowerShell实现用户交互
31.PowerShell格式化字符串
32.String对象方法
[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
[Running] powershell -ExecutionPolicy ByPass -File "c:\Users\shipingzhong\Desktop\pw\demo.ps1"
可以使用 remove 进行删除 ,,,startswith 以什么什么开头
33.PowerShell操作注册表
与操作文件目录一样操作注册表
PS C:\Users\shipingzhong> cd Hkcu: #进入到注册表中的 HKEY_CURRENT_USER (HKCU)
PS HKCU:\>
PS HKCU:\> dir
PS HKCU:\> cd Console
PS HKCU:\Console> ls
Hive: HKEY_CURRENT_USER\Console
Name Property
---- --------
%SystemRoot%_System32_WindowsP ColorTable05 : 5645313
owerShell_v1.0_powershell.exe ColorTable06 : 15789550
FaceName : Lucida Console
FontFamily : 54
FontWeight : 400
PopupColors : 243
QuickEdit : 1
ScreenBufferSize : 196608120
ScreenColors : 86
WindowSize : 3276920
%SystemRoot%_SysWOW64_WindowsP ColorTable05 : 5645313
owerShell_v1.0_powershell.exe ColorTable06 : 15789550
FaceName : Lucida Console
FontFamily : 54
FontWeight : 400
PopupColors : 243
QuickEdit : 1
ScreenBufferSize : 196608120
ScreenColors : 86
WindowSize : 3276920
PS HKCU:\Console>
PS HKCU:\Console> cd ..
PS HKCU:\> exit
C:\Users\shipingzhong>
C:\Users\shipingzhong>powershell
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
PS C:\Users\shipingzhong>
PS C:\Users\shipingzhong> cd HKLM:
PS HKLM:\> ls #没有权限会报错
ls : 不允许所请求的注册表访问权。
所在位置 行:1 字符: 1
+ ls
+ ~~
+ CategoryInfo : PermissionDenied: (HKEY_LOCAL_MACHINE\BCD00000000:String) [Get-ChildItem], SecurityExcep
tion
+ FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.GetChildItemCommand
Hive: HKEY_LOCAL_MACHINE
Name Property
---- --------
HARDWARE
SAM
ls : 不允许所请求的注册表访问权。
所在位置 行:1 字符: 1
+ ls
+ ~~
+ CategoryInfo : PermissionDenied: (HKEY_LOCAL_MACHINE\SECURITY:String) [Get-ChildItem], SecurityExceptio
n
+ FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.GetChildItemCommand
SOFTWARE
SYSTEM
PS HKLM:\>
Get-ItemProperty Set-ItemProperty Remove-ItemProperty Remove-ItemProperty New-ItemProperty md New-item
https://search.bilibili.com/all?vt=68655503&keyword=powershell&search_source=1
https://space.bilibili.com/297378187
https://www.bilibili.com/video/BV1K54y1k77R/?spm_id_from=333.337.search-card.all.click
https://www.bilibili.com/video/BV1wH4y1v7jw?p=20&vd_source=346847773d1f74962a4daab9ddf7f228