欢迎各位兄弟 发布技术文章
这里的技术是共享的
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"
五、轻松实现远程管理。
来自 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)
示例
章节概览
对象与.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
看到 4:20
来自 https://www.bilibili.com/video/BV1yb411g7n7?p=3
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