PowerShellをワンライナーで書きたい

# はじめに
ここのところ、Windowsノード向けのjenkinsfileをよく書いている。
ただ実際にjenkinsの環境を作っていると、PowerShellでの書き方で悩んでいる時間のほうが多い。
AWSのCodeBuildでの再利用性を考えると、PowerShellで色んな処理を書いておきたい。
PowerShellを分かりやすく、ワンライナーで書けるようになっておきたい。

公式：
https://learn.microsoft.com/ja-jp/powershell/scripting/learn/ps101/04-pipelines?view=powershell-7.3

### 1. 値を一つ取得し、値を元にコマンド実行するワンライナー
例：DNSの設定をする
- get-netadapterの戻り値をネットワークアダプタ情報を取得
- set-dnsclientserveraddressでアダプタにDNSを設定

```powershell: 1-単体での実行結果
PS C:\> get-netadapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
イーサネット 2            Realtek USB GbE Family Controller            12 Disconnected A0-CE-C8-D7-07-1D          0 bps
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...      10 Disconnected 58-1C-F8-24-D3-D9         3 Mbps
Wi-Fi                     Intel(R) Wi-Fi 6E AX211 160MHz                8 Up           58-1C-F8-24-D3-D5     866.7 Mbps
イーサネット              Intel(R) Ethernet Connection (23) I2...       7 Disconnected E4-46-B0-37-19-A5          0 bps
```


```powershell:2-結果を行方向でピボット
PS C:\> get-netadapter | Where-Object {$_.MacAddress -eq "58-1C-F8-24-D3-D9"}

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...      10 Disconnected 58-1C-F8-24-D3-D9         3 Mbps 
```

```powershell:3-列方向でピボット
PS C:\> get-netadapter | Where-Object {$_.MacAddress -eq "58-1C-F8-24-D3-D9"} | Select-Object ifIndex

ifIndex
-------
     10
```

```powershell:4-結果を後処理で受け取り
PS C:\> get-netadapter | Where-Object {$_.MacAddress -eq "58-1C-F8-24-D3-D9"} | Where-Object {Write-Host $_.ifindex}
10
```
`$_.ifindex`とWhere-Objectで目的のデータにたどり着けた。

```powershell:5-本当にやりたかったこと
get-netadapter | Where-Object {$_.MacAddress -eq "58-1C-F8-24-D3-D9"} | Where-Object {set-DnsClientServerAddress -InterfaceIndex $_.ifindex -ServerAddresses ("8.8.8.8")}

```

### 2. 値を複数取得し、値を元にコマンド実行するワンライナー
例：すべてのアダプタのDNSの設定をする
- get-netadapterの戻り値をネットワークアダプタ情報を取得
- set-dnsclientserveraddressでアダプタにDNSを設定

```powershell: 1-単体での実行結果
PS C:\> get-netadapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
イーサネット 2            Realtek USB GbE Family Controller            12 Disconnected A0-CE-C8-D7-07-1D          0 bps
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...      10 Disconnected 58-1C-F8-24-D3-D9         3 Mbps
Wi-Fi                     Intel(R) Wi-Fi 6E AX211 160MHz                8 Up           58-1C-F8-24-D3-D5     866.7 Mbps
イーサネット              Intel(R) Ethernet Connection (23) I2...       7 Disconnected E4-46-B0-37-19-A5          0 bps
```

```powershell: 2-逐次実行処理
get-netadapter | ForEach-Object{Write-Host $_.MacAddress}
A0-CE-C8-D7-07-1D
58-1C-F8-24-D3-D9
58-1C-F8-24-D3-D5
E4-46-B0-37-19-A5
```

```powershell:3-本当にやりたかったこと
get-netadapter | ForEach-Object{set-DnsClientServerAddress -InterfaceIndex $_.ifindex -ServerAddresses ("8.8.8.8")}
```

## 3. 連続した処理をワンライナーで逐次実行させたい
例：特定のディレクトリを取得後、cdしてから、lsコマンドを実行する
ライブラリの相対パスの関係が大事になってくる場合に使える。

```powershell:cdしてコマンド実行後、元のディレクトリへ戻る
PS C:\>  ls | Select-Object -first 1 |Where-Object {write-host $_.Name; cd $_.Name} ; ls; cd ..
Fujitsu


    ディレクトリ: C:\Fujitsu


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/03/31     17:21                Bundle
d-----        2023/03/31     17:21                fjadviser
da----        2023/03/31     17:21                ICON
da----        2023/03/31     17:21                manual
d-----        2023/03/31     16:53                Model
d-----        2023/03/31     16:35                Softwaredisc
```


```powershell:get-netadapterを3回連続で実行

PS C:\> get-netadapter; get-netadapter; get-netadapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
イーサネット 2            Realtek USB GbE Family Controller            12 Disconnected A0-CE-C8-D7-07-1D          0 bps
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...      10 Disconnected 58-1C-F8-24-D3-D9         3 Mbps
Wi-Fi                     Intel(R) Wi-Fi 6E AX211 160MHz                8 Up           58-1C-F8-24-D3-D5     866.7 Mbps
イーサネット              Intel(R) Ethernet Connection (23) I2...       7 Disconnected E4-46-B0-37-19-A5          0 bps
イーサネット 2            Realtek USB GbE Family Controller            12 Disconnected A0-CE-C8-D7-07-1D          0 bps
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...      10 Disconnected 58-1C-F8-24-D3-D9         3 Mbps
Wi-Fi                     Intel(R) Wi-Fi 6E AX211 160MHz                8 Up           58-1C-F8-24-D3-D5     866.7 Mbps
イーサネット              Intel(R) Ethernet Connection (23) I2...       7 Disconnected E4-46-B0-37-19-A5          0 bps
イーサネット 2            Realtek USB GbE Family Controller            12 Disconnected A0-CE-C8-D7-07-1D          0 bps
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...      10 Disconnected 58-1C-F8-24-D3-D9         3 Mbps
Wi-Fi                     Intel(R) Wi-Fi 6E AX211 160MHz                8 Up           58-1C-F8-24-D3-D5     866.7 Mbps
イーサネット              Intel(R) Ethernet Connection (23) I2...       7 Disconnected E4-46-B0-37-19-A5          0 bps
```
Objectデータの場合は勝手にデータが縦方向に連結される。


## まとめ
ワンライナーで書くためには、`;`、`|`を使い分けると良い。
権限管理変更後にコマンド実行、値の取得を伴う処理などが簡潔に書けるようになる。
ただし、まとめすぎると可読性が落ちるので、ご利用は計画的に。