這篇文章想分享下,最近準備挑戰向新人介紹的Powershell基礎使用,也順便透過整理資料來加深自己這方面的基礎,裡面也有給一些練習題,如果你剛好路過也可以做做看。

注:原始文件寫在OneNote上,在轉換成Markdown的過程已盡量修改成部落格版本的寫法。



簡單介紹

Powershell是微軟推出的CLI,擁有以下特性:

  1. 一致性的指令命名規則

所有”官方”指令都遵守 ​Verb-Noun​ ,例如 ​get-help​ 

  1. 內建強大的Cmdlet(command-let)
  2. 具有Scripts的功能

可以透過編寫Code,把指令像是樂高一樣組成我們想要的樣子。

每個指令都是以動詞+名詞(通常是單數)的方式組成,而使用每個指令時,以-parameters表示參數。

例如: get-command -verb write -none host

get-command 指令

-verb,-none 參數

write 是 -verb的參數內容;host是-none的參數內容


常用快捷鍵

快捷鍵 Memo
Tab 最常用的快捷鍵,可以自動完成指令、參數名稱。
Ctrl+C 停止目前指令
Ctrl+L 清除畫面
(Ctrl+Shift+)Pageup 切到上一面
(Ctrl+Shift+)Pagedown 切到下一面

get-help by yourself(救你自己!)

一般我們在編寫Powershell指令時,由於Powershell的功能實在太強大,有太多的指令我們無法全部記住,所以我們必須學會使用內建的手冊,來查找我們要使用的指令。

指令 說明 範例
update-help​ 更新Powershell的說明文件
get-help <功能> 用來查看說明文件 取得hyper-v有關的指令或說明檔
​get-help *hyper-v*
get-command <功能> 用來查找相關指令 查找和Hyper-V有關的指令
​​get-command -Module hyper-v
get-member <物件> 查詢或指令相關的Properties $x物件的屬性
get-member -InputObject $x
or
$x|get-member

注意

get-help *hyper-v* 直接執行可能會顯示不出結果,但是寫在get-command -Module hyper-v之後卻可以,所以或許兩個指令有對應關係,在查找指令時最好先用get-command找到未知的指令後,再使用get-help來查使用方式。


常用CLI指令

因為不確定是否每個人都有使用CLI的經驗,所以特別列一些時常用來檔案管理的幾個指令(最常用的)。

指令 說明 範例
cd 到指定目錄 cd C:\\
mkdir 建立資料夾 mkdir newfolder
rm 刪除檔案 rm test.txt
cls 清空畫面
pwd 查看現在目錄
echo 寫資料 echo "Hello" > World.txt
Notepad 打開記事本 Notepad <路徑>
code 有裝VSCODE的話,可以直接用這個指令打開文件編輯程式碼 code <路徑>

其他縮寫可以透過get-alias | select name,definition來查看縮寫與原始指令。


特殊符號

特殊符號: Exchange Cmdlet 語法 | Microsoft

符號 說明 範例
$ 代表參數 $h = get-help
| Pipeline,串接指令用的水管符號 get-alias|select name
> 把指令產生結果輸出成某檔案
(會覆寫)
get-process > Process.txt
>> 把指令產生結果輸出成某檔案
(檔案存在的話會在後面加入)
get-process >> Process.txt
* 1.比對字串
2.乘法運算
3.重複字串
1.get-help *keyword*
2.$a * $b
3.”test”*3 –> testtesttest
[] 拿來指定索引(index)、資料型態 指定索引:$array[3]
指定資料型態:$b = [string]$a 
file
{} 用來包指令間的運算式的符號 @的範例
.. 表示之間,例如$array[2..5],會回傳array中第二個到第五個間的值 @的範例
$_ 表示”每一個”物件,只有在執行指令的範圍有效,例如:
$x[0..5].foreach({$_*$_})
表示0~5每個數字的平方數
@的範例
@ 作為關聯陣列的符號 Image
% 1.在運算式裡面作為”取餘數”的符號
2.在|後面作為foreach的速記符號
Image
? where的速記符號 Image

比較參數

另外在Powershell的運算式(在{}裡面,見上面範例)中,是使用預留的參數作為比較用途,而非使用符號=,>,<,原因在於Powershell除了可以比較數值大小,也可以比較字串,為了應付不同的比較方式,採用更多種預留參數作為比較運算子。about_Comparison_Operators

Image

查看差異:

file

由此可知,=用來定義參數,而-eq用來判斷,回傳$true or $false


自動變數

關於自動變數 - PowerShell | Microsoft Docs

參數 Memo
$Profile 一個預設拿來存Powershell設定檔的內建參數,可以在此設定每次打開Powershell要載入的函數、模組。
也可以在這定義平常會用到的參數作為自動變數
$Error 顯示近期發生的錯誤訊息。

資料處理

Array

您想知道有關於陣列的一切 - PowerShell | Microsoft Docs

算矩陣(供參考)

對​​​​​$\begin{bmatrix}1&2&3 \\ 4&5&6 \\ 7&8&9\end{bmatrix}$​​​​​做運算

(橫的為Row列,直的為Col欄,索引從0開始)

Operate Example
Matrix $matrix = @(@(1,2,3),@(4,5,6),@(7,8,9))
row $row = $matrix[0]
col $col = $matrix | %{$_[0]}

加法

Action Memo
列加法 第0列+第1列
for($i=0;$i -le $matrix.Length;$i++){$matrix[0][$i]+$matrix[1][$i]}

file

Action Memo
欄加法 第0行+第1行
$matrix | %{$_[0]+$_[1]}

file

乘法

Action Memo
欄乘列 欄乘列
$\begin{bmatrix} 1 \\ 4 \\ 7 \end{bmatrix}$ * $\begin{bmatrix}1&2&3\end{bmatrix}=\begin{bmatrix}1∗1&1∗2&1∗3 \\ 4∗1&4∗2&4∗3 \\ 7∗1&7∗2&7∗3\end{bmatrix}=\begin{bmatrix}1&2&3 \\ 4&8&12 \\ 7&14&21\end{bmatrix}$

for($j=0;$j-lt$col.length;$j++){$elements[$j]=for($i=0;$i -lt $row.length;$i++){$col[$j]*$row[$i]}}

file

Action Memo
列乘欄 列乘欄
$\begin{bmatrix}1&2&3\end{bmatrix}$*$\begin{bmatrix} 1 \\ 4 \\ 7 \end{bmatrix}$ = 1*1+2*4+3*7=30
$elements = for($i=0;$i-lt$row.Length;$i++){$row[$i] * $col[$i]}
$sum = ($elements | Measure-Object -sum).sum

file

Hashtable

您想知道有關雜湊表的一切 - PowerShell | Microsoft Docs

可以用來對群組資料做分類,例如今天有個表格資料

Group Domain IP
AD ad.company.ad 192.168.0.3
Server1 server1.company.ad 192.168.0.4
Server2 server2.company.ad 192.168.0.5

可以使用hashtable來存資料

1
2
3
4
5
$group = @{
ADDC = @{Domain = "addc.company.ad";IP="192.168.0.3"}
Server1 = @{Domain = "server1.company.ad";IP="192.168.0.4"}
Server2 = @{Domain = "server2.company.ad";IP="192.168.0.5"}
}

如此一來,就能使用Properties來查這個表格內的相關資料
file


Exercises

查找題

  1. 執行update-help
  2. 使用get-help get-content 來學習如何使用此指令
    a. 使用get-help get-content -example 來查看範例
    b. 使用get-help get-content -onlinn 連去微軟網站看此指令的說明

基本檔案操作+計算+輸出結果題

  1. 在C槽建立一個名為 ​pwsh​ 的資料夾,並且到此目錄底下
  2. 建立一個名為 ​ ​ ​Cube.txt​ ​ ​ 的文字檔案
  3. 對0~20取立方,輸出結果至Cube.txt
  4. 使用指令在CLI介面查看 ​ ​Cube.txt​ ​ 的內容

如圖

Image


衍生題

  1. 請對上面Cube.txt的檔案裡的每個數字,標示出是奇數(odd)或偶數(even)

如圖

file

hint: $x.tostring

  1. 把上面那題改用雜湊表(hashtable)表示

file


情境題

(請自行創空白的txt練習)

今天有個檔案夾內的檔案,裡面的檔案名稱因為不明原因全部都有相同的錯誤,請用Powershell來快速修正檔案名稱。

範例: Error_NAME_file01.txt –> Correct_Name_file01.txt

hint: Rename-Item,get-childItem


Reference

get-help
說明系統 - PowerShell | Microsoft Docs

特殊符號
Exchange Cmdlet 語法 | Microsoft

比較參數

about_Comparison_Operators

資料結構
您想知道有關於陣列的一切 - PowerShell | Microsoft Docs
您想知道有關雜湊表的一切 - PowerShell | Microsoft Docs

快捷鍵

Windows PowerShell 基本操作 - 熱鍵 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)|