powershell 學習筆記
命令模式 //字串不需要加引號,除變數和圓括號中的內容外的所有內容均可看作字串
copy users.txt accounts.txt
copy $src $dest
write-host 2+2
表示式模式 //以最高級別語言分析方法來進行分析:若為數字,則原樣表示該數字;若為字串,則需要加引號
2+2
"Hello" + " world"
$a = "hi"
$a.length * 13
混合模式 //模式發現過程從圓括號內開始
Write-Host ((Get-Date) - (Get-Date).date)
命令解析優先順序
別名
函式
cmdlet
指令碼
可執行檔案
正常檔案
" " //雙引號中將嘗試替換匹配的變數值
' ' //單引號中不進行變數值替換
@" "@ // "here string",其中可包含任意字元(包括回車和引號),將嘗試替換匹配的變數值
@' '@ // "here string",其中可包含任意字元(包括回車和引號),不進行變數值替換
{ } //大括號中將不進行變數值替換,型別為 System.Management.Automation.ScriptBlock
//注意:" "、' '、{ } 有時可以達到相同的效果,但是它們完全不一樣
$field = { $var = 1 }
( ) //求值,用於混合模式
$($Name)
$( ) //求值並返回結果為物件陣列
$( ) //返回空值
$(1,2,3) //返回包含 1、2、3 的陣列
$(0,1,2)[1]
$(Get-Alias a*) 返回表示式的計算結果
@( ) //同 $( )
[ ] //型別運算子
[int]
[single]
[double]
[string]
:label //標籤,用於控制結構或程式碼塊
· //換行符號
. // Dot Sourcing,允許在當前作用域(而不是本地作用域)中執行函式、指令碼塊和指令碼
// . 後可以使用 [string] 或者 [ScriptBlock]
. { $var = value; }
. "func"
& //呼叫運算子或者說是函式轉義運算子
// & 後可以使用 [string] 或者 [ScriptBlock]
& { $var = value; } //程式碼塊 ScriptBlock 可以作為無名函式用 & 運算子呼叫
& "func"
Function Cook ( $i, $f ) { &$f $i; } //函式名可以作為引數傳遞,然後用 & 運算子進行轉義
Cook Chicken { Param($x) Alert "Boom $x" }
"Hi" | & { begin { "Beginning" } process { write-host "Boom $_" } end { "Ending" } }
% // ForEach-Object
$words | % {
? // Where-Object
轉義序列
`0 //空值
`a //警報
`b //退格
`f //換頁
`n //新行
`r //回車
`t //製表符
`v //垂直引號
`` // "`"
````[ // "["
'``[' // "[",' ' 阻止了轉義的進行
數字常量
1kb // 1024
1mb
1gb
1e3 // 1000
0xFFFF // 65535
Windows PowerShell 自動變數
$$ //前一命令列的最後一個標記
$? //上一命令的布林狀態
$^ //前一命令列的第一個標記
$_ //當前管道物件
$Args //為指令碼或函式指定的引數
$ConfirmPreference
$ConfirmPreference = "low"
$Error //先前命令中的錯誤陣列
$Error[0] //前一次錯誤
$Error[1] //倒數第二次錯誤
$Foreach //引用 foreach 迴圈中的列舉器
$Home //使用者的主目錄
$Host //引用宿主 POWERSHELL 語言的應用程式
$Host.privatedata // current colors
$Input //通過管道傳遞給指令碼的物件的列舉器
$LastExitCode //上一程式或指令碼的退出程式碼
$Matches //使用 –match 運算子找到的匹配項的雜湊表
$OFS //分隔符
[string][char[]]"power" // [char[]] 轉型為 [string] 時會用 $OFS 作為字元之間的分隔符
$OutputEncoding // When we pipe output data from PowerShell cmdlets into native applications, the output encoding from
// PowerShell cmdlets is controlled by the $OutputEncoding variable, which is by default set to ASCII.
$OutputEncoding = [Console]::OutputEncoding
$PSHome // Windows PowerShell 的安裝位置
$profile //標準配置檔案(可能不存在)
$StackTrace // Windows PowerShell 捕獲的上一異常
$Switch // switch 語句中的列舉器
萬用字元
* //與 0 或更多出現的字元匹配
? //僅與一個字元匹配
[ - ]
型別
空型別
[void]
數值型別
[byte] typeof(byte)
[decimal] typeof(decimal)
[double] typeof(double)
[float] typeof(float)
[int] typeof(int)
[long] typeof(long)
[single] typeof(float)
字元型別
[char] typeof(char)
[string] typeof(string)
布林型別
[bool] typeof(bool)
集合型別
[array] typeof(System.Array)
typeof(System.Object[])
[hashtable] typeof(System.Collections.Hashtable)
其它
[psobject] typeof(System.Management.Automation.PSObject)
[ref] typeof(System.Management.Automation.PSReference)
[regex] typeof(System.Text.RegularExpressions.Regex)
[scriptblock] typeof(System.Management.Automation.ScriptBlock)
[switch] typeof(System.Management.Automation.SwitchParameter)
[type] typeof(System.Type)
[wmi] typeof(System.Management.ManagementObject)
[wmiclass] typeof(System.Management.ManagementClass)
[wmisearcher] typeof(System.Management.ManagementObjectSearcher)
[xml] typeof(System.Xml.XmlDocument)
$var = [xml] "<top><a>one</a><b>two</b><c>3</c></top>"
$var.top
$var.top.a
$var.top.a = "13"
作用域 //可用於變數及函式
function global:prompt { }
global //全域性作用域中的變數對所有作用域均可見
script //指令碼作用域中的變數只對該指令碼檔案中的所有作用域可見
local //本地作用域中的變數僅在當前作用域及其子域中可見
private //私有作用域變數僅對當前作用域可見
變數 //可以定義作用域及型別
[void] $var //可以阻止變數 $var 的輸出
[void] [Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms" )
[int] $global:var = 1.0
[int[]] $global:var = (1,2)
[regex] $regex = "/s{1}" //正則表示式類
$global:var = [int]1.0 // var 無型別
[float] [int] $var = 1 // var 是 float 型別
([DateTime]"1/1/2007" -[datetime]::now).days
${C:/TEMP/testfile.txt} = "string" //寫入檔案
${C:/TEMP/testfile.txt} += "string" //追加寫入檔案
${function:func} = {}
$block = { Get-Process; $a=1; } //變數可以儲存 code block
$type = [string] // type 為 System.RuntimeType 型變數
$MsgBox = [Windows.Forms.MessageBox]
$MsgBox::show("Hello world","Demo Msg Box",$button,$icon)
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog | Get-Member -MemberType Method
$null //空變數,佔位用
$object = $null //刪除變數的值,並不等價於 Remove-Variable var
($grp.Member).add($NewUserDN) > $NULL //也可用於進行重定向操作
$null = Get-Command help
呼叫 method、Property
$object.Property
$object.method()
$object.$methodnamestring.Invoke()
foreach ( $method in "ToUpper", "ToLower", "GetType" ) { $s.$method.Invoke() }
[ static object ]::Property
[ static object ]::method()
取得物件
$object | Get-Member
[ static object ] | Get-Member -Static
$var.gettype()
$var.gettype().fullname
bool 值
$TRUE //非空字串("false"除外);所有不等於 0 的數字;長度大於 1 的陣列;長度為 1,其元素為 TRUE 的陣列 ;對所有物件的引用
$FALSE //空字串或字串 "false" ;所有等於 0 的數字 ;長度為 0 的陣列 ;長度為 1,其元素為 FALSE 的陣列;空值
陣列
@( ) //空陣列
@(2) // 1 個元素的陣列
1,(2,3),"4" //陣列包含陣列
$array //陣列內的所有元素
$array[0]
$array[-1] //最後一個元素
$array[-2] //倒數第二個元素
$array[1][2] //對二維陣列進行索引
$array[2..20]
$array[20..2]
$array[-2..-20]
$array[-20..-2]
Get-Member -inputobject $array //針對陣列 array
$array | get-member //針對陣列中的每個元素
關聯陣列(雜湊表)
@{ } //建立空雜湊表
@{foo=1;bar=2} //建立並初始化雜湊表
$hash //雜湊內的所有元素
$hash.foo
$hash["foo"]
$hash.psbase.keys //返回鍵值陣列
$hash.psbase.keys | sort { $hash[$_] }
運算子 //根據第一個引數的型別選擇過載運算子
比較運算子 //用於字串、整型
-eq、-lt、-gt、-le、-ge、-ne
-ieq //不區分大小寫
-ceq //區分大小寫
-like
"file.doc" -like "f*.doc"
-notlike
-contains
1,2,3 -contains 1
-notcontains
邏輯運算子
-and、-or、-not、!
陣列運算子
–contains
1,2,3,5,3,2 –contains 3 //陣列中是否包含 3
-eq、-lt、-gt、-le、-ge、-ne
1,2,3,5,3,2 –eq 3 //返回所有等於 3 的元素
賦值運算子
=、+=、-=、*=、/=、%=
字串運算子
+ //連線兩個字串
* //按特定次數重複字串
"2" * 30
-f //設定字串格式(.NET 格式說明符)
"{0:N2}" -f 4671.60 //輸出格式為 4,671.60
"{0:F2}" -f 4671.60 //輸出格式為 4671.60
"{0:x}" -f 10 //輸出格式為十六進位制 a
"{0:X}" -f 10 //輸出格式為十六進位制 A
"{0,-12:N2}{1}string{0}" -f 77, 88 //輸出格式為 77.00 88string77,12 表示 77 對應的整個欄位長度為 12 個字元
"{0,12:N2}{1}string{0}" -f 77, 88 //輸出格式為 77.0088string77,12 表示 77 對應的整個欄位長度為 12 個字元
-replace //替換運算子
"abcd" –replace "bc", "TEST"
-match //正則表示式匹配
$note -match '([A-G#]{1,2})(/d+)' | out-null
-like //萬用字元匹配
型別操作運算子
-is //型別鑑別器
$var -is [int]
-as //型別轉換器
$var = 1 -as [string]
其它運算子
..
$ips = 1..254 | ForEach-Object -Process {"192.168.1." + $_}
[int][char]"a"..[int][char]"z"
, //連線運算子,形成陣列
$contents = "Prefix", "Suffix"
sum 1,2,3 // 1,2,3 作為陣列引數
-band //二進位制與
-bor //二進位制或
-bnot //二進位制非
結構
break
continue // break、continue 可用於程式碼塊、函式、指令碼
exit
exit 0
exit 31492
for
[:label] for ( [初始值]; [條件]; [迭代值] ) { }
for ( $i = 0; $i –lt 5; $i++ ) { Write-Object $i; }
for ( $i = 0; $i -lt $array.length; $i++ ) { Alert $array[$i]; }
foreach
[:label] foreach ( $var in set ) { }
foreach ( $var in $array ) { Write-Output $var }
Expression | foreach { }
Get-Process | foreach { write-output $_ }
function //函式是可以巢狀的;函式的返回值是所有計算輸出的結果,即返回的實際上是一個數組
//注意:如果去掉 function func 則為無名函式,呼叫時需要使用 & 運算子
function func { write-output $args[0]; return 0; } //匿名引數
function func ( [string]$label = "default label", [int]$start = 0 ) { BEGIN { } PROCESS { } END{ } }
func "label" 1 // func ( "label", 1 ) 的呼叫方法是錯誤的
func -label "label" -start 1
func -start 1 -label "label"
function func { param ( $var ) if ( $var -gt 17 ) { return $true } else { return $false } }
function func
{ Param ( $var )
Begin
{ # Only gets process at the Beginning
# Normally include Variable creation and functions
}
Process
{ # Gets process for each object in the pipe (if ones exist)
Write-Host "Hello $_";
}
End
{ # Always get processed once at the end
}
}
${function:func} = {}
filter //編寫帶有 PROCESS 指令碼塊的函式的速記方式
filter MyFilter ( [int]$start = 0 ) { $_.name }
if
if ( condition ) { } elseif ( condition) { } else { }
param //用於定義程式碼塊或指令碼的引數列表
return //可以返回的物件是 變數、cmdlet、函式、可執行程式或指令碼檔案
//如果返回的物件是 cmdlet、函式、可執行程式或指令碼檔案則會先進行展開計算再返回值
// return 的作用其實只是引起一個計算動作並退出而已
switch //在該指令碼中可以使用變數 $_,$_ 表示當前正在計算的值。如果在 switch 中使用了陣列,則將測試該陣列的所有元素
$var = "word1", "word2", "word3";
Switch -regex ( $var )
{ "word1" { "Multi-match Exact " + $_; continue; };
"w.*2" { "Pattern match Exact " + $_; };
default { "Multi-match Default " + $_; };
}
Switch ( $var )
{ "F" { continue; };
"C" { continue; };
"R" { continue; };
"W" { continue; };
}
throw //為指令碼提供的功能等同於 ThrowTerminatingError API 為 cmdlet 提供的功能
//接受字串、異常或 ErrorRecord 作為引數
throw "Danger, Danger"
trap
trap [ExceptionType] // [ExceptionType] 可選,如果沒有 [ExceptionType] 則表示對任何型別
{ if ( ... )
{ write-host "An error occured: "
write-host "ID: " $_.ErrorID
write-host "Message: "$_.Exception.Message
continue; # 從導致 trap 的指令碼語句之後的下一語句繼續;
# $? 將更新,但不生成任何錯誤記錄
}
else ( ... )
{ # do something
Break; # 再次引發異常
}
# 不執行 $ErrorActionPreference 設定中指定的任何操作
}
util
do { } until ( condition )
while
[:label] while ( condition ) { }
do { } while ( condition )
靜態類
System.Console
[console]::Beep($freq, $duration)
[Console]::OutputEncoding
System.Environment //用於當前程序
[System.Environment] | Get-Member -Static
System.Math //數學運算
[System.Math]::Sqrt(9)
[System.Math]::Property
[System.Math]::method( )
[System.Math] | Get-Member -Static
Windows PowerShell 驅動器
Alias
Alias:
Certificate
Cert:
Environment
Env:
$env:path
$env:path += ";newdirectory"
FileSystem
C:
Function
Function:
Registry //登錄檔項中的項被認為是它們所在項的屬性,使用 Get-ItemProperty cmdlet 可以檢索它們
HKLM: // HKEY_LOCAL_MACHINE
HKCU: // HKEY_CURRENT_USER
Variable //所有的變數均為物件
Variable:
標準引數
幫助引數
-?
cmdlet -? //等價於 get-help cmdlet
通用引數 //由 Windows PowerShell 引擎進行控制,cmdlet 實現這些引數時,它們的行為方式將始終相同
-Debug
-ErrorAction
-ErrorVariable
-OutBuffer
-OutVariable
-PassThru //打印出結果以進行確認
-Verbose
-Warn
-whatif //不執行命令就告訴你命令執行結果
-WhatIfConfirm
建議引數 // Windows PowerShell 核心 cmdlet 對類似引數使用標準名稱
//儘管引數名稱的使用不是強制的,但存在明確的用法指南以鼓勵標準化
-CaseSensitive
-Exclude
-Force
-Include
-PassThru
-Path
alias
cat/type Get-Content
cd/chdir Set-Location
clear/cls Clear-Host
copy/cp Copy-Item
del/rm/rmdir/erase Remove-Item
diff Compare-Object
dir/ls Get-ChildItem
echo/write Write-Output
h/history Get-History
kill Stop-Process
lp Out-Printer
md/mkdir New-Item
mount New-PSDrive
move/mv Move-Item
popd Pop-Location
ps Get-Process
pushd Push-Location
pwd Get-Location
r Invoke-History
ren Rename-Item
sleep Start-Sleep
sort Sort-Object
標準別名
動詞
Get g
Set s
名詞
Item i
Location l
Command cm
cmdlet //名稱組成:verb-noun。注意 function 也很有可能具有該名稱結構,比如 clear-host
*-Acl
Get-Acl
Set-Acl
*-Alias
Get-Alias
Get-Alias cls
Get-Alias | Where-Object {$_.Definition -eq "Set-Location"}
Set-Alias
Set-Alias -Name gi -Value Get-Item
Set-Alias gh Get-Help
Set-Alias np c:/windows/notepad.exe
*-Command
Get-Command
Get-Command //獲取所有的 cmdlet
Get-Command * //返回所有可呼叫項的列表
Get-Command *-service
Get-Command -Name New-PSDrive -Syntax //檢視命令語法
引數
-CommandType
Get-Command -CommandType alias
Get-Command -CommandType function
Get-Command -Commandtype externalscript
-Name
Get-Command -Name Clear-Host
-Noun
Get-Command -Noun service
-Syntax
Get-Command -Syntax *-service
-Verb
Get-Command -Verb get
*-Content
Add-Content
Get-Content // Get-Content 已將從檔案讀取的資料視為一個數組,檔案內容的每行上有一個元素
Get-Content -Path C:/boot.ini
(Get-Content -Path C:/boot.ini).Length
$Computers = Get-Content -Path C:/boot.ini
Set-Content
*-Credential
Get-Credential
*-Date
Get-Date
*-Debug
Set-PSDebug
Set-PSDebug -Strict //切換至 strict 模式
Write-Debug
*-ExecutionPolicy
Get-ExecutionPolicy
Set-ExecutionPolicy
Set-ExecutionPolicy remotesigned
*-Host
Out-Host //將資料直接傳送到控制檯
Out-Host -Paging
Get-ChildItem -Path C:/ | Out-Host -Paging
Read-Host
$var = Read-Host "What directory do you want to start at?"
*-Item
Copy-Item
Copy-Item -Path C:/New.Directory -Destination C:/temp //只複製容器
Copy-Item -Path C:/New.Directory -Destination C:/temp -Recurse //複製容器及其內容
Copy-Item -Filter *.txt -Path c:/data -Recurse -Destination c:/temp/text
Copy-Item -Path 'HKLM:/SOFTWARE/Microsoft/Windows/CurrentVersion' -Destination hkcu:
Copy-Item -literalpath thumb[1].jpg junk.jpg
-Force //強制覆蓋
Get-ChildItem
Get-ChildItem -Path C:/Windows
Get-ChildItem -Path C:/Windows/?????.log
Get-ChildItem -Path C:/Windows -Recurse -Include *.dll -Exclude [a-y]*.dll
Get-ChildItem -Path hkcu:/
-Exclude
-Force //強制列出隱藏項、系統項,包括登錄檔中的隱藏項、系統項
-Include
-Name //僅顯示 name 項
-Recurse
Get-Item
Get-ItemProperty
Get-ItemProperty -Path hklm:/SOFTWARE
Get-ItemProperty -Path hklm:/Software -Name DevicePath
Invoke-Item //對檔案或資料夾執行預設操作,其效果與在 Windows 資源管理器中雙擊該項的效果相同
Invoke-Item C:/WINDOWS
Move-Item
Move-Item -Path C:/temp/New.Directory -Destination C:/ -PassThru
New-Item
New-Item -Path c:/temp/New.Directory -ItemType Directory
New-Item -Path C:/temp/Newfile.txt -ItemType file
New-Item -Path HKLM:/SOFTWARE/Microsoft/Test //由於所有的登錄檔項都是容器,只需提供顯式路徑即可
New-ItemProperty
New-ItemProperty -Path hklm:/Software -Name PowerShellPath -PropertyType String -Value $PSHome
-PropertyType
Binary //二進位制資料
DWord //一個有效的 UInt32 數字
ExpandString //一個可以包含動態擴充套件的環境變數的字串
MultiString //多行字串
String //任何字串值
QWord // 8 位元組二進位制資料
Remove-Item
Remove-Item alias:ls
Remove-Item C:/temp/New.Directory -Recurse
Remove-Item -Path 'hkcu:/key with spaces in the name'
Remove-Item -Path HKCU:/CurrentVersion/* -Recurse
//刪除 HKCU:/CurrentVersion 中的所有子項但不刪除 HKCU:/CurrentVersion 本身
Remove-ItemProperty
Remove-ItemProperty -Path HKLM:/SOFTWARE/Microsoft/Windows/CurrentVersion -Name PSHome
Rename-Item
Rename-Item -Path C:/file1.txt fileOne.txt
Rename-ItemProperty
Rename-ItemProperty -Path HKLM:/SOFTWARE/Microsoft/Windows/CurrentVersion -Name PowerShellPath -NewName PSHome
*-Location
Get-Location
Pop-Location // popd
Push-Location // pushd
Push-Location -Path Temp //將當前位置壓入棧並且前進到 Temp 位置
Set-Location
Set-Location -Path C:/Windows
Set-Location -Path HKLM:/SOFTWARE
*-Member
Add-Member //增加的物件是針對物件例項而不是針對型別
Get-Member
Get-Process | Get-Member
Get-Process | Get-Member -MemberType Properties
Get-Member -inputobject $array //針對陣列 array
$array | Get-Member //針對陣列中的每個元素
( Get-Member -inputobject $object $x ).MemberType //取得成員型別
( "hello" | Get-Member split ).definition //取得成員定義
[System.Environment] | Get-Member -Static // System.Environment 是靜態類,檢視是必須加 static 引數
-MemberType 引數
AliasProperty
All
CodeMethod
CodeProperty
MemberSet
Method
Methods
NoteProperty
ParameterizedProperty
Properties
Property
PropertySet
ScriptMethod
ScriptProperty
*-Object
ForEach-Object //對多個物件重複同一任務
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process { ($_.FreeSpace)/1024.0 }
//注意:$_.FreeSpace 的值並沒有被改變
$events | foreach-object -begin { get-date }
-process { out-file -filepath events.txt -append -inputobject $_.message }
-end { get-date }
New-Object //建立 .NET 和 COM 物件
New-Object -TypeName System.Diagnostics.EventLog //建立物件引用
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application //通過 ArgumentList 引數指定建構函式引數
New-Object -ComObject WScript.Shell // WScript.Shell 是 ProgId
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule( $Principal, $Right, "Allow" )
Sort-Object
Get-WmiObject Win32_SystemDriver|Sort-Object State,Name|Format-Table Name,State,Started,DisplayName -AutoSize -Wrap
引數
-Descending
Tee-Object
Get-Process notepad | Tee-Object -variable proc | Select-Object processname, handles
Get-Process | Tee-Object -filepath C:/Test1/testfile2.txt
Where-Object //從管道中刪除物件
Get-Alias | Where-Object -FilterScript {$_.Definition -eq "Set-Location"}
1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}
Get-WmiObject Win32_SystemDriver | Where-Object { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") }
Get-Process | Where-Object -FilterScript { $_.Responding -eq $false } | Stop-Process
Get-ChildItem -recurse | Where-Object {$_.extension -eq ".Log"}
*-Path
Convert-Path //將路徑從 Windows PowerShell 路徑轉換為 Windows 路徑
Join-Path //將路徑和子路徑合併到單個路徑中,提供程式將提供路徑分隔符
Resolve-Path //解析路徑中的萬用字元並顯示路徑內容
( resolve-path docs:/junk.txt ).ProviderPath
Split-Path //返回指定的路徑部分
Test-Path //確定路徑的所有元素是否存在
*-Process
Get-Process
Get-Process -Name power*, exp*
Get-Process -Id PID
Stop-Process
Stop-Process -Name t*, e* -Confirm // Confirm 引數強制進行提示
*-PSDrive
Get-PSDrive
Get-PSDrive -PSProvider FileSystem
Get-PSDrive -PSProvider Registry
New-PSDrive
New-PSDrive -name MyDocs -psprovider FileSystem -root "$home/My Documents"
New-PSDrive -name Uninstall -PSProvider Registry -Root HKLM:/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall
Remove-PSDrive
Remove-PSDrive -Name Office
*-PSProvider
Get-PSProvider
*-Service
Get-Service
(get-service alerter).canpauseandcontinue
(get-service schedule).stop( )
Restart-Service
Get-Service | Where-Object -FilterScript { $_.CanStop } | Restart-Service
Start-Service
Stop-Service
Suspend-Service
*-Transcript
Start-Transcript
Stop-Transcript
*-Variable
Get-Variable
Get-Variable –scope 1 var //從父作用域獲取值
Get-Variable –scope 2 var //從祖父作用域獲取值
Remove-Variable
Remove-Variable var //等價於 $var = $null
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
*-WmiObject
Get-WmiObject //獲取 WMI 物件
Get-WmiObject -List //檢索所有類名稱
Get-WmiObject -List -ComputerName 192.168.1.29 //從指定計算機檢索 wmi 資訊
Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . //獲得類引用
( Get-WmiObject -List | Where-Object -FilterScript { $_.Name -eq "Win32_OperatingSystem" } ) //獲得類例項
Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName .
( Get-WmiObject -Class Win32_OperatingSystem -ComputerName . ).InvokeMethod( "Win32Shutdown", 0 )
Export-*
Export-Alias
Export-Clixml
Export-Console
Export-Console file
Export-Csv
Format-* //格式化輸出檢視,都使用同一引數名稱 Property 來指定要顯示的屬性
Format-Custom
Format-List // Format-List cmdlet 以列表的形式顯示物件,並在單獨行上標記和顯示每個屬性
Get-Process -Name powershell | Format-List
Get-Process -Name powershell | Format-List -Property ProcessName, FileVersion, StartTime, Id
Get-Process -Name powershell | Format-List -Property *
Format-Table
Get-Process -Name powershell | Format-Table -Property Path, Name, Id, Company
Get-Process -Name powershell | Format-Table -Property Path, Name, Id, Company -AutoSize
Get-Process -Name powershell | Format-Table -Property Path, Name, Id, Company -AutoSize -Wrap
Get-Process -Name powershell | Format-Table -Property Path, Name, Id -GroupBy Company -AutoSize -Wrap
Format-Wide //預設情況下,Format-Wide cmdlet 僅顯示物件的預設屬性。與每個物件相關聯的資訊將顯示在單獨一列中
Get-Process -Name powershell | Format-Wide -Property Id
Get-Command | Format-Wide -Property Name -Column 1 //強制只進行 1 列的顯示
Get-*
Get-Help
Get-Help cmdlet //等價於 cmdlet -?
Get-Help *-Service
Get-Help about_* //顯示有關 Windows PowerShell 中的概念性主題的資訊,概念性幫助主題以 about_ 字首開頭
Get-Help provider
Get-Help registry
引數
-detailed
-examples
-full
-parameter totalcount
Invoke-*
Invoke-Expression //執行以字串形式提供的 Windows PowerShell 表示式
Invoke-History //從會話歷史記錄中執行命令
Invoke-Item //對指定項呼叫特定於提供程式的預設操作
Invoke-Item C:/Test/word.doc
Measure-*
Measure-Command //度量執行指令碼塊和 cmdlet 所用的時間
Measure-Object //度量物件的特徵及其屬性
Out-* //重定向資料,Out cmdlet 應始終出現在管道末尾
Out-File
Get-Process | Out-File -FilePath processlist.txt
Get-Process | Out-File -FilePath processlist.txt -Encoding ASCII
Get-Process | Out-File -FilePath processlist.txt -Width 2147483647
Get-Process > processlist.txt
Out-Null //放棄其接收的任何輸入,但不會放棄錯誤輸出
Out-Printer //列印資料。如果未提供印表機名稱,則 Out-Printer cmdlet 將使用預設印表機
Select-*
Select-Object //建立新的自定義物件,包含的屬性是從用於建立他們的物件中選擇的,物件的方法則保持不變
Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name, FreeSpace
Get-WmiObject Win32_LogicalDisk|Select-Object Name,FreeSpace|ForEach-Object {$_.FreeSpace = ($_.FreeSpace)/1024.0; $_}
Select-String //識別字符串中的模式
write-*
Write-Error //將物件寫入錯誤管道
Write-Host //使用主機使用者介面來顯示物件
write-output //將物件寫入成功管道
$data = @( get-service | write-output ) //將結果中的成功輸出寫入變數 $data
function
Clear-Host
help
man
more
Get-Command | more
more c:/boot.ini
prompt
TabExpansion //控制 Tab 擴充套件
學習疑問:
1. 如何任意顯示某個物件的method並使用它呢(已結)?
2. 獲取可解除安裝程式的命令列字解除安裝符串該怎麼在powershell中使用呢?
一. PowerShell常用快捷鍵
F7 :顯示曾經輸入的命令歷史記錄,用上下箭頭可逐個選定再次執行。
ALT+F7 :清除命令歷史記錄。
ESC :清除當前輸入的所有字元。
CTRL+END :清除從游標到行尾的內容。
CTRL+C / CTRL+BREAK :終止命令的執行。
↑ :向上查詢歷史命令。
↓ :向下查詢歷史命令。
二. 資源列表
1.www.powershell.com
:可下載powershell plus工具,比微軟提供powershell工具方便,後者沒有聯想功能。
2.forums.microsoft.com/china
3.PowerShell網誌:vista.itech.net
4.安裝PowerShell: www.microsoft.com/downloads
5. PowerShellPowerShell 開發組博克http://blogs.msdn.com/PowerShell/
6. PowerShell新聞組Microsoft.Public.Windows.PowerShell
7. 指令碼中心
http://www.microsoft.com/technet ... /msh.mspxPowerShell
8.
三. 什麼是PowerShell
PowerShell是系統管理和指令碼語言發展的未來。
它是微軟提供的命令列介面的互動式Shell環境(新一代命令解析器)和指令碼語言,使命令列使用者和指令碼編寫者(通過對COM物件的編寫來實現眾多功能)都可以利用.NET FrameWork的強大功能(如.NET FrameWork的類庫---FCL),幫助管理員完成彈性化和自動化的工作。
PowerShell是構建於.NET上的,所以安裝需要.NET FrameWork v2.0的支援。
PowerShell是基於物件的,命令的輸出即位物件。
PowerShell安裝在%systemroot%/system32/下
四. PowerShell的變數與引數
Powershell中的變數應理解為物件,而非文字。
定義變數的符號:$ 。如定義變數var用$var。為變數賦值$var = 123 $var1 = abd。還可以將變數嵌入到變數中去,如$var2 = “$var $var1”,$var2的值是 123 abd,如果是$var2 = ‘$var $var1’,則$var $var1被當成字串賦給了$var2。記住單引號和雙引號的區別。
對於資料型別可以不定義和宣告。
檢視所有變數:get-variable
檢視對變數可操作的命令集:get-command –noun varibale
常用系統變數:$pshome $home $profile
變數的四種模式:local script global private。
例:對環境變數的相應操作
Get-childitem env:
例:對環境變數的具體引用
$env:os
#說明CMD.EXE中的系統環境變數仍然可在powershell中使用
- :引數引導符,比如有一引數Name,則書寫時必須是 -Name
通用引數包括:WhatIf Confirm Verbose Debug Warn ErrorAction ErrorVariable
OutVariable OutBuffer,它們都是由powershell引擎控制的,每次cmdlet
實現這些引數時,它們的行為始終相同。
-Syntax :獲得cmdlet的語法,如get-process –syntax
重要引數說明
-noun 可以獲得影響同一型別物件的一系列命令
-passthru 可以看到命令的執行過程
-whatif 可以預覽命令可能導致的後果,該引數可以實現對prototype原型模式的引用,不是每個cmdlet都可以使用該引數的.
-credential 指定使用者帳戶名稱
-eq 等於運算子,加I –ieq表示不區分大小寫比較;-ceq 區分大小寫比較。
五.PowerShell的cmdlets與技巧
cmdlets命名規則:[動詞-名詞]
單個的cmdlets只能完成單任務,要完成複雜的任務必須通過管道 | 來完成。| 除了完成前1個cmdlets的執行結果到下1個cmdlets的傳遞作用,還起到命令的連線作用,即命令可以分行書寫,便於閱讀。
| :是併發執行的。
Aliases :別名。如gps=get-process sort=sort-object ft=format-table,可自定義命令的別名,命令為Get-Alias -Name gi -Value Get-Item,注意,系統自定義的別名如gi gcm scm等不能被更改。
命令縮寫:為便於記憶,Set用S,Get用G,Item用I,Command用CM。如get-command=gcm;get- wmiobject=gwmi etc.
Get-command :獲得所有可用的cmdlets,注意不包括aliases function script等。
例:想獲得alias/ function /script命令的詳細資訊
get-command –commandtype alias/function/externalscript
get-aliases :獲得所有命令的aliases。
get-help :獲得幫助。
例:獲得命令的幫助資訊和它的語法
get-help –name get-command –full/-detail -syntax
#-name :可以省略
get-process -?
例:help或man分屏顯示命令的幫助資訊
help get-service 或 man get-service
例:利用more函式來分屏顯示
get-process | more
#more也可以讀取檔案的內容分屏顯示,如more c:/test.txt
例:顯示概念性主題的幫助資訊
get-help about_*
#about_ :表示概念性主題的字首
get-help about_where
#顯示特定概念主題 where 的幫助資訊
例:get-command *_service
#獲得有關service操作的cmdlets
#_可以去掉,寫成*service,但不能去掉*,寫成get-command service,會出錯的!
例:獲得影響同一物件型別的一系列命令
get-command –noun service
#-noun :該引數可獲得影響同一物件型別的一系列命令,類似get-command *service
例:get-service | get-member
#如果要充分了解get-service的物件結構,可通過|將該命令輸出到get-member上
例:獲得某命令輸出物件的某些
get-process –name powershell | format-table –property processname,fileversion,starttime,name,id,company,path –autosize -wrap –groupby company
# -property 對於獲取輸出物件的資訊很有用!
# -autosize表示自動調整列寬
# -wrap表示顯示不下的列自動換行
#-width 2147483647防止表格因寬大而被截斷
# -groupby用於控制表格輸出,基於指定的屬性值分組,易於顯示很大的難於顯示的表
# -autosize和-wrap連用顯示效果不錯,但很消耗系統資源,建議將寬度比較小的#property如name放到最後比較好
#如果想顯示所有property可用*表示
#
例:獲得某服務/程序的具體資訊
get-service –name alerter/get-process -name powershell
例:列出動詞get的所有命令
get-command –verb get
#verb :引數的意思
例:列出當前目錄下的資料夾和檔案
get-childitem
#get-childitem c:/ 列出C盤下的目錄和檔案
#get-childitem c:/ | out-host 將C盤下的目錄和檔案輸出到螢幕上,如果輸出資訊很多,該操作很消耗CPU和記憶體,可通過-paging引數來單屏輸出。
#out-null 遮蔽輸出;out-printer 列印輸出
例:輸出控制命令format-wide/format-list/format-table/format-custom
例:輸出控制命令out-host/out-null/out-printer/out-file -Encoding ASCII –width 2147483647
get-process | format-table | out-file –filepath c:/test.txt
#將get-process輸出到c:/test.txt上
#注意out-file預設將建立unicode, -Encoding ASCII是將檔案改為ASCII,便於使用
#ASCII檔案的工具處理輸出
#-width 2147483647防止表格因寬大而被截斷
例:要檢視get-process的物件結構
get-process | get-member | out-host –paging
例:要檢視get-process的物件結構中某一型別資訊
get-process | get-member –membertype property
# MemberType 允許使用以下值:AliasProperty、CodeProperty、Property、NoteProperty、ScriptProperty、 Properties、PropertySet、Method、CodeMethod、ScriptMethod、Methods、 ParameterizedProperty、MemberSet 和 All。
探索發現
Get-Help, Get-Command
Get-Member :檢視“物件的結構”,很重要。
面向物件的小命令
Compare, Group, Measure, Select, Sort, Tee, Where
格式控制
Format-(Custom, List, Table, Wide)
面向任務的命令
程序:get/stop(-process)
系統服務:get/start/stop/suspend/resume/restart(-service)
事件日誌:get-eventlog
CLI(命令列介面)中的主要命令(????---不理解---??????)
– Shell Functions (CLI 可用程式碼)
– PowerShell Scripts (.PS1)
– Native commands (.EXE, .BAT, etc.)
使用Whanif預覽執行結果:比如關閉某程序會對系統產生影響,就用它先預覽一下。
$? :測試命令的執行成功與否。
重點:
並不是所有符合“動詞-名詞”命令規範都是PowerShell的cmdlet,例如clear-host,它是power-shell的內部函式。可通過get-command –name clear-host來判定其commandtype是function還是cmdlet。
除了cmdlet是PowerShell內建命令外,aliases function scirip 可執行檔案和已註冊檔案型別處理程式的外部檔案都歸於powershell的命令。
PowerShell中的命令沒有聯想功能,但可通過TAB來擴充套件,條件是輸入“動詞+連字元-”之後,按TAB鍵就會自動找第一個匹配的命令,如果不是需要的,可再通過TAB來完成”。
六.對檔案系統操作的命令
get-location #獲得當前目錄
set-location –path c:/ #將當前目錄更改為c:/,但沒有任何過程提示
set-location -path c:/ -passthru ##將當前目錄更改為c:/,有過程提示
set-locaiton //server/共享目錄 #server遠端伺服器
push-location -path “local settings” #將當前目錄壓入堆疊,並將目錄轉到local settings下
push-location -path temp #將當前目錄壓入堆疊,並將目錄轉到temp
pop-location -passthru #恢復被壓入堆疊的目錄,可通過它彈出最近使用過的目錄
cd –path hkcm:/software #將當前目錄改為hkcm:/software
powershell用名詞 項 表示驅動器下的內容,如果上檔案系統驅動器,則項可以是“資料夾 或 檔案 或 powershell的驅動器”。
對項常用操作命令:new-item rename-item copy-item remove-item invoke-item
invoke-item :執行項,它是有登錄檔中預設應用程式的處理程式(類似關聯程式)
例:invoke-item c:/1.txt
# 呼叫notepad.exe開啟1.txt,因txt預設關聯程式是notepad.exe
invoke-item c:/windows
# 等同於“雙擊開啟windows目錄”,關聯資源管理器
invoke-item c:/test.bat
# 執行bat
例:新建1.txt #new-item –path c:/1.txt –itemtype file/directory
例:將C盤下的1.txt重新命名為D盤下的2.txt
rename-item –path c:/1.txt d:/2.txt
# 該命令錯誤,因為rename不能將目錄移動,只能在本目錄下重新命名
# 正確:move-item –path c:/1.txt –destination d:/2.txt –passthru #可看具體移動過程
例:copy某目錄
copy-item –path c:/new –destination c:/temp
# 注意,如果new下有內容,則內容是無法拷貝到temp下,不加引數只複製容器
copy-item –path c:/new –destination c:/temp –recurse –force –passthru
# -recurse表示將容器內的內容也拷貝過去
例:刪除某目錄
remove-item –path c:/temp –recurse
# 如果沒有-recurse,刪除目錄需要確認
# 在不同命令下,-recurse有不同含義
get-command –noun item #獲得項的所有操作命令
get-childitem :用來列舉“資料夾/檔案/登錄檔”的。
例:set-location [-path] c:/windows
get-childitem [–name[ [-force[
get-childitem -recurse
#將當前目錄定位到c:/windows
# 列舉當前目錄下所有的檔案(夾),但不包括子資料夾
# -name表示按名稱篩選,即只顯示檔名
# -force表示顯示隱藏資料夾
# -recurse表示列舉目錄下所有的檔案(夾),包括所有子資料夾和子資料夾下的檔案
如果需要更好的篩選,可以使用 –exclude -include
例:查詢/system32下的WINDOWS時間服務的DLL,它是w開頭,中間有32字樣
get-children –path c:/windows/system32/w*32*.dll –recurse –exclude *[9516]*.dll
# 使用-exclude *[9516]*.dll是為了排除與“win95或16位windows相容的DLL
# 但是我在自己的機器上沒有使用-exclude也沒有顯示有關與“win95或16位windows
# 相容的DLL,我想這根windows的使用環境有關,設計語句畢竟要嚴謹和考慮全面
例:get-childitem –path c:/windows/*.dll –recurse –exclude [a-y]*.dll
#該語句不會返回任何結果,因為[a-y]*.dll中的萬用字元會排除所有DLL
#get-childitem –path c:/windows –include *.dll –recurse –exclude [a-y]*.dll
萬用字元
* ? 和[ ]
其中[ ] 表示闊住匹配的字元
例:get-childitem [-path] c:/windows/[xz]*
#表示枚舉出c:/windows目錄下所有以x或z打頭的檔案
例:get-childitem [-path] c:/windows/?????.log
#表示枚舉出c:/windows下所有5個任意字元的log檔案
七.WMI物件操作
WMI是系統管理的核心技術。WMI類描述可管理的資源,很多類有很多屬性。
get-wmiobject –list [–computername name/ip] #獲得本地或遠端可用的WMI類資源
預設下get-wmiobject使用root/imv2名稱空間,如果需要指定名稱空間,必須使用-namespace
例:get-wmiobject –list –computernaem 192.168.1.1 –namespace root
例:具體使用某個WMI類win32_operatingsystem
get-wmiobject –class win32_operatngsystem –namespace root –computername
# 自己寫的命令,錯誤在win32_operatngsystem少了i,root應root/cimv2
get-wmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 –ComputerName .
# . 表示WMI的樣式,代表計算機名稱
# 如get-wmiobject沒有引數,預設第一個引數是class;引數namespace預設名稱空間
# 是root/cimv2;針對本地操作引數computername可以省略
#該命令列可簡寫get-wmiobject win32_operatingsystem
可檢視類的更多屬性
get-wmiobject win32_operatingsystem | get-member –membertype property
檢視非預設屬性
get-wmiobject win32_operatingsystem | Format-Table -Property TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles
利用萬用字元縮寫
get-wmiobject win32_operatingsystem | Format-table –Property total*,free*
#將table改為list,增強結果可讀性
利用where-object cmdlet管道篩選物件(利用比較運算子來進行)
在管道中,用 $_ 表示管道中的物件;用-表示比較運算子的字首;用{}括住指令碼塊;用引數-filterscript進行過濾。
例:Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName,pathname
該語句等同於
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
使用foreach-object cmdlet 對多個物件實施重複操作
例:Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0}
使用select-object對物件進行選擇
例:get-wmiobject –class win32_logicaldisk | select-object –property name,freespace | get-member
使用sort-object排序
例:get-wmiobject –class win32_systemdriver | sort-object –property state,name | format-table –property name,state,started,displayname –autosize
#對format-tabel中輸出的state和name property排序
#descending倒序排序
五. .NET物件的操作
一些元件有.NET Framework和COM介面,powershell允許使用這些元件來擴充套件和增強系統管理工作
.NET Framework是一個類庫,包含很多類,如System.Diagnostics.EventLog,該類可管理事件日誌。
例:$applog=new-object –typename system.diagnostics.eventlog –argumentlist application,computername/ip
#將物件儲存在變數中,便於呼叫
#沒有-argumentlist,能建日誌,但為空,加上引數就能建立對特定日誌的管理
#輸入變數$applog就可以看到日誌個數
#–argumentlist application將application作為引數傳遞給引數-argumentlist,起到建構函式
#作用
# computername/ip訪問遠端日誌
get-eventlog :檢視日誌
例:獲得物件的方法 / 屬性
$application | get-member –membertype method/property
#其中獲得一個方法為 clear
清除日誌資訊
$application.clear()
#()必須加,clear()表示method,為了區分同名的property
例:檢視applicatio最新的三個日誌
get-eventlog –logname application –newest 3
#日誌型別還有system security
八..COM(元件物件模型)物件的操作
COM元件包括WSH包含的庫和Active X應用程式,new-object可以操作這些元件
New-object –comobject wscript.shell #建立COM物件
# 還可建立WScr