1.使用指南
1.1运行脚本(调用操作:命令名中包含空格)
1
2
& 'C:\Program Files\Program.exe' arguments
当前目录下:.\Program.exe arguments
1.3配置文件
1
Prompt()函数
1.4帮助
1
Get-Command/Get-Help
1.7命令转化为Base64编码
1
2
3
$commands = '1..10' | % { "Powershell Rocks" }'
$bytes = [System.Text.Encoding]::Unicode.GetByte($commands)
$encodedString = [Convert]::ToBase64String($bytes)
2.管道
2.2过滤列表项或命令输出项
1
2
//列出所有正在运行的进程名称包含“Search”的进程
Get-Process | Where-Object { $_.Name -like "*Search*" }
2.4处理列表或命令输出的每一项
1
2
3
4
//输出1~10*2,$_是输入的参数
1..10 | Foreach-Object { $_ * 2 }
//获得文件内容(txt,csv)
Get-Content
3.变量和对象
3.2访问环境变量
1
2
//列出env驱动器的所有子节点
Get-ChildItem env:
3.4使用.NET对象
1
2
3
4
5
//静态方法
[ClassName]::MethodName(parameter list)
[System.Diagnostics.Process]::GetProcessById(0)
//
(New-Object Net.WebClient).DownloadString("http://live.com")
3.8使用COM对象
1
2
3
4
5
$object = New_Object -ComObject ProgId
//了解对象的方法和属性
$object | Get-Member (-Static)
Get-Member -InputObject $object
//MSDN获得详细文档
3.12向类添加自定义的方法和属性
1
使用XML
4.循环与流程控制
4.2比较和逻辑运算符、条件语句
1
2
3
4
运算符:-eq,-ne,-ge,-gt,-like,-notlike,-is,-isnot
逻辑符:-and,-or,-xor,-not
条件语句:if,elseif,else,switch
循环语句:for,foreach,while,do...while
4.5添加暂停或延迟
1
2
暂停直到enter:Read-Host
暂停直到按下某一键:$host.UI.RawUI.ReadKey()
5.字符串与非结构化文本
5.1 创建字符串
1
2
3
原生字符串使用单引号
支持变量扩展和转移字符的使用双引号
PS >"{0} divided by {1} is {2}" -f $number2, $number1, ($number2 / $number1)
5.7根据文本或模式在字符串中查找
1
2
3
4
5
6
7
字符串与通配符匹配:-like
字符串与正则表达式匹配:-match
字符串是否包含特定字符串:.Contains("")
字符串在另一个字符串的位置:IndexOf()
替换文本:.Replace("World","Powershell")
字符串大小写转换:"".ToUpper(),"".ToLower()
去掉字符串的空格:Trim()
5.12转换文本流为对象
1
2
替换文本:Sed
搜索文本:Grep
6.计算与数学计算
6.3度量一个列表的统计属性
1
Measure-Object -Average -Sum -Property Length
7.简单文件
7.1获取文件内容
1
2
3
4
5
6
7
Get-Content C:\file.txt
${ C:\file.txt }
//-Delimiter 修改换行标识
//ReadCount设置读取的行数
//一次读取所有文件,处理大文件时需要格外小心
[File]::ReadAllText()
7.2搜索文件的文本
1
2
3
4
5
6
7
8
Select-String
-Simple 不区分大小写
//使用正则表达式递归搜索所有文件名为.txt的文件,将Get-Childitem的结果通过管道输出给Select-String
Get-ChildItem -Filter *.txt -Recurse | Select-String pattern
//当前目录下搜索扩展名为DLL的文件是否包含“Debug”
Get-ChildItem | Where { $_ | Select-String "Debug" -Quiet }
7.5创建临时文件
1
2
$filename = [System.IO.Path]::GetTempFileName()
Remove-Item -Force $filename
8.结构化文件
8.1访问XML文件中的信息
1
$xml = [xml] (Get-Content $filename)
8.4导入导出结构化数据
1
2
Export-CliXml
Import-CliXml
9.支持Internet的脚本
9.1从Internet下载一个文件
1
2
3
4
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($source, $destination)
//下载Web页面
$content = $wc.DownloadString($source)
9.5将命令的输出生成一个Web页面
1
ConvertTo-Html
9.7与Internet协议交互
10.代码复用
10.2编写一个函数
1
2
3
4
param([double] $fahrenheit) //脚本的形参
$celsius = $fahrenheit -32 //操作
$celsius = $celsius / 1.8
"$fahrenheit degrees Fahrenheit is $celsius degrees Celsius." //输出
10.3脚本
1
2
3
4
//脚本块 Map-Object
//使用库脚本
$scriptDirectory = Split-Path $myInvocation.MyCommand.Path.(Join-Path $scriptDirectory LibraryTemperature.ps1)
//访问管道数据 $input
10.8用命令关键字(Cmdlet Keywords)编写面向管道的脚本
1
2
3
4
5
6
7
8
//把脚本分为初始化、处理和清除
function{
begin{}
process{}
end{}
}
//使用fearch($element in $input)访问输入管道的元素
//面向管道的函数 filter代替function
11.列表、数组和hash表
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
//赋值列表用逗号分隔
$Array = 1,2,"Hello World"
//新建数组
$myArray = New-Object string [] 10
//创建多维数组
$jagged = @(
(1,2,3,4)
(5,6,7,8)
)
//访问数组每个元素Foreach_Object,foreach,for
Foreach_Object { $sum += $_ }
foreach($element in $myArray){$sum += $element }
//数组排序
Get-ChildItem | Sort-Object -Descending Length | Slelect Name,Length
//数组包含某项,匹配:-eq,-like,-match
"Hello","World" - contains "Hello"
//合并数组
$result = $firstArray + $secondArray
//从数组中移出元素:-ne,-notlike,-notmatch
$array = $array -ne "Item1"
//使用ArrayList类完成高级的数组任务
$myArray = New-Object System.Collections.ArrayList
[void] $myArray.Add("Hello")
[void] $myArray.AddRange(("World","how ara you"))
$myArray.RemoveAt(1)
//创建hash表
$myHashtable @{}
$myHashtable = @{Key1 = "Value1";"Key 2" = 1,2,3}
$myHashtable["New Item"] = 5
//获取hash表中各个元素
GetEnumerator()
12.用户交互
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//使用Read-Host
$directory = Read-Host "Enter a directory name"
//读取用户输入的按键
[Console]::ReadKey()
//给用户显示输出和消息
Write-Host, Out-Host
//为长时间运行的任务提供进度更新
Write-Progress
//主机的用户界面访问功能
$host.UI.RawUI.WindowTitle = (Get-Location)
13.跟踪和错误管理
13.1查看由某一命令生成的错误
1
2
3
4
$error, $eooroView
//清除错误
$error.Clear()
$error.Count()
13.2处理警告、错误和终止错误
1
2
3
4
//忽略响应警告信息
$warningPreference = "SilentlyContinue"
//忽略非终止信息
$errorActionPreference = "SilentlyContinue"
13.4调试脚本
1
2
3
4
5
Write-Debug,
//逐步、跟踪、环境检查
Set-PsDebug -Step
Set-PsDebug -Trace
$host.EnterNestedPrompt
14.掌握环境
1
2
3
4
5
6
7
8
9
10
11
12
$myInvocation提供当前脚本、函数或脚本块的大量信息:
MyCommand:命令本身的信息
ScriptLineNumber:命令行号
ScriptName:调用改命令的脚本名称
Line:在脚本行中调用该命令的文本
InvocationName:调用该命令的名称
PipelineLength:命令管道中的命令数
PipelinePostion:管道中的命令位置
Definition/Path:脚本运行完整路径
//确定系统路径和特殊文件夹位置
[Environment]::GetFolderPath("System")
15.Windows PowerShell的拓展
15.1访问WMI数据
1
2
3
4
5
6
7
8
//检索WMI类的所有实例
Get-WmiObject -ComputerName Computer -Class Win32_Bios
//检索WMI特定实例
Get-WmiObject Win32_Service -Filter "StartMode = 'Auto'"
//使用WMI的WQL语言检索
$query = [WmiSearcher] "SELECT * FROM Win32_Service WHERE StartMode = 'Auto'"
15.4使用.NET来执行高级的WMI任务
1
2
3
4
//使用所生成的对象PsBase属性
//获取与给定的实例相关的WMI实例,调用GetRelated()
$instance = [Wmi] 'Win32_service.Name="winmgmt"'
$instance.PsBase.GetRelated()
15.6使用COM脚本接口自动化程序
1
2
$shell = New-Object -ComObject "Shell.Application"
$shell.Windows() | Format-Table LocationName,LocationUrl
16.安全和脚本签名
16.1通过执行策略启动脚本
1
2
3
4
5
Set-ExecutionPolicy RemoteSigned
Restricted 受限
Allsigned 签名
Remote Signed 远程签名
Unrestricted 不受限制
16.2脚本或格式文件签名
1
2
$cert = @(Get-ChildItem cert:\CurrentUser\My -CodeSigning)[0]
Set-AuthenticodeSignature file.ps1 $cert
16.4管理企业中的安全性
1
2
3
组策略模版
部署证书服务来为域账户自动生成证书
应用软件限制策略
16.5验证脚本的数字签名
1
Get-AuthenticodeSignature
16.6安全地处理敏感信息
1
$secureInput = Read-Host -AsSecureString "Enter your Private key"