导图社区 PowerShell基础语法、配置、界面知识点笔记
powershell常用命令 基本知识 类似“cmd命令”叫做“cmdlet”,其命名规范十分一致,都采用“动词-名词”形式,如New-Item,动词部分一般为Add,New,Get,Remote,Set等,命名的别名一般兼容
编辑于2022-11-14 09:30:45 广东PowerShell基础语法、配置、界面知识点笔记
基础语法
常量、变量、数组、哈希
使用常量和变量
[string]$var = 5 [System.Int32]$int = 5 $Global:mylist=xxxx #全局变量 $Script:mylist=xxxx #脚本变量 $Local:mylist=xxxx #当前变量 所有的变量以“$”开头,用“=”来给变量赋值
使用"set-variable"
set-variable -name StrUser -value "MaRui"
使用“set-variable”命令时在变量名前不需要使用“$”
屏幕输出变量值
write-output $StrUser
$StrUser
New-Variable num -Value 100 -Force -Option readonly 声明只读变量
Powershell将变量的相关信息的记录存放在名为variable:的驱动中。如果要查看所有定义的变量,可以直接遍历variable: 所以查找变量 Test-Path variable:value1
$value1,$value2=$value2,$value1 交换变量
new-variable num -Value "strong" -Option constant 声明常量
new-variable name -Value "me" -Description "This is my name" 变量描述
自动变量
dir variable:
$$ 包含会话所收到的最后一行中的最后一个令牌
$? 最后一条命令执行成功与否
$^ 包含会话所收到的最后一行中的第一个令牌。
$_ 包含管道对象中的当前对象。在对管道中的每个对象或所选对象执行操作的命令中,可以使用此变量。
$Args 包含由未声明参数和/或传递给函数、脚本或脚本块的参数值组成的数组。 在创建函数时可以声明参数,方法是使用 param 关键字或在函数名称后添加以圆括号括起、逗号 分隔的参数列表。
$ConsoleFileName 包含在会话中最近使用的控制台文件 (.psc1) 的路径。在通过 PSConsoleFile 参数启动 Windows PowerShell 或使用 Export-Console cmdlet 将管理单元名称导出到控制台文件 时,将填充此变量。 在使用不带参数的 Export-Console cmdlet 时,它自动更新在会话中最近使用的控制台文件。 可以使用此自动变量确定要更新的文件。
$Error 包含错误对象的数组,这些对象表示最近的一些错误。最近的错误是该数组中的第一个错误对象 ($Error[0])
$ForEach 包含 ForEach-Object 循环的枚举数。可以对 $ForEach 变量的值使用枚举数的属性和方法。 此变量仅在运行 For 循环时存在,循环完成即会删除
$Home 包含用户的主目录的完整路径。此变量等效于 %homedrive%%homepath% 环境变量
$Host 包含一个对象,该对象表示 Windows PowerShell 的当前主机应用程序。可以使用此变量在命 令中表示当前主机,或者显示或更改主机的属性,如 $Host.version、$Host.CurrentCulture 或 $host.ui.rawui.setbackgroundcolor(“Red”)。
$Input 一个枚举数,它包含传递给函数的输入。$Input 变量区分大小写,只能用于函数和脚本块。(脚 本块本质上是未命名的函数。)在函数的 Process 块中,$Input 变量包含当前位于管道中的对 象。在 Process 块完成后,$Input 的值为 NULL。如果函数没有 Process 块,则 $Input 的值可用于 End 块,它包含函数的所有输入。
$Matches $Matches 变量与 -match 和 -not match 运算符一起使用。 将标量输入提交给 -match 或 -notmatch 运算符时,如果检测到匹配,则会返回一个布尔值, 并使用由所有匹配字符串值组成的哈希表填充 $Matches 自动变量。有关 -match 运算符的详细 信息,请参阅 about_comparison_operators。
$MyInvocation 包含一个对象,该对象具有有关当前命令(如脚本、函数或脚本块)的信息。可以使用该对象中的 信息(如脚本的路径和文件名 ($myinvocation.mycommand.path) 或函数的名称 ($myinvocation.mycommand.name))来标识当前命令。对于查找正在运行的脚本的名称,这非常有用。
$NestedPromptLevel 包含当前提示级别。值 0 指示原始提示级别。该值在进入嵌套级别时递增,在退出嵌套级别时递减
$NULL 包含 NULL 或空值。可以在命令和脚本中使用此变量表示 NULL,而不是使用字符串”NULL”。 如果该字符串转换为非空字符串或非零整数,则可将该字符串解释为 TRUE。 相同的还有 $False $True
$PID 包含承载当前 Windows PowerShell 会话的进程的进程标识符 (PID)
$Profile 包含当前用户和当前主机应用程序的 Windows PowerShell 配置文件的完整路径。可以在命令 中使用此变量表示配置文件。例如,可以在命令中使用此变量确定是否已创建某个配置文件:
$PsCmdlet 包含一个对象,该对象表示正在运行的 cmdlet 或高级函数。
$PsHome 包含 Windows PowerShell 的安装目录的完整路径
$PSScriptRoot 包含要从中执行脚本模块的目录。 通过此变量,脚本可以使用模块路径来访问其他资源。
$PsVersionTable 包含一个只读哈希表,该哈希表显示有关在当前会话中运行的 Windows PowerShell 版本的详 细信息。
$Pwd 包含一个路径对象,该对象表示当前目录的完整路径。
$This 在定义脚本属性或脚本方法的脚本块中,$This 变量引用要扩展的对象。
文件变量
$text = ${C:\Chapter2\tabline.txt}
各种运算符和表达式
比较运算符
• -eq 判断是否等于(equal)
• -lt 判断时候小于(less than)
• -gt 判断是否大于(greater than)
• -ge 判断是否大于或等于(greater of equal)
• -le 判断是否小于或等于(less or equal)
• -ne 判断是否不等于(no equal)
"MaRui" -eq "marui" <enter>
结果:"True"
"MaRui" -ieq "MARUI" <enter>
结果:"True"
"MaRui" -ceq "MARUI" <enter>
结果:"False"
! 非
-like -notlike
-match -notmatch
-contains -notcontains
-is -isnot
逻辑运算符
-and 与
-or 或
-not 非
-xor 异或
3.0新添运算符
-shl:向左位移
8 -shl 2
-shr:向右位移
8 -shr 2
-in:功能类似 -contains,只是写代码时顺序正好相反
2 -in 2,3,8
-notin: 功能类似 -notcontains, 只是写代码时顺序正好相反
10 -notin 2,3,8
一般运算符
, 数组构造器
.. 范围运算器
-is 类型鉴别器
-as 类型转换器 用法: 1 -as [string] #将1作为字符串处理
-band 二进制与
-bor 二进制或
-bnot 二进制非
-contains
10,2,3 -contains 2
-notcontains
10,2,3 -notcontains 2
优先级
创建、修改、合并数组或哈希表
数组
$strUsers=@("user1","user2","user3")
$books="元素1","元素2","元素3" $books[-1]为"元素3"
在PowerShell中,声明一个变量为数组时,需要使用符号"@"
数组合并
+
添加元素
$books+="元素4"
表示范围
$books[0..3]
哈希表
$age=@{"MaRui"=21;"Lee"=27;"Tom"=53}
声明哈希表变量时,同样需要用到符号"@"
查询
$age["MaRui"]
增加(注意,增加的同时一定要赋值,否则不会添加新条目)
$age["Ma"]=24
修改
$age["Ma"]=25
删除(注意,使用圆括号)
$age.remove("Ma")
清除哈希表
$age.clear()
流程控制
判断
if (条件) {代码} elseif (条件) {代码} else (条件) {代码} else {代码}
switch [-regex | -wildcard | -exact] [-casesensitive](表达式)| -file filename { (表达式) {代码} 值 {代码} default {默认执行代码} }
switch ((Get-WmiObject -Class win32_ComputerSystem).domainRole) { 0 {Write-Host "Standalone Workstation"} 1 {Write-Host "Member Workstation"} 2 {Write-Host "Standalone Server"} 3 {Write-Host "Member Server"} 4 {Write-Host "Backup Domain Controller"} 5 {Write-Host "Primary Domain Controller"} default {Write-Host "Cannot determine domain role"} }
switch (100) { (99 + 1) {Write-Host "99+1=100"} (1 + 100) {Write-Host "1+100=100"} (50*2) {Write-Host "50*2=100"} (33.333*3) {Write-Host "33.333*3=100"} }
$day = "day1" switch -casesensitive($day) # -casesensitive 表示大小写敏感,即区分大小写 { day1 {"It's Monday" ;break} day2 {"It's Tuesday";break} day3 {"It's Wednesday";break} day4 {"It's Thursday";break} day5 {"It's Friday";break} day6 {"It's Saturday";break} day7 {"It's Sunday";break} default {"It's unknown";break} }
$day = "day5" switch -regex ($day) { ^[a-z]+$ {"字?母?,?匹?配?为a:o" +$_ ;break} ^[\d]+$ {"数y字?,?匹?配?为a:o" +$_ ;break} ^\w+$ {"字?母?+数y字?,?匹?配?为a:o" +$_ ;break} default {"什2么2都?不?是?" +$_;break} }
$a = ipconfig /all switch -wildCard ($a) { "*DHCP*" { Write-Host $switch.current } }
循环
for (初值;表达式;赋值语句) {代码}
foreach (成员变量 in 数组) {代码}
foreach-object 可用缩写为foreach 别名
对一组输入的每个对象执行运算,$_代表每一个对象
30000,56798,12432 | foreach-object -process {$_/1024}
get-childitem d:\ | foreach-object -process { $_.length / 1024 }
while(表达式) {代码}
do {代码} while(表达式)
do {代码} until(表达式)
do { "Quit Now? (Y/N)" $input=Read-Host } until($input -eq "Y")
延时
Start-Sleep 5
暂停
Read-Host
$host.UI.RawUI.ReadKey()
cmd /c pause
函数
function add { param ($x,$y) 声明参数 $n = $x + $y "$x+$y=$n" } 这是一种特别的函数样式
值传递与地址传递
捆绑属性参数
function my { [cmdletbinding()] Param($a,$b) $a $b+1 }
函数的阶段处理 在函数中,还可以进一步分为下列3个处理步骤: 1. begin - 只在函数第一次开始时执行一次,适用于放置初始化函数的代码。 2. process - 每一次调用函数时都执行 3. end - 只在函数结束时执行一次
function fun{ begin{ "Start" $i=1 } process{ "run "+$i $_.name $i++ } end{ "End" } } ls | fun
Filter(关键字) 筛选器名 (参数) {代码}
function fun{ "run" $_.name } ls | fun
filter fun{ "run" $_.name } ls | fun
直接写的函数对于管道输入的 数据无法处理$_没有意义 而筛选器和有Process的函数 能循环处理,$input和$_是 有意义的
定义范围函数
模块化
组织、调整代码
使用恰当的数据类型
调用其他脚本函数
类对象
[xxx.xx]::xxx
类静态成员的调用方法
[DateTime]::Now
[environment]::version
Get-Member 获取类的属性和方法
get-service | get-member
Get-Service | Get-Member -MemberType Property
Get-Service | Get-Member -MemberType Method
cmdlet指令返回的都是类
Get-ChildItem -Path d:\ -Recurse | Where-Object {$_.LastWriteTime -gt "08/01/2013"}
首先,"get-childitem"是用来枚举我们的文件系统的,使用"-path"参数,将路径指向"d:\",使用"-recurse"参数,意味着将显示所有的文件,甚至是子目录下的。接下来,我们将结果使用管道符传递给循环声明"where-object"中,用来筛选出符合条件的结果
Providers
get-psprovider
get-psdrive 获取当前驱动器列表
cd env: 环境变量
ls OS
ls OS | format-list *
new-item -path . -Name EnvName -Value "NewEnv" 创建环境变量,.为当前目录
cd Function:
get-content clear-host 获取clear-host的内容
cd HKLM:
ls -Recurse | Export-CSV "d:\Cert.csv" 导出注册表
格式化输出 Get-Command Format-*
format-table
Format-Table cmdlet 将命令输出的格式设置为表,表中每列显示选定的对象属性。对象类型可确定默认布局以及每列中显示的属 性,但也可以使用 Property 参数来选择要查看的属性。
get-childitem c:\windows | format-table -hidetableheader
get-childitem c:\windows | format-table -autosize
Get-Service | format-table name, status -autosize
format-custom
Format-Custom cmdlet 将根据可选视图中的定义来设置命令输出的格式。Format-Custom 用于显示不是仅为表格或仅为列表的视图 。可使用 Windows PowerShell 目录中的 *format.PS1XML 文件中定义的视图,或者可在新的 PS1XML 文件中创建自己的视图,并 使用 Update-FormatData cmdlet 将它们添加到 Windows PowerShell 中。
get-childitem c:\windows | format-custom
format-list
Format-List cmdlet 将命令输出的格式设置为属性列表,其中每个属性均各占一行进行显示。可使用 Format-List 将对象的全部 或所选属性设置为列表格式 (format-list *) 并进行显示。
get-childitem c:\windows | format-list
get-childitem c:\windows | format-list -Property FullName
Get-ChildItem C:\Windows -Recurse | Format-List -Property FullName,CreationTime,LastWriteTime
format-wide
Format-Wide cmdlet 将对象的格式设置为只能显示每个对象的一个属性的宽表。可以使用 Property 参数来确定要显示的属性。
Get-ChildItem C: | Format-Wide -Column 3
get-childitem c:\windows | format-wide
其他格式输出
Group-Object
Get-Process | Group-Object Company
Sort-Object
Get-EventLog System | Group-Object eventid
Get-EventLog System | Group-Object eventid | Sort-Object Count -descending
Select-Object select
Select-Object{$_.XXXXX -eq XXXXX}
Where-Object where ?
Where-Object {$_.XXXXX -eq XXXXX}
Convertto-HTML
Get-Process | ConvertTo-html
Get-Process | ConvertTo-html | out-file "Processes.html"
Export-CSV
Get-Process | Export-CSV Processes.csv
Out-GridView
输出为一个图表
Get-Process|Out-GridView
FindStr
Get-Alias |findstr /i "get-alias"
输出包含选择字符的行
Select-String
输出选择的字符
Out-Host -paging
打开文件
Invoke-Item Processes.csv
查看帮助
get-help
Aliases 别名
Get-Alias
Get-Alias |findstr /i "xxx"
Set-Alias gs Get-Service
Export-Alias -Path a.txt
Import-Alias -Path a.txt 导入只需要导入系统没有的
特殊符号
单引号 双引号
$a="World" "Hello, $a"
$a="World" 'Hello, $a'
转义符号
`
`' 单引号
`" 双引号
`0 空值 NULL
`a 报警
`b 退格
`f 跳页
`n 新行
`r 换行
`t 横向Tab键(水平制表符)
`v 纵向Tab键(纵向制表符)
调用操作符
&
& 'C:\Program Files\xxx.exe' Arguments
有趣的东西
进度条
完成度
for ($a=1; $a -lt 100; $a++) { $b=$a Write-Progress -Activity "Working..." -PercentComplete $a -CurrentOperation "$a% complete" -Status "Please wait." #Write-Progress -Activity "Working2..." -PercentComplete $b -CurrentOperation "$b% complete" -Status "Please wait2." Start-Sleep 1 } Write-Progress -Activity "Working..." -Completed -Status "All done."
剩余时间
for ($a=100; $a -gt 1; $a--) { $b=100-$a Write-Progress -Activity "Working..." -SecondsRemaining $a -CurrentOperation "$b% complete" -Status "Please wait." Start-Sleep 1 }
设置shell
function prompt {"($env:username)-($env:computername)-(`$?: $?)-(jobs: $((get-job | measure).Count))-($(get-location))`n(! $(((history)[-1]).ID + 1))->"}
function prompt {"($env:username)-($env:computername)-(`$?: $?)-(Time: $((Get-Date).ToShortTimeString()))-($(get-location))`n(! $(((history)[-1]).ID + 1))->"}
function prompt{ $historyitem=Get-History -Count 1 if($historyitem){ $suggestions=@(Get-AliasSuggestion $historyItem.commandline) if($suggestions){ foreach($aliasSuggestion in $suggestions){ Write-Host "$aliasSuggestion" } Write-Host "" } } "PS [$env:COMPUTERNAME] > " } function Get-AliasSuggestion{ param($lastcommand) $helpMatches=@() foreach($alias in Get-Alias){ if ($lastcommand -match ("\b" + [system.text.regularexpressions.regex]::Escape($alias.definition) + "\b")){ $helpmatches+="tips:$($alias.definition) is $($alias.name)" } } $helpmatches }
具有提示别名的作用
在同一行上可以执行多个命令。在 Windows PowerShell 中,可以使用分号字符 (;) 分隔命令。
调试
set-psDebug -step
set-psDebug -off
脚本路径相关
$MyInvocation.MyCommand.Name #脚本文件名 $MyInvocation.MyCommand.Path #脚本文件全路径 $MyInvocation.InvocationName #脚本文件全路径 $PSCommandPath #脚本文件全路径 $PSScriptRoot #脚本所在目录 $PWD #
PowerShell之外调用
PowerShell "& 'c:\program files\xxx.ps1' args"
PowerShell的配置
$Profile
PowerShell执行策略分级
Restricted - 不能运行任何脚本和配置文件
AllSigned - 所有脚本和配置文件必须拥有受信任的发布者的签名
RemoteSigned - 所有脚本和配置文件从可以是互联网上下载,但必须拥有受信任的发布者的签名
Unrestricted - 所有脚本和配置文件都将运行,从互联网上下载的脚本在运行前会有提示。
Get-ExecutionPolicy
Set-ExecutionPolicy Unrestricted
验证$Profile是否存在
test-path $Profile
false
New-Item -Path $Profile -ItemType file -Force
test-path $Profile
true
notepad $Profile
界面
#界面 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") $objForm=New-ObjectSystem.Windows.Forms.Form $objForm.Text ="Select a Computer" $objForm.Size =New-ObjectSystem.Drawing.Size(300,200) $objForm.StartPosition ="CenterScreen" $objForm.KeyPreview =$True $objForm.Add_KeyDown( { if ($_.KeyCode -eq"Enter") { $x=$objListBox.SelectedItem;$objForm.Close() } } ) $objForm.Add_KeyDown( { if ($_.KeyCode -eq"Escape") { $objForm.Close() } } ) $OKButton=New-ObjectSystem.Windows.Forms.Button $OKButton.Location =New-ObjectSystem.Drawing.Size(75,120) $OKButton.Size =New-ObjectSystem.Drawing.Size(75,23) $OKButton.Text ="OK" $OKButton.Add_Click( { $x=$objListBox.SelectedItem; $objForm.Close() } ) $objForm.Controls.Add($OKButton) $CancelButton=New-ObjectSystem.Windows.Forms.Button $CancelButton.Location =New-ObjectSystem.Drawing.Size(150,120) $CancelButton.Size =New-ObjectSystem.Drawing.Size(75,23) $CancelButton.Text ="Cancel" $CancelButton.Add_Click( { $objForm.Close() } ) $objForm.Controls.Add($CancelButton) $objLabel=New-ObjectSystem.Windows.Forms.Label $objLabel.Location =New-ObjectSystem.Drawing.Size(10,20) $objLabel.Size =New-ObjectSystem.Drawing.Size(280,20) $objLabel.Text ="Please select a computer:" $objForm.Controls.Add($objLabel) $objListBox=New-ObjectSystem.Windows.Forms.ListBox $objListBox.Location =New-ObjectSystem.Drawing.Size(10,40) $objListBox.Size =New-ObjectSystem.Drawing.Size(260,20) $objListBox.Height =80 [void]$objListBox.Items.Add("atl-dc-001") [void]$objListBox.Items.Add("atl-dc-002") [void]$objListBox.Items.Add("atl-dc-003") [void]$objListBox.Items.Add("atl-dc-004") [void]$objListBox.Items.Add("atl-dc-005") [void]$objListBox.Items.Add("atl-dc-006") [void]$objListBox.Items.Add("atl-dc-007") $objForm.Controls.Add($objListBox) $objForm.Topmost =$True $objForm.Add_Shown({$objForm.Activate()}) [void]$objForm.ShowDialog() $x
各种字符串操作
字符连接
$strC = $strA+$strB
3.0好像不用+
字符串替换
-replace操作符
-replace,-ireplace,-creplace,i前缀表示字符串大小写不敏感(insensitive),c前缀表示字符串大小写敏感(case sensitive)
$strB = $strA -replace "hi!", "Hello"
字符串切割
"1;2;4;5;7;8" -split ';'
$c = "Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" $c -split ",", 5 —————————————————— Mercury Venus Earth Mars Jupiter,Saturn,Uranus,Neptune
$c = "Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" $c -split {$_ -eq "e" -or $_ -eq "p"} ---------------------------------------- M rcury,V nus,Earth,Mars,Ju it r,Saturn,Uranus,N tun
–F格式化字符串
格式化操作符 –F 能够将一个字符串格式化为指定格式,左边是包含通配符的字符串,右边是待插入和替换的字符串。 格式化操作符 -f 可以将数值插入到字符串,每一个通配符都有统一的结构 {index[,alignment][:format]}
Index: 索引编号用来识别把那个值用来替换通配符。例如你可能使用了多个通配符,或者同一个通配符使用了多次,甚至多种格式。此时,索引编号是唯一能够识别那个值将用来替换。另外两个选项Alignment和Format则作为辅助条件。 Alignment: 正数和负数,可以指定目标值是否左对齐或者右对齐。还可以支持数值以指定的宽度显示,如果数值的实际宽度大于指定宽度,则忽略指定宽度。如果数值宽度小于指定宽度,剩余的部分会以空白填充,这一选项非常利于制表。 Format: 数值可以被格式化成许多不同的类型,下面会预览这些你可能会用到一些格式概要。 格式化语句比较特殊,大小写敏感,这和PowerShell中其它语句的使用稍有不同 # 使用小写字母d:格式化 "Date: {0:d}" -f (Get-Date) Date: 2013/5/31 # 使用大写字母D:格式化 "Date: {0:D}" -f (Get-Date) Date: 2013年5月31
"{0:2}GB" -f $XXX
按指定次数重复字符串
"abc"*5
文件操作
New-Item
New-Item -Path E:\PSTest\NewDir -ItemType Directory –Force
创建一个目录
New-Item -Path E:\PSTest\NewDir\new.txt -ItemType File –Force
创建一个文件
Copy-Item
Copy-Item -Path E:\PSTest\NewDir\new.txt -Destination D:\ -PassThru
PassThru会强制PowerShell返回命令执行后的结果,方便查看命令是否执行成功
Copy-Item -Path E:\PSTest\NewDir -Destination D:\ -PassThru -Force –Recurse
将E盘中的一个目录复制到D盘,若存在则覆盖。请注意"Recurse"这个参数,只有加上这个参数PowerShell才会复制源目录中的所有子目录及其文件,否则只会复制源目录一个空壳
Move-Item
Move-Item -Path E:\PSTest\NewDir\new.txt -Destination E:\ -PassThru –Force
移动一个文件到根目录,若存在则覆盖,支持跨驱动器移动
Move-Item -Path E:\PSTest\NewDir -Destination E:\a\NewDir -PassThru –Force
不能跨驱动器移动目录
Out-File
常用参数
-FilePath "D:\x.txt"
-InputObject "adsfasdf"
-Encoding ASCII
有效值是“Unicode”、“UTF7”、“UTF8”、“UTF32”、“ASCII”、“BigEndianUnicode”、“Default”和“OEM”。默认值为“Unicode” 还有字节方式 "Byte"
实例
$XXX|Out-File -FilePath "d:\1.txt" -Encoding "ASCII"
Out-File -InputObject "asdfasdf" -FilePath "d:\2.txt" -Append
out-file -filepath C:\Test1\process.txt -inputobject $a -encoding ASCII -width 50
Get-Content
常用参数
-Path "D:\x.txt"
-Encoding ASCII
-TotalCount 3
读的总行数
-ReadCount 2
每次读的行数
实例
Get-Content -Path "d:\4.txt"
get-content c:\Logs\Log060912.txt -totalcount 50 | set-content sample.txt
(get-content cmdlets.txt -totalcount 5)[-1]
取第五行
Set-Content
相当于 >
常用参数
-Path "D:\x.txt"
-Value "adsfasdf"
-Encoding ASCII
实例
Set-Content -Paht "d:\5.txt" -Value "adsfadsf"
(get-content Notice.txt) | foreach-object {$_ -replace "Warning", "Caution"} | set-content Notice.txt
Get-Content 命令外面的圆括号可确保在 Get 操作完成后才开始 Set 操作。如果不带圆括号,则该命令将失败,因为它的两个函数将同时尝试访问同一文件。
Add-Content
相当于 >>
常用参数
-Path "D:\x.txt"
-Value "adsfasdf"
-Encoding ASCII
实例
add-content -path *.txt -exclude help* -value "END"
add-content -Path file1.log, file2.log -Value (get-date) -passthru
Clear-Content
参数
-Path
实例
Clear-Content -Path "d:\22.txt"
Remove-Item
Remove-Item -Path E:\PSTest\NewDir\new.txt
Remove-Item -Path E:\PSTest\NewDir
若不想提示就加上-Recurse参数,想提示加上-Confirm
Rename-Item
Rename-Item -Path E:\PSTest\NewDir\new.txt old.txt –PassThru
Invoke-Item
Invoke-Item C:\Windows\win.ini
Invoke-Item C:\Windows
Get-ChildItem
Get-ChildItem -Path "c:"
文件时间修改
$f = get-item .\test.txt $f.creationtime = [datetime]'2009/02/09 14:17:49 $f.lastwritetime = [datetime]'2012/02/09 14:17:49 $f.lastaccesstime = [datetime]'2010/02/09 14:17:49
正则表达式
运算符
"SourceString" -match "Pattarn" #不区分大小写 "SourceString" -imatch "Pattarn" #显式不区分大小 "SourceString" -cmatch "Pattarn" #区分大小 "SourceString" -notmatch "Pattarn" #不区分大小写不匹配
Select-String
Get-Command|Select-String -pattern "\w-\w"
Get-Command|Select-String -AllMatches "\w-\w"
[RegEx]类
[regex]::matches('aaa11bb2cde', '[a-z]+')
[regex]::Matches("ab3cdef4gh","\d",[System.Text.RegularExpressions.RegexOptions]::Multiline)
[System.Text.RegularExpressions.RegexOptions]::IgnoreCase )
$numberMatcher = [regex] "\d+" $numberMatcher.Matches("adsf234asdf233ad")
重点
贪婪与非贪婪
+? *? {n,}?
预查
正向肯定预查
[regex]::Matches("a1bc22de3fg4hi53jk","\d(?=f)")
正向否定预查
[regex]::Matches("a1bc22de3fg4hi53jk","\d(?!f)")
反向肯定预查
[regex]::Matches("a1bc22de3fg4hi53jk","(?<=e)\d")
反向否定预查
[regex]::Matches("a1bc22de3fg4hi53jk","(?<!e)\d")
后向引用
[regex]::Matches("a1bc22de3fg4hi53jk","(\d)\1")
分组
存储分组 ()
(?<XXX>pattern) matches.XXX 是名为XXX的分组 "ab1cd3ef4g" -match "(?<name>\d)" $Matches.name
$& 是所有的组
$1 第一个组
非存储分组
(?:pattern)
优先级
替换
[regex]::Replace("a1bc2de3fg4hi5jk","(\d)(\w)","`$2`$1")
[regex]::Replace("a1bc2de3fg4hi5jk","(\d)","$&$&")
mode modifier
[regex]::matches('aaa11BB2cde', '(?i)[a-z]+') 忽略大小写,一般是(?X)pattern 对后面的pattern起作用 (?i)te(?-i)st match test and TEst, but not teST or TEST. '(?-i)test' 就是不忽略大小写
(?m)^test$ is the same as using ^test$
[System.Text.RegularExpressions.RegexOptions]::IgnoreCase )
代码集
列网页链接
$ie = New-Object -com "InternetExplorer.Applicatio$ie.Visible= $false $ie.Navigate("http://www.baidu.com") do { Start-Sleep -s 2 } until ($ie.ReadyState -eq 4) $ie.Document.getElementsByTagName("a") | select-object href | format-list PowerShell3.0用下面的代码 $test = invoke-webrequest http://www.baidu.com $test.Links | % { write-host $_.href }
获取系统运行时间
$start = (Get-Process wininit).StartTime $end = Get-Date $runtime = New-TimeSpan -Start $start -End $end $rundays = $runtime.Days $runhours = $runtime.Hours $runmin = $runtime.Minutes Write-Host “开机时间为: $start ” Write-Host "您的系统已经运行了 $rundays 天 $runhours 小时 $runmin 分钟"
查看共享
FunctionfunLookUp ($intIN) { switch ($intIN) { 0 { $global:strRTN="Disk Drive" } 1 { $global:strRTN="Print Queue" } 2 { $global:strRTN="Device" } 3 { $global:strRTN="IPC " } 2147483648 { $global:strRTN="Disk Drive Admin" } 2147483649 { $global:strRTN="Print Queue Admin"} 2147483650 { $global:strRTN="Device Admin" } 2147483651 { $global:strRTN="IPC Admin" } } } $global:strRTN=$null $class="WIN32_Share" $computer="localhost" $aryProperty="type","name","allowMaximum","caption", ` "description","maximumAllowed","Path" $objWMI=Get-WmiObject-Class$class-computername$computer foreach($sharein$objWMI) { Write-Host ` " `nProperty values of Share: $($share.name) ------------------------- " foreach($propertyin$aryProperty) { if($share.$property-notlike"") { Write-Host$property:$share.$property } if($property-eq"type") { funLookup($share.$property) Write-Host$property"name:"$strRTN } } $Global:strRTN=$null }
Function FunWMI($strShare) { Get-WmiObject win32_share -Filter "type = $strShare" } if(!$args) { "you must supply an argument. Try ArgsShare.ps1 ?"} ELSE { $strShare = $args switch ($strShare) { "admin" { $strShare = 2147483648 ; funwmi($strShare) } "print" { $strShare = 2147483649 ; funwmi($strShare) } "file" { $strShare = 0 ; funwmi($strShare) } "ipc" { $strShare = 2147483651 ; funwmi($strShare) } "all" { Get-WmiObject win32_share } Default { Write-Host "You must supply either: admin, print, file, ipc, or all `n Example: > ArgsShare.ps1 admin" } } }
获取域角色
$wmi = get-wmiobject win32_computersystem "computer " + $wmi.name + " is: " switch ($wmi.domainrole) { 0 {"`t Stand alone workstation"} 1 {"`t Member workstation"} 2 {"`t Stand alone server"} 3 {"`t Member server"} 4 {"`t Back up domain controller"} 5 {"`t Primary domain controller"} default {"`t The role can not be determined"} }
获取磁盘信息
Function funArg() { switch ($args) { "all" { gwmi win32_logicalDisk } "c" { (gwmi win32_logicaldisk)[1] } "free" { (gwmi win32_logicaldisk)[1].freespace } "help" { $help = @" This script will print out the drive information for All drives, only the c drive, or the free space on c: It also will print out a help topic EXAMPLE: >GetDriveArgs.ps1 all Prints out information on all drives >GetDriveArgs.ps1 c Prints out information on only the c drive >GetDriveArgs.ps1 free Prints out freespace on the c drive "@ ; Write-Host $help } } } #$args = "help" funArg($args)
$aryComputers = "loopback", "localhost" Set-Variable -name intDriveType -value 3 -option constant #constant for local disk foreach ($strComputer in $aryComputers) {"Hard drives on: " + $strComputer Get-WmiObject -class win32_logicaldisk -computername $strComputer| where {$_.drivetype -eq $intDriveType}}
获取进程ID
$strProcess = "system" Get-Process | foreach ( $_.name ) { if ( $_.name -eq $strProcess ) { Write-Host "system process is ID : " $_.ID } }
获取服务
获取服务状态
Get-Service | Sort-Object status -descending | foreach { if ( $_.status -eq "stopped") {Write-Host $_.name $_.status -ForegroundColor red} elseif ( $_.status -eq "running" ) {Write-Host $_.name $_.status -ForegroundColor green} else {Write-Host $_.name $_.status -ForegroundColor yellow} }
-Name
Get-Service -Name "bits"
WMI Ping
[int]$intPing = 10 [string]$intNetwork = "127.0.0." for ($i=1;$i -le $intPing; $i++) { $strQuery = "select * from win32_pingstatus where address = '" + $intNetwork + $i + "'" $wmi = get-wmiobject -query $strQuery "Pinging $intNetwork$i ... " if ($wmi.statuscode -eq 0) {"success"} else {"error: " + $wmi.statuscode + " occurred"} }
获取USBHUB信息
Get-WmiObject win32_usbhub | foreach-object ` -begin { Write-Host "Usb Hubs on:" $(Get-Item env:\computerName).value } ` -process { $_.pnpDeviceID} ` -end { Write-Host "The command completed at $(get-date)" }
系统日志
写自定义日志
if(![system.diagnostics.eventlog]::sourceExists("ps_script")) { $strLog = [system.diagnostics.eventlog]::CreateEventSource("ps_script","Application") } $strLog = new-object system.diagnostics.eventlog("application",".") $strLog.source = "ps_script" $strLog.writeEntry("test from script") #管理员身份运行
写程序日志
$strProcess = get-WmiObject win32_process | select-object name | out-string if(![system.diagnostics.eventlog]::sourceExists("ps_script",".")) { $strLog = [system.diagnostics.eventlog]::CreateEventSource("ps_script","Application") } $strLog = new-object system.diagnostics.eventlog("application",".") $strLog.source = "ps_script" $strLog.writeEntry($strProcess)
导出日志
Get-EventLog application | Export-Clixml -Path c:\fso\applog.xml -Depth 2
Get-EventLog application > c:\fso\applog.txt
$strLog ="system" $strType="error" Get-EventLog $strLog | Where-Object { $_.entryType -eq $strType }
Get-EventLog -LogName system |Where-Object { $_.eventID -eq 1129 }
取得最新的日志
Get-EventLog -LogName application -Newest 10
$aryLogs = Get-EventLog -List $intNew = 5 foreach ($strLog in $aryLogs) { Write-Host -ForegroundColor green ` " $($strLog.log) Log Newest $intNew entries " Get-EventLog -LogName $strLog.log -newest $intNew }
(Get-EventLog application)[0] | format-list *
取得注册日志
$strLog = "application" Write-Host "The following sources are registered for the $strLog log: `n" Get-WmiObject win32_nteventlogfile -Filter "logfilename like '%$strLog%'" | foreach { $_.sources }
取得相关日志
$strLog = "system" $strText = "error" Get-EventLog -LogName $strLog | Where-Object { $_.message -match $strText }
Get-EventLog application | Where-Object { $_.source -like "*usb*" }
日志设置
$strLog = "application" $objLog = New-Object system.diagnostics.eventlog("$strLog") Write-Host ` " The current settings on the $($objlog.LogDisplayName) file are: max kilobytes: $($objLog.maximumKiloBYtes) min retention days: $($objLog.minimumRetentionDays) overflow policy: $($objLog.overFlowAction) "
删除日志
$source = "ps_script" if([system.diagnostics.eventlog]::sourceExists($source,".")) { $log = [system.diagnostics.eventlog]::LogNameFromSourceName($source,".") Write-Host "$source is currently registered with $log log." Write-Host -ForegroundColor red "$source will be deleted" [system.diagnostics.eventlog]::DeleteEventSource($source) } ELSE { Write-Host -ForegroundColor green "$source is not regisered" }
WMI登录设置
$wmiLog = Get-WmiObject win32_WMISetting $wmiLog.logginglevel = 2 $wmiLog.put()
错误处理
错误流重定向
2>
Get-Item "NoSuchDirectory" 2> Error.txt Get-Content .error.txt
$myerror = Remove-Item "NoSuchDirectory" 2>&1 #将其发送到与标准输出相同的目标位置 $myError.Exception $myError.InvocationInfo $myerror.FullyQualifiedErrorId $myError | select CategoryInfo,ErrorDetails,Exception,FullyQualifiedErrorId,InvocationInfo,PipelineIterationInfo,ScriptStackTrace
重定向有时也没必要,因为绝大多数Cmdltes都支持-ErrorVariable 参数。只要你将变量名称传递给-ErrorVariable,Powershell就会自动把出现的错误保存到这个变量中,并且这种保存机制不受ErrorAction配置的影响
Remove-Item "NoSuchDirectory" -ErrorVariable ErrorStore -ErrorAction "SilentlyContinue" $ErrorStore #此变量是一个数组
$LastExitCode
$lastexitcode---该变量包含了本地命令(比如ping.exe)的退出码。这个变量对于确定外部命令是否正确执行比较有用
$?
对于每个PowerShell命令(函数、脚本、内建指令段)来说,变量有两个取值:$true或者$false。如果该命令成功完成的话,PowerShell就把它设置成$true;否则就把它设置成$false
$ErrorActionPreference
(简称‘ea’)--- 当发生错误的时候,PowerShell用这个变量来确定应该采取哪种行动
Continue (默认值)---显示错误,但是继续处理 SilentlyContinue ---不显示错误并继续处理 Stop ---显示错误并停止处理 Inquire ---显示错误,并提示用户采取行动
$error
$error ---这是迄今为止拥有最多信息数量的对象,因为它包含了与错误有关的大部分数据。需要大家注意的重点是:$error实际上一个对象,这意味着它具有属性、方法,甚至类型---就像所有其他对象一样。把$error 输送到get-member后你可以看到这些信息
ErrorDetails ---提供错误的详细信息(通常是空的) Exceptions --监测出来的实际额外情况 TargetObject ---错误发生时操作执行所涉及的对象 InvocationInfo ---包含了运行命令的详细信息(比如行数,内建指令以及位置等)
处理方式
Try/Catch
这是一段代码的包装,基本原理为:“试试这个,如果失败了,再试试那个。”
Try { Do something…. Do more… <something breaks here> This code doesn't run } catch { "Whoops… something broke!" }
Try{ "Attempting to create new object $ob1" $a = new-object $ob1 "Members of the $ob1" "New object $ob1 created" $a | Get-Member } Catch{ [system.exception] "caught a system exception" }
$ob1 = "foo" "Begin test" $ErrorActionPreference = "stop" Try{ Get-Content foo "Attempting to create new object $ob1" $a = new-object $ob1 "Members of the $ob1" "New object $ob1 created" $a | Get-Member } Catch [System.Management.Automation.PSArgumentException]{ "invalid object" } Catch [system.exception]{ "caught a system exception" } Finally{ "end of script" }
Trap
这是一个关键字,在某种意义上说,其行为像一个函数。当终止错误发生的时候它会指定一些需要运行的声明
trap [[<error type>]] {<statement list>}
function TrapTest { trap {"Error found."} nonsenseString }
trap [System.Management.Automation.CommandNotFoundException] { "Command error trapped" }
trap [System.Exception] {"An error trapped"}
function test{ trap { "Other terminating error trapped" } trap [System.Management.Automation.CommandNotFoundException] { "Command error trapped" } 1/$null NonsenseString }
function function1 { trap { "An error: " } NonsenseString "function1 was completed" }
function break_example { trap {"Error trapped"; break;} 1/$null "Function completed." } function continue_example { trap {"Error trapped"; continue;} 1/$null "Function completed." }
各种对象
调用API
Add-Type
可以在 Windows PowerShell 会话中定义 .NET Framework 类。然后可将对象实例化(通过使用 New-Object cmdlet)并使用这些对象,就像使用任何 .NET Framework 对象一样
参数
Add-Type 1(共 1)对本文的评价是有帮助 - 评价此主题 向 Windows PowerShell 会话中添加 Microsoft .NET Framework 类型(一种类)。 语法 Add-Type -AssemblyName [-IgnoreWarnings] [-PassThru] [] Add-Type [-Name] [-MemberDefinition] [-CodeDomProvider ] [-CompilerParameters ] [-语言 { | | | }] [-命名空间 ] [-OutputAssembly ] [-OutputType ] [-ReferencedAssemblies ] [-UsingNamespace ] [-IgnoreWarnings] [-PassThru] [] Add-Type [-Path] [-CompilerParameters ] [-OutputAssembly ] [-OutputType ] [-ReferencedAssemblies ] [-IgnoreWarnings] [-PassThru] [] Add-Type [-TypeDefinition] [-CodeDomProvider ] [-CompilerParameters ] [-语言 { | | | }] [-OutputAssembly ] [-OutputType ] [-ReferencedAssemblies ] [-IgnoreWarnings] [-PassThru] [] 说明 使用 Add-Type cmdlet,可以在 Windows PowerShell 会话中定义 .NET Framework 类。然后可将对象实例化(通过使用 New-Object cmdlet)并使用这些对象,就像使用任何 .NET Framework 对象一样。如果将 Add-Type 命令添加到 Windows PowerShell 配置文件中,则在所有 Windows PowerShell 会话中都可使用该类。 可通过指定现有的程序集或源代码文件来指定类型,也可通过内联方式指定源代码或将源代码保存在变量中。甚至可以仅指定一种方法,此时,Add-Type 便可以定义并生成该类。可使用该功能来执行 Platform Invoke (P/Invoke) 以调用 Windows PowerShell 中的非托管函数。如果指定源代码,Add-Type 将编译所指定的源代码并生成包含新 .NET Framework 类型的内存中程序集。 可使用 Add-Type 的参数来指定替代语言、编译器(默认为 CSharp)、编译器选项、程序集依赖关系、类命名空间,以及该类型和所获得的程序集的名称。 参数 -AssemblyName 指定包括相应类型的程序集的名称。Add-Type 从所指定的程序集中获取相应类型。在基于程序集名称创建类型时需要此参数。 输入程序集的全称或简称(也称为“部分名称”)。在程序集名称中允许使用通配符。如果输入简称(即部分名称),Add-Type 会将其解析为全称,然后使用全称来加载程序集。 此参数不接受路径或文件名。若要输入程序集动态链接库 (DLL) 文件的路径,请使用 Path 参数。 是否为必需? true 位置? named 默认值 是否接受管道输入? false 是否接受通配符? true -CodeDomProvider 指定代码生成器或编译器。Add-Type 使用指定的编译器来编译源代码。默认为 CSharp 编译器。如果无法通过 Language 参数来指定所使用的语言,请使用此参数。所指定的 CodeDomProvider 必须可基于源代码生成程序集。 是否为必需? false 位置? named 默认值 CSharp 编译器 是否接受管道输入? false 是否接受通配符? false -CompilerParameters 指定用于源代码编译器的选项。这些选项未经修改就发送至编译器。 使用此参数,可以指示编译器生成可执行文件、嵌入资源或设置命令行选项,如“/unsafe”选项。此参数可实现 CompilerParameters 类 (System.CodeDom.Compiler.CompilerParameters)。 是否为必需? false 位置? named 默认值 是否接受管道输入? false 是否接受通配符? false -IgnoreWarnings 忽略编译器警告。使用此参数可阻止 Add-Type 将编译器警告作为错误处理。 是否为必需? false 位置? named 默认值 False 是否接受管道输入? false 是否接受通配符? false -语言 指定在源代码中使用的语言。Add-Type 使用该语言来选择正确的代码编译器。 有效值为:“CSharp”、“CSharpVersion3”、“VisualBasic”和“JScript”。默认值为“CSharp”。 是否为必需? false 位置? named 默认值 CSharp 是否接受管道输入? false 是否接受通配符? false -MemberDefinition 指定类的新属性或方法。Add-Type 可生成支持属性或方法所需的模板代码。 可使用该功能来执行 Platform Invoke (P/Invoke) 以调用 Windows PowerShell 中的非托管函数。有关详细信息,请参阅示例。 是否为必需? true 位置? 2 默认值 是否接受管道输入? false 是否接受通配符? false -Name 指定要创建的类的名称。基于成员定义生成类型时需要此参数。 类型名称和命名空间在一个会话中必须是唯一的。无法对类型进行卸载或更改。如果需要更改类型的代码,则必须更改名称或启动新的 Windows PowerShell 会话。否则,命令将失败。 是否为必需? true 位置? 1 默认值 是否接受管道输入? false 是否接受通配符? false -命名空间 指定类型的命名空间。 如果命令中没有包括此参数,则在 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 命名空间中创建该类型。如果在含有空字符串值或 $null 值的命令中包括此参数,则在全局命名空间中生成该类型。 是否为必需? false 位置? named 默认值 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 是否接受管道输入? false 是否接受通配符? false -OutputAssembly 在该位置为具有指定名称的程序集生成 DLL 文件。输入路径(可选)和文件名。允许使用通配符。默认情况下,Add-Type 仅在内存中生成程序集。 是否为必需? false 位置? named 默认值 是否接受管道输入? false 是否接受通配符? true -OutputType 指定输出程序集的输出类型。有效值为 Library、ConsoleApplication 和 WindowsApplication。 默认情况下,将不指定输出类型。 仅当该命令中指定了输出程序集时,此参数才有效。 是否为必需? false 位置? named 默认值 无 是否接受管道输入? false 是否接受通配符? false -PassThru 返回表示添加的类型的 System.Runtime 对象。默认情况下,此 cmdlet 将不产生任何输出。 是否为必需? false 位置? named 默认值 是否接受管道输入? false 是否接受通配符? false -Path 指定包含相应类型的源代码文件或程序集 DLL 文件的路径。 如果提交源代码文件,则 Add-Type 会编译这些文件中的代码并在内存中创建相应类型的程序集。在 Path 值中所指定的文件扩展名确定 Add-Type 使用的编译器。 如果提交程序集文件,Add-Type 将从该程序集中获取相应类型。若要指定内存中程序集或全局程序集缓存,请使用 AssemblyName 参数。 是否为必需? true 位置? 1 默认值 是否接受管道输入? false 是否接受通配符? false -ReferencedAssemblies 指定类型所依赖的程序集。默认情况下,Add-Type 引用 System.dll 和 System.Management.Automation.dll。除默认程序集以外,还会引用使用此参数指定的程序集。 是否为必需? false 位置? named 默认值 是否接受管道输入? false 是否接受通配符? false -TypeDefinition 指定包含类型定义的源代码。输入字符串或 here-string 格式的源代码,或输入包含源代码的变量。有关 here-string 的详细信息,请参阅 about_Quoting_Rules。 在类型定义中需包括命名空间声明。如果省略命名空间声明,您的类型可能会与其他类型或其他类型的快捷方式同名,从而导致意外覆盖。例如,如果定义的类型名为“Exception”,则使用“Exception”作为 System.Exception 的快捷方式的脚本将失败。 是否为必需? true 位置? 1 默认值 是否接受管道输入? false 是否接受通配符? false -UsingNamespace 指定类所需的其他命名空间。这与 C# 中的 Using 关键字很相似。 默认情况下,Add-Type 引用 System 命名空间。在使用 MemberDefinition 参数时,Add-Type 默认情况下还引用 System.Runtime.InteropServices 命名空间。除默认命名空间以外,还会引用使用 UsingNamespace 参数添加的命名空间。 是否为必需? false 位置? named 默认值 是否接受管道输入? false 是否接受通配符? false 此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters. 输入和输出 输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。 输入 无 不能通过管道将对象传递到 Add-Type。 输出 “无”或 System.RuntimeType 如果使用 PassThru 参数,则 Add-Type 返回表示新类型的 System.RuntimeType 对象。否则,此 cmdlet 将不产生任何输出。 说明 添加的类型仅存在于当前会话中。要在所有会话中使用这些类型,请将其添加到 Windows PowerShell 配置文件中。有关配置文件的详细信息,请参阅 about_Profiles。 类型名称(和命名空间)在一个会话中必须是唯一的。无法对类型进行卸载或更改。如果需要更改类型的代码,则必须更改名称或启动新的 Windows PowerShell 会话。否则,命令将失败。 某些语言的 CodeDomProvider 类(如 IronPython 和 JSharp)不会生成输出。因此,使用这些语言编写的类型将无法与 Add-Type 一起使用。 此 cmdlet 基于 CodeDomProvider 类。有关该类的详细信息,请参阅 Microsoft .NET Framework SDK。 示例 1 C:\PS>$source = @" public class BasicTest { public static int Add(int a, int b) { return (a + b); } public int Multiply(int a, int b) { return (a * b); } } "@ C:\PS> Add-Type -TypeDefinition $source C:\PS> [BasicTest]::Add(4, 3) C:\PS> $basicTestObject = New-Object BasicTest C:\PS> $basicTestObject.Multiply(5, 2) 说明 ----------- 这些命令通过指定存储在变量中的源代码,将 BasicTest 类添加到会话中。该类型具有一个名为 Add 的静态方法和一个名为 Multiply 的非静态方法。 第一条命令在 $source 变量中存储该类的源代码。 第二条命令使用 Add-Type cmdlet 将该类添加到会话中。由于它使用的是内联源代码,所以该命令使用 TypeDefinition 参数来指定 $source 变量中的代码。 其余命令使用新类。 第三条命令调用 BasicTest 类的 Add 的静态方法。它使用双冒号字符 (::) 来指定类的静态成员。 第四条命令使用 New-Object cmdlet 来实例化 BasicTest 类的实例。它将新对象保存在 $basicTestObject 变量中。 第五条命令使用 $basicTestObject 的 Multiply 方法。 示例 2 C:\PS>[BasicTest] | get-member C:\PS> [BasicTest] | get-member -static C:\PS> $basicTestObject | get-member C:\PS> [BasicTest] | get-member TypeName: System.RuntimeType Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone() Equals Method System.Boolean Equals FindInterfaces Method System.Type[] FindInt ... C:\PS> [BasicTest] | get-member -static TypeName: BasicTest Name MemberType Definition ---- ---------- ---------- Add Method static System.Int32 Add(Int32 a, Int32 b) Equals Method static System.Boolean Equals(Object objA, ReferenceEquals Method static System.Boolean ReferenceEquals(Obj C:\PS> $basicTestObject | get-member TypeName: BasicTest Name MemberType Definition ---- ---------- ---------- Equals Method System.Boolean Equals(Object obj) GetHashCode Method System.Int32 GetHashCode() GetType Method System.Type GetType() Multiply Method System.Int32 Multiply(Int32 a, Int32 b) ToString Method System.String ToString() 说明 ----------- 这些命令使用 Get-Member cmdlet 来检查 Add-Type 和 New-Object cmdlet 在上一个示例中创建的对象。 第一条命令使用 Get-Member cmdlet 来获取 Add-Type 添加到会话中的 BasicTest 类的类型和成员。Get-Member 命令表明它是从 System.Object 类派生的 System.RuntimeType 对象。 第二条命令使用 Get-Member 的 Static 参数来获取 BasicTest 类的静态属性和方法。输出显示已包含了 Add 方法。 第三条命令使用 Get-Member 来获取 $BasicTestObject 变量中存储的对象成员。这是使用具有 $BasicType 类的 New-Object cmdlet 创建的对象实例。 输出内容表明 $basicTestObject 变量的值是 BasicTest 类的实例,并且它包括名为 Multiply 的成员。 示例 3 C:\PS>$accType = add-type -assemblyname accessib* -passthru 说明 ----------- 该命令将类从 Accessibility 程序集添加到当前会话中。此命令使用 AssemblyName 参数来指定程序集的名称。甚至在您不能确定程序集名称或其拼写时,可以使用通配符来获取正确的程序集。 该命令使用 PassThru 参数来生成可表示已添加到会话中的类的对象,并在 $accType 变量中保存这些对象。 示例 4 C:\PS>add-type -path c:\ps-test\Hello.vb [VBFromFile]::SayHello(", World") # From Hello.vb Public Class VBFromFile Public Shared Function SayHello(sourceName As String) As String Dim myValue As String = "Hello" return myValue + sourceName End Function End Class C:\PS> [VBFromFile]::SayHello(", World") Hello, World 说明 ----------- 该示例使用 Add-Type cmdlet 来向当前会话中添加在 Hello.vb 文件中定义的 VBFromFile 类。在该命令的输出中会显示 Hello.vb 文件的文本。 第一条命令使用 Add-Type cmdlet 将 Hello.vb 文件中定义的类型添加到当前会话中。该命令使用 path 参数来指定源文件。 第二条命令将 SayHello 函数作为 VBFromFile 类的静态方法进行调用。 示例 5 C:\PS>$signature = @" [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); "@ $showWindowAsync = Add-Type -memberDefinition $signature -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru # Minimize the Windows PowerShell console $showWindowAsync::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 2) # Restore it $showWindowAsync::ShowWindowAsync((Get-Process -id $pid).MainWindowHandle, 4) 说明 ----------- 此示例中的命令演示了如何在 Windows PowerShell 中调用本机的 Windows API。Add-Type 使用 Platform Invoke (P/Invoke) 机制来从 Windows PowerShell 调用 User32.dll 中的函数。 第一条命令在 $signature 变量中存储 ShowWindowAsync 函数的 C# 签名。(有关详细信息,请参阅 MSDN Library 中的“ShowWindowAsync 函数”,网址为 http://go.microsoft.com/fwlink/?LinkId=143643。)要确保所得到的方法在 Windows PowerShell 会话中可见,请将“public”关键字添加到标准签名中。 第二条命令使用 Add-Type cmdlet 将 ShowWindowAsync 函数作为 Add-Type 创建的类的静态方法添加到 Windows PowerShell 会话中。该命令使用 MemberDefinition 参数来指定保存在 $signature 变量中的方法定义。 该命令使用 Name 和 Namespace 参数来指定类的名称和命名空间。它使用 PassThru 参数来生成表示类型的对象,并将该对象保存在 $showWindowAsync 变量中。 第三条和第四条命令使用新的 ShowWindowAsync 静态方法。该方法采用两个参数:窗口句柄和指定如何显示窗口的整数。 第三个命令调用 ShowWindowAsync。它使用具有 $pid 自动变量的 Get-Process cmdlet 来获取承载当前 Windows PowerShell 会话的进程。然后使用当前进程的 MainWindowHandle 属性和值“2”(表示 SW_MINIMIZE 值)。 为了还原窗口,第四条命令使用窗口位置的值“4”,它表示 SW_RESTORE 值。(SW_MAXIMIZE 是 3。) 示例 6 C:\PS>Add-Type -MemberDefinition $jsMethod -Name "PrintInfo" -Language JScript 说明 ----------- 此命令使用 Add-Type cmdlet 将方法从内联 JScript 代码添加到 Windows PowerShell 会话中。它使用 MemberDefinition 参数来提交存储在 $jsMethod 变量中的源代码。它使用 Name 变量来指定 Add-Type 为该方法创建的类的名称,使用 Language 参数来指定 JScript 语言。 示例 7 C:\PS>Add-Type -Path FSharp.Compiler.CodeDom.dll C:\PS> Add-Type -Path FSharp.Compiler.CodeDom.dll C:\PS> $provider = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider C:\PS> $fSharpCode = @" let rec loop n = if n print_endline (string_of_int n); loop (n-1) end "@ C:\PS> $fsharpType = Add-Type -TypeDefinition $fSharpCode -CodeDomProvider $provider -PassThru | where { $_.IsPublic } C:\PS> $fsharpType::loop(4) 4 3 2 1 说明 ----------- 此示例演示了如何使用 Add-Type cmdlet 将 FSharp 代码编译器添加到 Windows PowerShell 会话中。要在 Windows PowerShell 中运行此示例,必须具有使用 FSharp 语言安装的 FSharp.Compiler.CodeDom.dll。 示例中的第一条命令使用具有 Path 参数的 Add-Type cmdlet 来指定程序集。Add-Type 可获取程序集中的类型。 第二条命令使用 New-Object cmdlet 来创建 FSharp 代码提供程序的实例,并将结果保存在 $provider 变量中。 第三个命令保存 FSharp 代码,该代码在 $FSharpCode 变量中定义了 Loop 方法。 第四条命令使用 Add-Type cmdlet 将 $fSharpCode 中定义的公共类型保存在 $fSharpType 变量中。TypeDefinition 参数指定用于定义类型的源代码。CodeDomProvider 参数指定源代码编译器。 PassThru 参数指示 Add-Type 返回表示类型的 Runtime 对象,管道运算符 (|) 将 Runtime 对象发送到仅返回公共类型的 Where-Object cmdlet。由于 FSharp 提供程序生成非公共类型以支持所得到的公共类型,所以需使用 Where-Object 筛选器。 第五条命令将 Loop 方法作为存储在 $fSharpType 变量中的类型的静态方法进行调用。
VB
C#
注意事项
名字要与Win32 API的完全一样
函数除了要有相应的DllImport 类修饰外,还要声明成public static extern类型的
函数的返回值和参数类型要与Win32 API 完全一致
调用方式
[命名空间.名称]
对于重复的调用用这种方式
$Win32API = Add-Type -memberDefinition @" [DllImport("User32.dll")] public static extern int MessageBox(int h, string m, string c, int type); "@ -name "Windows" -namespace Win32Functions -passThru [Win32Functions.Windows]::MessageBox($null,"命名空间调用","MessageBox",0x00000004L) #namespace调用,命名空间在Console具有全局性,如果重复添加会提示错误 #也就是两次在Console中调用本脚本就会报错
Add-Type返回的对象
对于一次性的的调用用这种方式
$Win32API = Add-Type -memberDefinition @" [DllImport("User32.dll")] public static extern int MessageBox(int h, string m, string c, int type); "@ -name "Windows" -passThru $Win32API::MessageBox($null,"Add-Type对象调用","MessageBox",0x00000005L) #Add-type 对象不能有-namespace Win32Functions
.Net类库
直接调用
可用调用类库的静态方法属性 即不需要对象或者实例就有的方法属性
[System.Windows.Forms.MessageBox]::Show(".Net类库调用") #MessageBox
http://msdn.microsoft.com/en-us/library/aa302340.aspx API与.Net类库的调用关系
New-Object
调用返回对象的方法属性 有时候提示没有重载
# Native PowerShell version if ((test-path c:\windows\notepad.exe) -eq $true){ # do something interesting $PSFileInfo = Get-ItemProperty c:\windows\notepad.exe echo "PSFileInfo" $PSFileInfo } # .NET Version if ([System.IO.File]::Exists("C:\windows\notepad.exe") -eq $true){ # do something interesting $NETFileInfo = New-Object System.IO.FileInfo -ArgumentList "C:\windows\notepad.exe" echo "NETFileInfo" $NETFileInfo } $obj=New-Object System.Windows.Forms.MessageBox -ArgumentList "OpenFileDialog" $obj.Show()
调用Com
New-Object
$objExcel = New-Object -comobject Excel.Application
扫描服务写入mdb
$StrComputer = (New-Object -ComObject WScript.Network).computername $StrDomain = (New-Object -ComObject WScript.Network).Domain $strWMIQuery = "Select * from win32_Service" $objservice = get-wmiobject -query $strWMIQuery write-host -foreGroundColor yellow "Obtaining service info ..." foreach ($service in $objService) { if ($service.state -eq "running") { $strServiceName = $service.name $strStatus = $service.State $adOpenStatic = 3 $adLockOptimistic = 3 $strDB = "D:\services.mdb" $strTable = "runningServices" $objConnection = New-Object -ComObject ADODB.Connection $objRecordSet = new-object -ComObject ADODB.Recordset $objConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0; ` Data Source= $strDB") $objRecordSet.Open("SELECT * FROM runningServices", ` $objConnection, $adOpenStatic, $adLockOptimistic) $objRecordSet.AddNew() $objRecordSet.Fields.item("TimeStamp") = Get-Date $objRecordSet.Fields.item("strComputer") = $strComputer $objRecordSet.Fields.item("strDomain") = $strDomain $objRecordSet.Fields.item("strService") = $strServiceName $objRecordSet.Fields.item("strStatus") = $strStatus $objRecordSet.Update() write-host -foregroundColor yellow "/\" -noNewLine } } $objRecordSet.Close() $objConnection.Close()
共享写入Excel
$strPath="c:\fso\mySheet.xls" $objExcel=New-Object -ComObject Excel.Application $objExcel.Visible=-1 $WorkBook=$objExcel.Workbooks.Add() $sheet=$workbook.worksheets.item(1) $x=2 $strComputer = "." $objWMIService = Get-WmiObject win32_Share $sheet.Cells.item(1,1)=("Name of Share") $sheet.Cells.item(1,2)=("Description of Share") $sheet.Cells.item(1,3)=("Type of Share") ForEach ($objShare in $objWMIService) { $sheet.Cells.item($x, 1)=($objShare.Name) $sheet.Cells.item($x, 2)=($objShare.Description) $sheet.Cells.item($x, 3)=($objShare.Type) If($objShare.type -ne 0) { $sheet.Cells.item($x,3).font.colorIndex=3 # 32 is blue 16 silver/gray 8 is Aqua, 4 is green, 3 is red $sheet.Cells.item($x,3).font.bold=$true } $x++ } $range = $sheet.usedRange $range.EntireColumn.AutoFit() IF(Test-Path $strPath) { Remove-Item $strPath $objExcel.ActiveWorkbook.SaveAs($strPath) } ELSE { $objExcel.ActiveWorkbook.SaveAs($strPath) }
ADSI对象(活动目录)
Active Directory对象的概念
ADSI所提供的功能
Active Directory命名空间
创建和修改Active Directory对象
WMI对象(各种设备)
WMI命名空间的概念
WMI是作为一个基本的数据库存在于Windows系统中的。我们可以连接到WMI服务请求查询其中所包含的信息。WMI包括了系统方方面面的信息
WMI所提供的功能
• 机器信息:制造商、型号、序列号等
• BIOS信息
• OS信息
• CPU信息:种类、制造商、速度、版本
• 服务器内存总量
• 磁盘信息:容量、格式等
• 网络信息:MAC、IP等
• 其他
查看WMI命名空间
get-wmiObject -list -namespace "root\cimv2"
get-wmiobject -class win32_process -namespace "root\cimv2" | get-member
使用WMI命名空间
Get-WmiObject Win32_NetworkAdapterConfiguration | Get-Member -MemberType Methods | Format-List
$Network=get-wmiobject win32_NetworkAdapterConfiguration | where{$_.IPEnabled -eq "true"} foreach($NIC in $Network){ $NIC.EnableDHCP() $NIC.SetDNSServerSearchOrder() }
gwmi win32_service -credential administrator -computer Remote-PC
连接远程机器
$cred = get-credential mydomain\administrator
WMI的类
get-wmiObject -list -namespace "root\cimv2"
"get-wmiobject"
get-wmiobject -class win32_bios -namespace "root\cimv2"
查询WMI
gwmi -query "select * from win32_service where name='alerter'"
$strClass = "usb" Get-WmiObject -List | Where { $_.name -like "*$strClass*" } | ForEach-Object -begin ` { Write-Host "$strClass wmi listings" Start-Sleep 3 } ` -Process ` { Get-wmiObject $_.name }
.net对象
调用类的静态方法属性
[ClassName]::MethodName(param list)
[ClassName]::PropertyName
调用对象的方法属性
$obj.MethodName(Param list)
$obj.PropertyName
New-Object
$R=New-Object System.Random $R.Next()
(New-Object Net.WebClient).DownLoadString("http://www.hao123.com")
powershell没有默认加载的库 对于没有加载的库,用的时候要先加载
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")#加载最新的库 #在脚本中可能会出问题,应该用Load("完整路径") $image = new-object system.Drawing.bitmap source.gif $image.save("source_converted.jpg","JPEG")
New-Object 类 构造函数参数
如果构造函数参数为数组会报错
$math=[system.math] $math::Min(1,10)
$namespace="system.collections.{0}" $arraylist=New-Object ($namespace -f "arraylist") $queue=New-Object ($namespace -f "queue")