<commit_before>---
layout: post
title: PowerShell 筆記
date: 1970-01-01 12:00
author: <NAME>
comments: true
categories: [Note, PowerShell, Tools]
---

Windows PowerShell 是以 .NET Framework 為基礎所建置，而且是以工作為基礎的命令列殼層和指令碼語言；專為系統管理員和進階使用者所設計，可快速自動化管理多個作業系統 (Linux、OSX、Unix 和 Windows)，以及與在這些作業系統上執行之應用程式相關的程序。

## 版本

PowerShell 的執行環境是有分版本的，結至 2018 年最新版本為 6.1，你可以在 PowerShell 中執行 `Get-Host` 命令來確認您的本機 PowerShell 版本。

最原始的設計中，指令檔的副檔名是會區分版本的，例如 `.ps1`、`.ps2`，但為了讓之後的使用上能兼容舊版本，所以全部統一使用 `.ps1` 作為 PowerShell 的指令檔附檔名。

版本不同所提供的功能或指令就會有些不同，因此如果你要確保指令檔是在某特定版本下執行時，在撰寫 `.ps1` 檔的時候，建議在開頭加上 `#REQUIRES` 並註明該指令碼所使用的版本，例如：

```ps1
#REQUIRES -Version 2

param([string]$BasePath="", [string]$FolderName="")
$location="D:\" + $BasePath + "\" + $FolderName
Set-Location $location
# ignore...
<# Version 2 Comment #>
```

REF: [CTP: PowerShell Versioning](https://blogs.msdn.microsoft.com/powershell/2007/11/02/ctp-versioning/)

## 快速鍵

REF: [Windows PowerShell ISE 的鍵盤快速鍵](https://docs.microsoft.com/zh-tw/powershell/scripting/core-powershell/ise/keyboard-shortcuts-for-the-windows-powershell-ise?view=powershell-6)

動作                    | 鍵盤快速鍵
---------------------- | ------------
顯示/隱藏指令碼窗格       | CTRL + R
將指令碼窗格移至上方      | CTRL + 1
將指令碼窗格移至右方      | CTRL + 2
最大化指令碼窗格          | CTRL + 3
關閉 PowerShell 索引標籤 | CTRL + W
新增 PowerShell 索引標籤 | CTRL + T

## 常用指令

- `$PSVersionTable.PSVersion` 查看 PowerShell 版本
- `Get-ChildItem Env:` 查看環境變數 \* `$Env:USERPROFILE` 查看環境變數中 USERPROFILE 的內容值
- `Format-List` 透過這個指令來格式化輸出的資訊，例如 `Get-EventLog -Log System -Newest 10 | Format-List -Property *` 列出最新 10 筆系統事件紀錄，並將所有屬性格式化成表單作呈現，方便閱讀。

## 載入設定檔

PowerShell 會自動從以下這 4 個檔名路徑依序載入設定檔，如果找不到檔案也會自動跳過：

1. `%windir%\system32\WindowsPowerShell\v1.0\profile.ps1`
   - 這個設定檔 `profile.ps1` 會載入到所有使用者與所有 shell 執行環境
2. `%windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1`
   - 這個設定檔 `Microsoft.PowerShell_profile.ps1` 會載入到所有使用者，但僅限於使用 Microsoft.PowerShell 的 shell 執行環境
3. `%UserProfile%\Documents\WindowsPowerShell\profile.ps1`<commit_msg>alter post<commit_after>---
layout: post
title: PowerShell 筆記
date: 1970-01-01 12:00
author: <NAME>
comments: true
categories: [Note, PowerShell, Tools]
---

Windows PowerShell 是以 .NET Framework 為基礎所建置，而且是以工作為基礎的命令列殼層和指令碼語言；專為系統管理員和進階使用者所設計，可快速自動化管理多個作業系統 (Linux、OSX、Unix 和 Windows)，以及與在這些作業系統上執行之應用程式相關的程序。

## 版本

PowerShell 的執行環境是有分版本的，結至 2018 年最新版本為 6.1，你可以在 PowerShell 中執行 `Get-Host` 命令來確認您的本機 PowerShell 版本。

最原始的設計中，指令檔的副檔名是會區分版本的，例如 `.ps1`、`.ps2`，但為了讓之後的使用上能兼容舊版本，所以全部統一使用 `.ps1` 作為 PowerShell 的指令檔附檔名。

版本不同所提供的功能或指令就會有些不同，因此如果你要確保指令檔是在某特定版本下執行時，在撰寫 `.ps1` 檔的時候，建議在開頭加上 `#REQUIRES` 並註明該指令碼所使用的版本，例如：

```ps1
#REQUIRES -Version 2

param([string]$BasePath="", [string]$FolderName="")
$location="D:\" + $BasePath + "\" + $FolderName
Set-Location $location
# ignore...
<# Version 2 Comment #>
```

REF: [CTP: PowerShell Versioning](https://blogs.msdn.microsoft.com/powershell/2007/11/02/ctp-versioning/)

## 快速鍵

REF: [Windows PowerShell ISE 的鍵盤快速鍵](https://docs.microsoft.com/zh-tw/powershell/scripting/core-powershell/ise/keyboard-shortcuts-for-the-windows-powershell-ise?view=powershell-6)

動作                    | 鍵盤快速鍵
---------------------- | ------------
顯示/隱藏指令碼窗格       | CTRL + R
將指令碼窗格移至上方      | CTRL + 1
將指令碼窗格移至右方      | CTRL + 2
最大化指令碼窗格          | CTRL + 3
關閉 PowerShell 索引標籤 | CTRL + W
新增 PowerShell 索引標籤 | CTRL + T

## 常用指令

- `$PSVersionTable.PSVersion` 查看 PowerShell 版本
- `Get-ChildItem Env:` 查看環境變數 \* `$Env:USERPROFILE` 查看環境變數中 USERPROFILE 的內容值
- `Format-List` 透過這個指令來格式化輸出的資訊，例如 `Get-EventLog -Log System -Newest 10 | Format-List -Property *` 列出最新 10 筆系統事件紀錄，並將所有屬性格式化成表單作呈現，方便閱讀。

## 發送 HTTP Requesting

要透過 Powershell 發送 HTTP Request 來測試 API 主要透過 `Invoke-WebRequest` 命令，參考下列做法：

```ps1
$JSON = @'
{"name":"PoyChang","email":"","message":"Okay, I'm here.","property":{"key1":"value1","key2":"value2"}}
'@

Invoke-WebRequest -UseBasicParsing [YOUR_URL] -ContentType "application/json" -Method POST -Body $JSON
```

## 載入設定檔

PowerShell 會自動從以下這 4 個檔名路徑依序載入設定檔，如果找不到檔案也會自動跳過：

1. `%windir%\system32\WindowsPowerShell\v1.0\profile.ps1`
   - 這個設定檔 `profile.ps1` 會載入到所有使用者與所有 shell 執行環境
2. `%windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1`
   - 這個設定檔 `Microsoft.PowerShell_profile.ps1` 會載入到所有使用者，但僅限於使用 Microsoft.PowerShell 的 shell 執行環境
3. `%UserProfile%\Documents\WindowsPowerShell\profile.ps1`
{'fraction_non_alphanumeric': 0.15121615419917395, 'fraction_numerical': 0.027765029830197338, 'mean_word_length': 4.503787878787879, 'pattern_counts': {'":': 6, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5546470', 'n_tokens_mistral': 2503, 'n_tokens_neox': 2707, 'n_words': 317}