1. 程式人生 > >powershell 學習筆記

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 | % {

[email protected]{} } { $h[$_] += 1 }
?       // 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