PowerShell 常用指令筆記

2020-09-09

最近參與的課程講師都習慣除 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