PowerShell 常用指令筆記


  1. Server Manage
    1. General
      1. Run Scripts Without Execution Policy Limits
      2. 將現在的日期時間存入 clipboard
      3. Where / Where-Object / ?
      4. ForEach / If / Range
      5. Import-Csv / Foreach / Foreach-Object
      6. 產生 Guid
      7. 列出資料夾內所有的檔案路徑、大小、最後存取時間 (ls)
    2. Network
      1. 向 DNS 查詢特定 IP 的主機名稱或者從 FQDN 查詢 IP,相較於 ping -a 只能查詢單筆主機名稱,DNS查詢的資訊更完整。
      2. Request Http Source
      3. 使用 Powershell 寄送電子郵件 (send-mailmessage)
    3. Wmi Series
      1. 取得伺服器磁碟空間
      2. 取得伺服器 login user profile
      3. 取得伺服器作業系統
      4. 取得伺服器 CPU 核心資訊
      5. 取得記憶體資訊
      6. 取得伺服器 IP 與網卡資訊
      7. 取得伺服器的 Model 可以分辨伺服器機型與是否為虛擬機器。若是虛擬機器 Model 會顯示 Virtual Machine。
      8. 取得伺服器磁碟及使用空間
      9. 取得伺服器已經 File Sahres
      10. 取得伺服器安裝的應用程式
      11. 取得伺服器已經安裝的 KB HotfixId
      12. 取得伺服器安裝的 .NET Framework Version
  2. Automation
    1. Hash Value
      1. 取得檔案 Hash Value With SHA-256 (Get-FileHash)
      2. Get File Hash Value 一鍵完成版本 (Get-FileHash)
      3. 批次將資料夾內的檔案轉換為 hashed value (batchly Get-FileHash)
  3. System Administration
    1. 移除本機群組中的使用者 (移除 Administrators 中的成員)
  4. 參考資源

最近參與的課程講師都習慣除 GUI 操作外補充使用 Powershell 做同樣結果的方法,慢慢的也對 Powershell 有一點 sense,同時 Linkedin Learning 上豐富的入門教學也讓學習 Powershell 更平易近人。身為微軟生態系的開發者,學習 Powershell 讓作業自動化、規模化也是必然的成長路徑。於是從本篇筆記開始展開自己的 Powershell 實務之旅 👨‍💻

logo

Server Manage

General

基本的控制筆記,部分的 condition / loop / variables 功能可以取代 python scripts ,使用原生的服務解決問題。

Run Scripts Without Execution Policy Limits

powershell.exe -ExecutionPolicy Bypass -File "c:\temp\script.ps1"

將現在的日期時間存入 clipboard

[system.datetime]::now | scb

Where / Where-Object / ?

Get-Service | where-object {$_.status -eq 'running'}
Get-Service | where {$_.status -eq 'running'}
Get-Service | ? {$_.name -like 'xbox*'}

ForEach / If / Range

foreach ( $node in 1..10 )
{
  if ($node -gt 5)
  {
    "$node"
  }
}

Import-Csv / Foreach / Foreach-Object

$arr = @()

Import-Csv 1.csv | Foreach-Object {
    $arr += $_.name
}

$arr.ForEach({"This is Mr/Ms/Mrs $_."})

產生 Guid

[guid]::newguid()
new-guid

列出資料夾內所有的檔案路徑、大小、最後存取時間 (ls)

Get-ChildItem -Recursve | % {$_.FullName + "," + $_.Length + "," + $_.LastAccessTime}

Network

向 DNS 查詢特定 IP 的主機名稱或者從 FQDN 查詢 IP,相較於 ping -a 只能查詢單筆主機名稱,DNS查詢的資訊更完整。

resolve-dnsname ip
resolve-dnsname FQDN

Request Http Source

Invoket-RestMethod -Uri
irm -uri

使用 Powershell 寄送電子郵件 (send-mailmessage)

send-mailmessage `
-to address@mail.com `
-from address@mail.com `
-subject "Mail Sent From Powershell"  `
-smtpserver mail.server  `
-bodyashtml "<div style='color:red'>Hello</div><br/>World"  `
-encoding utf8

Microsoft Docs

Wmi Series

這個部分是 Powershell 的強項,原生且完美地和作業系統互動,同時易於管理遠端伺服器。

取得伺服器磁碟空間

get-wmiobject win32_logicaldisk -computername . | out-gridview

取得伺服器 login user profile

gwmi win32_networkloginprofile -computername . | ogv

取得伺服器作業系統

gwmi win32_operatingsystem | select-object pscomputername, OSArchitecture, caption

取得伺服器 CPU 核心資訊

gwmi win32_processor -computername . | select-object pscomputername, name, numberof*

取得記憶體資訊

可以使用 win32_computersystem 取得記憶體資訊。

$name = '.'
gwmi win32_physicalmemory -computername $name | measure capacity -sum `
| select @{name="Memory (GB)"; expression={$_.Sum / [Math]::Pow(1024, 3)}}

另也可以用 win32_computersystem 來取得:

gwmi win32_computersystem -computername . `
| select @{name="Memory (GB)"; expression={$_.TotalPhysicalMemory / [Math]::Pow(1024, 3)}}

如果想要知道記憶體的製造商:

gwmi win32_physicalmemory -computername $name `
| select manufacturer, @{name = "Capacity"; expression={$_.Capacity / [Math]::Pow(1024, 3)}}

其中 Microsoft Corporation 為 Hyper-V 虛擬機所顯示的記憶體製造商名稱。

取得伺服器 IP 與網卡資訊

Get-WmiObject win32_networkadapterconfiguration `
-filter "ipenabled = 'True'" `
-ComputerName . | select caption, ipaddress | convertto-json

取得伺服器的 Model 可以分辨伺服器機型與是否為虛擬機器。若是虛擬機器 Model 會顯示 Virtual Machine

gwmi win32_computersystem -cn $serverGroup

取得伺服器磁碟及使用空間

gwmi win32_logicaldisk -computername $serverGroup `
| select systemname, DeviceId, `
@{n="FreeGB";e={$_.freespace / 1gb}}, `
@{n="MaxGB";e={$_.size / 1gb}}, @{n="%";e={[math]::round($_.freespace/$_.size * 100, 2)}} `
| where {$_.freegb -ne 0} `
| sort-object -property "freegb" -descending `
| ft -auto

如果要取得磁碟的製造商資訊:

gwmi win32_diskdrive `
| select Model, @{name="Size (GB)";expression={$_.size / [Math]::Pow(1000, 3)}}

取得伺服器已經 File Sahres

gwmi win32_share -cn $serverGroup | select pscomputername, name, caption | ft -auto

取得伺服器安裝的應用程式

gwmi win32_product -cn $serverGroup | select pscomputername, name, version, vendor  | ft -auto

取得伺服器已經安裝的 KB HotfixId

gwmi Win32_QuickFixEngineering -cn $serverGroup | Sort-Object description

取得伺服器安裝的 .NET Framework Version

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(?!S)\p{L}'} | Select PSChildName, version

查詢 Windows 作業系統 .NET Framework Version

How to quickly check the .NET Framework version on Windows 10

How to: Determine which .NET Framework versions are installed

Automation

Hash Value

取得檔案 Hash Value With SHA-256 (Get-FileHash)

Get-FileHah file.txt

Get File Hash Value 一鍵完成版本 (Get-FileHash)

Get-FileHash filePath | select -exp hash | clip

批次將資料夾內的檔案轉換為 hashed value (batchly Get-FileHash)

Get-FileHash (Get-ChildItem ".\*.*" -Recurse -Force) | export-csv .\hashedFile.csv

好讀格式再升級版本

Get-ChildItem  -Recurse | %{$_.FullName.Replace("C:\Users\", ""), (Get-FileHash $_.FullName).Hash} | clip

System Administration

移除本機群組中的使用者 (移除 Administrators 中的成員)

Remove-LocalGroupMember -Group "Administrators" -Member "Domain\AccountName"

參考資源

黑暗執行緒 - Powershell 學習筆記

PowerShell® Notes for Professionals book

Powershell Special Characters And Tokens