更好的批處理指令碼語言 PowerShell
微軟在 2006 年推出首款 PowersShell 1.0 版本,適用於 Windows Server 2008 作業系統,並作為 PowersShell 2.0 被正式預裝在之後的 Windows 7 作業系統中。在 Windows 8 中,內建的 PowerShell 更進一步,升級為 PowerShell 3.0,Windows 8.1 則對應著 PowerShell 4.0 版本。在我寫下本段文字,PowerShell 已經迎來了它的另一個新版本 PowerShell 6.0。這些變化背後,離不開它強大的開源支援。你可以在 Github 找到它的開原始碼。
PowerShell 跨平臺,這意味著你可以將編寫好的程式碼用來管理 Windows、Macintosh,甚至是 Linux 作業系統。這一點是 Windows 下的原始批處理檔案(batch file)所不能比擬的。
cmdlet
cmdlet(中譯名 “短命令”)是 PowerShell 命令體系的基礎。
動詞-名詞
這是 cmdlet 的基本語法結構。cmdlet 是一個內建到 shell 中的簡單的單一功能命令列工具。可以就像使用傳統的命令和實用工具那樣使用 cmdlet。首先在 Windows PowerShell 命令提示符下鍵入 cmdlet 的名稱。Windows PowerShell 命令不區分大小寫,因此可以用任意大小寫鍵入。
0x00:相容 Linux 命令
PowerShell 將一些命令做了別名處理,以取悅那些 Linux 專家的習慣。常見的如 ls
命令,你也可以用 dir
gci
命令進行呼叫。
當然,你還可以使用 tree
命令將結果以檔案樹的形式輸出。
0x01:檢視幫助文件
類似 Linux 的 man 命令,PowerShell 有一個名為 get-help
的命令。
0x02:列出所有程序或服務
使用 get-process
段命令列出本地機器上的所有程序。它是 ps
命令的別名。
使用 get-service
短命令列出本地機器上的所有服務,包括停止和正在執行的。
0x03:輸出結果篩選
類似 Linux 的 grep 命令,PowerShell 有一個 select-string
命令。
0x04:清屏
使用 clear-host
短命令、cls
命令,或 clear
命令進行終端清屏。
0x05:新建專案
這是 PowerShell 的一個特色命令。它不僅可以在制定路徑建立檔案、資料夾,還可以創建制定型別的檔案系統;在登錄檔中,New-Item
建立登錄檔項和條目。
編寫並執行 PowerShell 指令碼
PowerShell 指令碼的欽定的檔案字尾名為 .ps1
,s 後面跟的是數字 1。
儲存為字尾為 .ps1
的指令碼檔案即可。只要你的操作主機安裝了 PowerShell,就可以執行執行。如果直接 .\檔名
會報錯。因為 PowerShell 預設禁止在終端執行指令碼程式。對此我們有一條命令用來繞過執行該指令碼。
powershell.exe -ExecutionPolicy Bypass -File 檔名.ps1
在 CMD 下執行亦可。注意命令字首 powershell.exe
必不可少。
如果嫌麻煩,可以永久的改變本機的 PowerShell 執行策略。
Set-ExecutionPolicy Bypass
和上面的單獨繞過不同,該操作必須具有管理員許可權,否則會報錯。
和登錄檔愉快的玩耍
PowerShell 的另一個吸引人的特性是,它允許你直接在終端裡,像訪問普通的檔案系統那樣訪問 Windows 登錄檔。記住,我們直接訪問的是鍵,它相當於普通檔案系統的目錄,而它其下包含的值和普通意義上的檔案有一些區別,所謂的值顯示在屬性欄,與其他屬性一同組成一個完整的值。
我們知道,檔案系統的檔案物件具有三大屬性:所謂讀、寫、執行許可權。只要是和鍵的讀取有關的,在 PowerShell 的登錄檔互動中都可以像普通檔案一樣的互動。讀的屬性,比如:列出某鍵下的所有子鍵,這時候你就應該想到 ls
命令。當然更規範的寫法應該是 get-childitem
短命令。
短命令 | 作用 | 別名 |
---|---|---|
Get-ChildItem | 列出某鍵的所有子鍵 | ls, dir |
Get-ItemProperty | 列出某鍵的所有屬性 | - |
Set-Location | 更改當前操作的鍵 | cd |
Set-ItemProperty | 更改某鍵的某值 | - |
New-ItemProperty | 給某鍵新建一個值 | - |
Clear-ItemProperty | 刪除某鍵的值的內容 | - |
Remove-ItemProperty | 刪除某鍵的值 | - |
New-Item | 建立一個新鍵 | md |
Remove-Item | 刪除一個鍵 | del |
Test-Path | 驗證某鍵是否存在 | - |