PowerShell逆引きメモ

必要に迫られたPowerShell系の逆引きメモになります

## 概要

各コマンドはできるだけ短いエイリアスを使用しています

## ファイル・ディレクトリ関連

### `チェンジディレクトリ`で`戻る`、`進む`

#### 戻る

```
cd -
```

#### 進む

```
cd +
```

### ファイルの更新順でソート表示
```posh
ls | sort LastWriteTime
```

### 最新ファイルを任意件数表示

```posh
ls | sort LastWriteTime | select -Last 10
```

### カレントディレクトリ内のファイルサイズをMB単位で一覧表示
```posh
ls -File | select Name, @{Name='SizeMB'; Expression={"{0:N2} MB" -f ($_.Length / 1MB)}}
```

### 指定ファイルのフルパスをクリップボードにコピー
```posh
rvpa -Path ".\example.txt" | foreach { "`"$_`"" } | scb
```

- カレントディレクトリ内
- ダブルコーテーションで囲む


### カレントディレクトリ内のファイルのファイル名を改行区切りでクリップボードへコピー

```posh
ls -Name | % {$_} | Set-Clipboard
```

### カレントディレクトリのフルパスをクリップボードへコピー
```posh
(pwd).Path | scb
```

### ファイル(0byteファイル)を作成
`touch`コマンドの代替
```posh
ni filename.txt -ItemType File
```

### ディレクトリ内でテキストファイルの行数出力
数十万～数百万行のテキストファイルが複数有る場合に行数を数える

```posh
ls *.txt | foreach {(Get-Content $_).Length}
```

### テキストファイルを指定行数で分割

```posh
$i=0; cat .\test.txt -ReadCount 3 | % { $_ > test$i.txt;$i++ }
```

`-ReadCount`で行数を指定するとテキストファイルを分割できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107413/faf4e21c-0bf6-83b0-4569-4c4c7fd15028.png)


### ファイルの削除(rm -rf)
```
rm .\test -r -fo
```

### 指定したフォルダ名を再帰的に強制削除
```posh
ls -Recurse -Filter 'test' | rm -r -fo
```

### ゴミ箱を空にする

#### 確認有り
```posh
Clear-RecycleBin -Confirm:$true
```
#### 確認無し
```posh
Clear-RecycleBin -Confirm:$false
```

### ZIPファイルの展開
```posh
Expand-Archive -Path .\src.zip -DestinationPath .\dest\
```

### カレントディレクトリ内のファイルをZIPファイルに圧縮
```posh
Compress-Archive -Path .\* -DestinationPath .\output.zip
```

## 制御関連

### 任意の間隔で同じコマンドを繰り返す

```posh
while ($true) { Write-Host "Hello World"; sleep -Seconds 30 }
```

## システム関連

### 起動、シャットダウン履歴の検索

サンプルは過去1ヶ月分のシャットダウン履歴を検索

```posh
Get-WinEvent -FilterHashtable @{LogName='System'; Id=6006,6008; StartTime=(Get-Date).AddDays(-31); EndTime=(Get-Date)} | ForEach-Object { "{0,-25} {1,-5} {2,-15} {3}" -f $_.TimeCreated.ToString("yyyy/MM/dd HH:mm:ss"), $_.Id, $_.LevelDisplayName, $_.Message }
```

```
2024/01/01 04:00:00       6006  情報              イベント ログ サービスが停止されました。
2024/01/01 03:00:00       6006  情報              イベント ログ サービスが停止されました。
2024/01/01 02:00:00       6006  情報              イベント ログ サービスが停止されました。
2024/01/01 01:00:00       6008  エラー             以前のシステム シャットダウン ( ‎2024/‎01/‎01 00:00:00) は予期されて いませんでした。
```

起動履歴を取得したい場合は、`Id=6006,6008;`を`Id=6005;`に変更する。

### 日毎に「最初のイベント・最後のイベント」履歴を検索

```
Get-WinEvent -FilterHashtable @{LogName="System"; StartTime=(Get-Date).AddDays(-30); EndTime=(Get-Date)} | Group-Object { $_.TimeCreated.ToString("yyyy-MM-dd") } | ForEach-Object { [PSCustomObject]@{Date=$_.Name; FirstEvent=($_.Group | Select-Object -Last 1).TimeCreated; LastEvent=($_.Group | Select-Object -First 1).TimeCreated} }
```

```
Date       FirstEvent          LastEvent
----       ----------          ---------
2024-10-29 2024/10/29 9:30:00  2024/10/29 17:50:00
2024-10-30 2024/10/30 9:40:00  2024/10/30 19:30:00
2024-10-31 2024/10/31 9:20:00  2024/10/31 19:00:00
2024-11-01 2024/11/01 9:40:00  2024/11/01 18:40:00
```


### 環境変数の確認
```posh
ls env:
```

### PCの再起動

```posh
Restart-Computer
```

### PCのシャットダウン
```
Stop-Computer
```

### Windows Updateの実行

```posh
Install-Module PSWindowsUpdate -Force
Set-ExecutionPolicy RemoteSigned
Install-WindowsUpdate –AcceptAll –AutoReboot
```

### コマンド履歴をすべて表示

```posh
Get-Content ((Get-PSReadlineOption).HistorySavePath) -ErrorAction SilentlyContinue
```

### `常に実行しない(V)`を解除
PowerShellのコマンド実行時に下記のメッセージが表示される場合に誤って`[V] 常に実行しない(V)`を誤って選択した場合に次回以降`...このモジュールを読み込む ことができませんでした。...`と表示されてしまう問題への対処方法

#### 表示内容
```
この信頼されていない発行元からのソフトウェアを実行しますか?
ファイル C:\Users\user\Documents\WindowsPowerShell\Modules\xxx\xxxx\xxxx.xxxx の発行元は
CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
であり、このシステムで信頼されていません。信頼された発行元からのスクリプトのみを実行してください。
[V] 常に実行しない(V)  [D] 実行しない(D)  [R] 一度だけ実行する(R)  [A] 常に実行する(A)  [?] ヘルプ (既定値は "D"):
```

#### 操作手順
1. `スタートメニュー`で`証明書`を検索
2. `ユーザ証明書の管理`をクリック
3. `信頼されてない証明書`から該当の証明書を削除
4. 該当コマンドを再実行すると`この信頼さ...`のメッセージが再度表示される

### ps1ファイルを実行

```posh
powershell -ExecutionPolicy RemoteSigned -File .\test.ps1
```

`-ExecutionPolicy RemoteSigned`はローカルに保存されているスクリプトは実行可能。インターネットからダウンロードしたスクリプト（非ローカルのスクリプト）は、署名されているもののみが実行可能。`Windows Server 2012 R2`では、この設定がデフォルト

### PowerShellのバージョンを確認
```posh
$PSVersionTable
```

### サービスの一覧表示
```
Get-Service
```

### Firewallの無効化
```
Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled false
```

### SFTP
#### start ssh-agent
```posh
Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent
```

## Poweshell関連

### Poweshellコマンドエイリアス表示

```
gal | ? {$_.Definition -eq 'Get-ChildItem'}
```

コマンドエリアスは`man`コマンドでも確認可能

## Windowsコマンド

下記はPowerShellからでも実行出来できますが正確にはWindowsコマンド

### `tar.gz`の展開
```posh
tar -xzf yourfile.tar.gz -C outputfolder
```

`outputfolder`は存在ている必要があります

### 電源プランの一覧表示
```posh
powercfg /list
```

### 電源プランを変更
```posh
powercfg /setactive 42e1c36a-c58e-4980-9dc6-c38fd7f17a4c
```
GUIDは`powercfg /list`を実行した際に表示される値を使用する必要があります

### カレントディレクトリをエクスプローラーで開く
```posh
 start .
```

### 指定ディレクトリをエクスプローラーで開く
```posh
 start \
```

## PowerShell関連のナレッジ

### PowerShell実行時にUTF-8で日本語が文字化けする問題

#### 原因

```
PowerShellはUnicodeなので[UTF-8](BOM無し)無しだと文字化け発生する
```

#### 対策

```
ps1ファイルをUTF-8(BOM付き)で保存する
```

## 参考

* [Get-Service コマンドレットの使用](https://technet.microsoft.com/ja-jp/library/ee176858.aspx)
[◆コンピュータをShutdownする(Stop-Computer,Restart-Computer) ](http://mtgpowershell.blogspot.jp/2011/01/shutdownstop-computerrestart-computer.html)
* [Server CoreモードでのFirewallの無効化 | 日々徒然](http://blog.o365mvp.com/2012/11/13/server-core%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E3%81%AEfirewall%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96/)
* [逆引き！PowerShellで圧縮ファイル(ZIP)の解凍する方法【Expand-Archive】 | 【ﾁｪｼｬわら】Powershellとは、から学ぶ入門者の教科書-脱コマンドプロンプト-](https://cheshire-wara.com/powershell/ps-cmdlets/item-file/expand-archive/)
* ["Expand-Archive (Microsoft.PowerShell.Archive)](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/expand-archive?view=powershell-5.1)
* [WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)
* [スキルゼロから始める業務効率化 - 【PowerShell】メモ帳スクリプトファイル実行時文字化け解消方](https://devoevo.com/powershell-characode/)