iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
Software Development

妄想對自己的Windows優化兼Debug的工程師很正常吧系列 第 29

PowerShell--除了CMD你還可以用他追求你想要的Windows

做這篇的目的是這樣的,想要完成一些自動化任務,畢竟是電腦嘛,用程式自動完成一些事也是”解決問題”呀,用些藍藍的畫面自動一直印出文字然後網路就連線了,應用程式就打開了,沒有人操作的電腦在自己運行著你設定的任務,這樣不是很酷嗎?


前言

在上篇我們簡單介紹了CMD有BAT腳本可以運行,但他能做到的終究有限,像是鍵盤操作或是滑鼠點擊之類的就不太能單靠他運行,而後來微軟推行的powerShell就是一個新而強大的工具,當然,或許自動化任務這些東西用什麼都寫什麼都不奇怪的python也做得到,套件絕對是夠你用的,寫完的.py檔也可以用套件打包成.exe檔就可以在沒有python的地方執行了,但是實際上真的需要用到python嗎? 一行行的指令集輕鬆寫寫就可以達成目標的小程式,用powerShell我覺得不虧,初學者想簡單只為一個目標學習的話,powerShell常常可以讓你只學你需要用的部分不用其他基礎,這是筆者在這裡推薦給大家的原因,對一個自附IDE工具還附教學網站的Windows內建軟體,嘗試一下,說不定你會喜歡。


PowerShell簡介

Windows PowerShell是以.NET Common Language Runtime (CLR)為基礎,所有輸入和輸出都是.NET物件,語法以指令集為基礎,自從Win 7開始就已預先安裝在Windows裡了,Windows 10現在預設安裝應該都是5.1版,在開始功能表可以找到,你也可以在裡面找到Windows PowerShell ISE,這是Windows PowerShell的整合式指令碼環境(IDE),寫腳本的時候就不用像bat用記事本打了。如果想檢查你的版本可以直接輸入$PSVersionTable就會印出詳細資料。
Imgur


Cmdlet

PowerShell有個特色是具有所謂的Cmdlet(唸做commandlets),也就是他的一種指令集,通常是由動詞-名詞的形式組成,跟CMD指令一樣不分大小寫,可以從指令本身大概猜出他的意思,有種需要哪條指令再學哪條指令的的設計模式,通用執行階段上,採用物件輸入並傳回物件,例如我們執行Get-Process -Name explorer,這個Get-Process就是一個Cmdlet,他可以獲得-程式的資訊,後面接的-Name explorer就是找一個名為explorer的參數選項,所以整句指令傳入Windows後會回傳一個關於名叫explorer的程式資訊的.NET 框架物件。
Imgur

除此之外,powerShell也相容大部分的DOS指令,意思就是在前面CMD學的指令在這裡也可以運行不用捨棄。


變數和物件

PowerShell的變數名稱以$作為開頭,例如剛剛的$PSVersionTable,如果變數本身也屬於物件也可以直接用.去抓取,例如想取得剛剛的$PSVersionTable裡的PowerShell版本號內容(PSVersion)可以用$PSVersionTable.PSVersion,這時候你發現他也是一個物件,我們可以試著在往下抓取,輸入$PSVersionTable.PSVersion.Majorr就會印出主版本號。
Imgur


測試功能-WhatIf與-Confirm

在指令後面加上-WhatIf,會顯示出如果這個指令執行會發生什麼事但不會執行,例如如果要確認停止一個名叫explorer的程式,實際上會作用在哪,我們可以加上-WhatIf去提前知道自己指令跟目標有沒有配對正確,不用真的執行。
Imgur

如果在指令後面加上-Confirm則會在指令執行之前詢問是否執行,等待輸入,同時也會列出-WhatIf的資訊,像我們在debug的next step一樣,可以確認後繼續或是停止以下動作。
Imgur


指令串接-pipline(管線)

對於多項指令,有時候我們需要對A指令輸出的內容繼續給B指令接收並執行,這種指令串接我們就叫pipline(管線),用法就是A|B,給個簡單範例,Get-Process notepad | Stop-Process會先取得notepad資訊當作一個物件,再用Stop-Process去停止關閉他(不會發出存檔提醒喔)。


.PS1腳本

就像CMD有.bat腳本一樣,powerShell也有.ps1腳本,可以把你的指令存成一份指令稿,開啟就依序執行裡面的面命令,可以用在部署或自動化排程之類的,同樣的我們可以用記事本打,然後存檔副檔名改.ps1即可,不過通常我們編輯powerShell的Script有更好的IDE工具--Windows PowerShell ISE,他會幫PowerShell指令標高亮,下方可以直接測試命令,右邊可以檢查有哪些模組指令可用,可以直接插入編輯器內。
Imgur

那.ps1檔通常右鍵就可以用powerShell開啟執行,或是我們直接在powerShell輸入檔案路徑\檔名.ps1也可以。

不過第一次使用的人可能會發現,執行後powerShell直接閃退或是完全不會跑,這跟powerShell的執行原則(Execution Policy)有關,我們輸入Get-ExecutionPolicy可以看出來預設是Restricted,在這個模式下電腦不接受.ps1檔的執行,這是一個保護機制,Windows不希望不懂原理的用戶隨意執行.ps1檔,尤其是來自網路上的,這些可執行檔容易被當作病毒四處散播。
Imgur

所以當我們第一次使用可以用系統管理員打開powerShell,輸入Set-ExecutionPolicy RemoteSigned把執行原則變更為RemoteSigned模式,在這個模式下,Windows會允許本機電腦上寫入的腳本執行,從網路下載的腳本需要需要來自信任發行者的數位簽章才可以執行,如果改為Unrestricted模式則會無條件允許所有腳本執行,所以風險較大就不建議大家使用了。
Imgur

話說回來,這個執行原則也是一種設定,我們也可以在登錄檔找到相關的子鍵,直接改寫登錄檔也是一種變更方式,他就是下方子鍵裡的ExecutionPolicy(REG_SZ)登錄值。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

Imgur

另外我們也可以用Bypass執行原則去針對某個腳本的當次執行繞過限制,加上-ExecutionPolicy Bypass參數就可以,舉例來說,如果我們想要從CMD執行一個powerShell腳本就可以用這個指令。

start powershell -ExecutionPolicy Bypass "檔案路徑\檔名.ps1"

這篇文章的目的是希望你對powershell有點興趣,一行行的指令比起一門程式語言更容易上手也更基礎,又通用在所有Windows還可以做自動化任務,如果你用Windows,何不試試寫些自己有興趣的東西呢?

程式始終是為了解決問題,如果你沒有問題,就自己生一個出來,像筆者想優化Windows一樣,你總是可以一步步往上鑽研,就好像一份專題一個報告,不管多早開始準備,不到最後交差的那一刻你總是繼續修改你的成品,因為你發現他還可以更好,總是掩不住那股如果可以為什麼不做的貪婪,這就是求知慾,可以永無止盡進步的慾望,如果有天你失去這種感覺,去做件你真心想做的事,找回你目的方向再去工作吧,不要拋棄你內心的天真無邪。

下篇就是最後了,我會做個整理總結,也會實做一支.ps1程式給大家看,在第30天,我要教各位如何用Windows內建功能,天真拼出自動化鐵人發文程式!只為達成目的的思考邏輯,完成最天然的小小願望,帶到這個系列的最終主題---妄想對自己的Windows優化兼Debug的工程師,是不是如我所想的很正常,我們下篇見囉~

Imgur

參考資料:
https://docs.microsoft.com/zh-tw/learn/browse/?terms=PowerShell
https://officeguide.cc/powershell-beginner-introduction/
https://docs.microsoft.com/zh-tw/archive/blogs/technet_taiwan/windows-powershell
https://ithelp.ithome.com.tw/articles/10027387
https://docs.microsoft.com/zh-tw/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.1


上一篇
命令提示字元--CMD那麼好用你不學一下嗎?
下一篇
是工程師就自己簡化流程,這種熱血你我都有吧!?Windows鐵人無腦自動發文帶出30天最終大結局
系列文
妄想對自己的Windows優化兼Debug的工程師很正常吧30

尚未有邦友留言

立即登入留言