这本书基于 PowerShell 3.0,做初学者教材极好,若有 Linux shell 基础则可一目十行。如下便是摘录式笔记,仅记录一些感兴趣的重点,涉及大部分章节。
书中甚少涉及语法,因为按作者的说法:操起命令直接上,这才是 PS 的主要使用模式(PowerShell-ish ways),而非一般的脚本编程,流控之类的语法都只是命令的粘合剂。
读完一遍,对 PS 突出印象:
PowerShell 包含两个组件:
查看当前 PS 版本: $PSVersionTable
媲美 GUI 的 CLI 帮助系统:能迅速找到命令并了解其用法(支持通配符)
4 种命令 Command:cmdlet(命名约定 verbs + nouns),function,workflow,externApp。
例: Get-Service -name e,s*
首先升级帮助系统:update-help(-Source 可指定本地更新源)
多个参数搭配路径
cmdlet:原生命令,使用 .Net 语言编写。参数类型如下:
[-ComputerName <string[]>]
,这里的数组用逗号分隔的列表表示;用参数缩写时能唯一标识即可,如 -comp[-LogName] <string>
externApp(外部命令)
$exe = “C:\mount.exe”
$host = “srv”
$user = “nick”
& $exe -h $host -u $user
新写法:-- C:\mount.exe -h srv -u nick
,会直接传给 cmd,不解析
PSProvider 适配器,以类文件系统的方式,来导航与管理数据存储(动态结构),如注册表。
查看可用:Get-PSProvider
相关 cmdlet 的 noun 常带 “Item”(指单独对象,如文件)
ItemProperty 表示 item 属性,如只读,一般都有 -Path 属性,支持通配符;ChildItem 指子对象
两种:module 和 snap-in(dll+xml)
get-pssnapin -registered 注册
add-pssnapin sqlservercmdletsnapin100,sqlserverprovidersnapin100
Get-Command -pssnapin sqlservercmdletsnapin100
module 不用注册,根据 $PSModulePath 自动发现,按需加载
get-command -Module DnsClient
有些特定的管理 shell 其实是带参数启动 powershell.exe -noexit -command import-module ActiveDirectory
查看:get-process | get-member
a collection of objects as a big in-memory table of information
, with propertiesas the columns and individual objects the rows.
PS 对象一般来自 .net 框架,但 ETS(Extensible Type System)会添加些额外属性(ScriptProperty,NoteProperty,AliasProperty)以利使用。
对象的 property 用的很多,但 action/method 用的很少,因为功能通常由 cmdlet 实现
Get-Process | Sort-Object VM,ID -desc
Get-Process | Select-Object Name,ID,VM,PM
Select-Objectis 用来选择或新建 properties(会产生新对象), 以及特定行,-expandProperty 可以获取其值列表. 而 Where-Object 根据指定条件删除或过滤 pipeline 里的 objects。
pipeline 的每一步都可能产生不同对象,可使用 gm 来确定
Pipeline parameter binding(参数绑定):
Try1. ByValue:把输入与参数类型进行匹配;参数需支持 pipelineInputByValue(可通过 Help -full 查看);仅能匹配一个参数(能否手动指定?)
Try2. ByPropertyName:仅名字匹配;需支持 pipInByPropertyName;多参数匹配
圆括号命令用法:
Get-WmiObject -class Win32_BIOS -ComputerName (Get-Content .\comput
ers.txt)
Get-Service | Where { $_.Status -eq 'Running' } --> Get-Service | Where Status -eq 'Running'
(单条件简化写法)help *task*;get-command -module scheduledtasks
help new-scheduledtask -full
WMI 能够获取大量系统信息,但不好用(缺乏统一规划,文档缺乏)。对 PS 来说只是个可以借用的外部技术,建议使用 CIM 封装命令与之交互
wmi 必知必会
repository
— namespace 例如 root\CIMv2 就包含了所有系统和硬件信息
— class 代表管理组件,一个实例对应一个现实组件
可用查看软件:wmi explorer
Help * -parameter asjob
批量操作的三种方法:batch cmdlets, WMImethods, and object enumeration.
Stop-Service -name *B*
一切皆对象
${My Variable} = ‘SERVER-R2’,’SERVER1’,’localhost’
[int]$number = Read-Host “Enter a number”(强制类型声明)
'$' is a cue to the shell that what follows is going to be a variable
name, and that we want to access the contents of that variable.
变量能够存放多个不同类型的对象,类数组操作
单引号 — a literal string
双引号 — expansion string,但仅在初始解析时替换!
转义符 — ˜
subexpression — $(cmd) ==> string
长连接
$iis_servers = new-pssession -comp web1,web2,web3
如何写 help 文档
One script, one pipeline
within a script, you only have one pipeline to work with.
Normally, your scripts should strive to only output one kind of object, so that PowerShell can produce sensible text output.
进阶学习:
例一:批量查询 ip 所属的 ISP
get-content IPs.txt | % -Process { Write-Host -NoNewline "$_ : "; (curl "http://www.whoismyisp.org/ip/$_").AllElements }
| Where {$_.TagName -eq "H1"} | select -Expand 'innerText'
例二:数据库的备份与备份清理
代码:
$datPath = "D:/mysql/data/*" # '*' 不可少,限定在此层 $data = "dz138", "wyt8" $bakCount = 5 # 保留 5 个备份 $bakPath = "E:/mysqlBackup/" $bakDir = (Get-Date).Tostring("yyyyMMdd") + "_data" # 有年份更明确点 New-Item -type directory -path ($bakPath + $bakDir) Copy-Item $datPath -Include $data -Destination ($bakPath + $bakDir) -Recurse -Force Get-ChildItem $bakPath -Filter *_data | Sort-Object -Property LastWriteTime -Descending
| Select-Object -Skip $bakCount | Remove-Item
参考: