PowerShell 基本語法筆記

最近工作上的需要,用了 PowerShell 語法來處理,幾乎各式各樣的花式需求都可以達成,怪不得百敬老師非常推薦 PowerShell ,功能十分強大呀,只可惜學習資源比較零碎,所以特別紀錄一下最近用到的語法,避免很快忘記又查了老半天XD

數字處理

  1. 比較大小

    $a -gt $b #($a 是否大於 $b)
    

字串處理

  1. 字串分割

    • 1-1.

      $$serveritem -split ',' 
      
    • 1-2.

      $serveritem.Split(',')
      
  2. 檢查是否為空值 (string.IsNullOrWhiteSpace)

    [string]::IsNullOrWhiteSpace($serveritem.ExcludeFolder)
    
  3. 比對字串開頭

     $stringVariable.StartsWith('startString','CurrentCultureIgnoreCase')
    
  4. 字串比對

     $stringVariable -eq "Value"
    

檔案處理

  1. 檔案內容轉成 json

    Get-Content -Raw -Path $filelocation | ConvertFrom-Json
    
  2. 檔案壓縮與解壓縮

    • PowerShell v5

      • 壓縮

        • 語法

          Compress-Archive -Path $sourceFolder -DestinationPath $archiveFile
          
        • 實際範例

          Compress-Archive -Path D:\Downloads\Demo -DestinationPath D:\Downloads\demo.zip
          
      • 解壓縮

        • 語法

          Expand-Archive -Path $archiveFile -DestinationPath $targetFolder
          
        • 實際範例

          Expand-Archive -Path D:\Downloads\demo.zip -DestinationPath D:\Downloads\testPS
          
    • other

      • 壓縮

        • 語法

          Add-Type -AssemblyName 'System.IO.Compression.Filesystem'
          [System.IO.Compression.ZipFile]::CreateFromDirectory($folderSource,$fileDestination)
          
        • 實際例範

          $folderSource='D:\Downloads\Demo'
          $fileDestination='D:\Downloads\demo.zip'
          
          Add-Type -AssemblyName 'System.IO.Compression.Filesystem'
          [System.IO.Compression.ZipFile]::CreateFromDirectory($folderSource,$fileDestination)
          
      • 解壓

        • 語法

          Add-Type -AssemblyName 'System.IO.Compression.Filesystem'
          [System.IO.Compression.ZipFile]::ExtractToDirectory($fileSource, $folderDestination)
          
        • 實際範例

          $fileSource='D:\Downloads\demo.zip'
          $folderDestination='D:\Downloads\testPS'
          Add-Type -AssemblyName 'System.IO.Compression.Filesystem'
          [System.IO.Compression.ZipFile]::ExtractToDirectory($fileSource, $folderDestination)
          

List 處理

  1. 多個 List 取交集或是聯集

    $a = (1,2,3,4)
    $b = (1,3,4,5)
    
    • 1-1. 聯集

      $a + $b | select -uniq    #union
      
    • 1-2. 交集

      $a | ?{$b -contains $_}   #intersection
      
  2. List 加入 item

    • 2-1. 宣告個空的 List

      $a = New-Object System.Collections.ArrayList
      
    • 2-2. 加入項目

      $a.Add('data')
      $a.Add('test')
      

Credential 相關

  1. 指定 Credential

    #用來儲存密碼(僅需輸入一次,會加密儲存)
    read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt 
    #取出密碼(以下兩句效果相同)
    $pass = ConvertTo-SecureString -String (Get-Content C:\securestring.txt)  
    #$pass = cat C:\securestring.txt | convertto-securestring  
    #使用 username 及 密碼  建立 credential
    $Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "AD\username",$pass    
    
  2. 取得密碼明碼

    $cred.GetNetworkCredential().Password
    

Windows 服務相關

  1. 取得服務狀態

    Get-Service -Name "serviceName" #Get-Service -Name "aspnet_state"
    
  2. 停用服務

    Stop-Service -Name "aspnet_state"
    
  3. 啟用服務

    Start-Service -Name "aspnet_state"
    

IIS 相關

  1. AppPool

    • 1-1. 取得特定 AppPool 狀態

      Get-WebAppPoolState -Name "appPoolName" 
      
    • 1-2. 停用 AppPool

      Stop-WebAppPool -Name "appPoolName"
      
    • 1-3. 啟用 AppPool

      Start-WebAppPool -Name "appPoolName"
      
  2. Website

    • 2-1. 取得特定網站狀態

      Get-WebsiteState -Name "websiteName"
      
    • 2-2. 停用特定網站

      Stop-Website -Name "websiteName"
      
    • 2-3. 啟用特定網站

      Start-Website -Name "websiteName"
      

動態組成指令

$ExecutionContext.InvokeCommand.NewScriptBlock(" /XD $parameter")

遠端執行

  • Invoke-Command

    • 語法

      Invoke-Command –ComputerName Production1 {$env:COMPUTERNAME}
      
    • 傳遞其他參數語法

      Invoke-Command -ComputerName $Computer -ScriptBlock {param($comp) write-host "This script is running on machine: $Comp" } -ArgumentList $Computer
      
  • New-PSSession

    New-PSSession –ComputerName Production1
    Enter-PSSession {sessionID}
    

無線網路服務

  1. 確認無線網路服務的狀態

    Get-WindowsFeature *Wireless*
    
  2. 安裝無線網路服務

    Install-WindowsFeature -Name Wireless-Networking
    
  3. 啟動服務

    net start WlanSvc
    

參考資料

  1. passing array of strings into function
  2. Arrays
  3. Windows PowerShell: When to Choose Workflow Versus Script Functions
  4. Creating a Workflow by Using a Windows PowerShell Script
  5. Invoke-Command
  6. POWERSHELL 常見問題 (繁體中文)
  7. 如何在遠程伺服器上運行PowerShell命令?
  8. PowerShell - Testing if a String is NULL or EMPTY
  9. 執行遠端命令
  10. Using the Get-Service Cmdlet
  11. How to pass a param to script block when using invoke-command
  12. 基本操作手冊參考
  13. Windows PowerShell 5.0