---
# System prepended metadata

title: PowerShell
tags: [PowerShell]

---

## 為什麼選擇 PowerShell
因特殊需求需要開發由 Windows 發動 ssh 至各 Linux 執行各種 cmd，並獲得結果，最好的方式是使用 PowerShell 設定各 Linux 資訊並一鍵完成。

## 什麼是 PowerShell
PowerShell 是跨平台的工作自動化解決方案，由命令列殼層、指令碼語言，以及組態管理架構所組成。 PowerShell 會在 Windows、Linux 和 macOS 上執行。

## 解決思路
1. 需要填入各 Linux 相關資訊
2. 需要良好的擴充方案
3. 需要依照各設備不同做出區別
4. 需要一鍵完成
5. 可以在各個位置執行，且結果相同

## 資料夾結構
workspace
　　└ cmd
　　　 └ cmd01.txt
　　　 └ cmd01.txt
　　└ output
　　　 └ YYYY-MM-DD
　　└ main.ps1
　　└ putty.exe

### main.ps1
```
# 將 putty 包入此資料夾中，方便任何位置都能執行
$puttyPath = ".\putty.exe"
# 為執行資料夾位置
$workspace = "."

# 建立當下的 output 資料夾並以日期資料夾做區分
# Create output directory
$date = & Get-Date -Format "yyyy-MM-dd"
new-item -itemtype directory -force -path "$workspace\output\$date"

# 主機資訊:
# hostname - 主機名稱
# ipAddr   - 主機位置
# username - 用戶名稱
# password - 用戶密碼
# cmdType  - 欲執行的 Linux cmd 檔案
# Server list
$server = @{ hostname = "Server01"; ipAddr = "192.168.0.100"; username = ""; password = ""; cmdType = "cmd01" },
          @{ hostname = "Server02"; ipAddr = "192.168.0.101"; username = ""; password = ""; cmdType = "cmd02" }

# 使用 putty 做 ssh 後執行 Linux 指令，再將 session log 存於 output 中
# Do cmd
foreach ( $node in $server ) {
    $hostname = $node.hostname
    $ipAddr = $node.ipAddr
    $cmdType = $node.cmdType

    & $puttyPath -ssh $username@$ipAddr -pw $password -m "$workspace\cmd\$cmdType.txt" -sessionlog "$workspace\output\$date\$hostname.log"
    # 同時對多台 server 做 ssh 可能會造成某些網路塞車或其他問題
    # 所以讓各 server 的 ssh 間隔 2 秒
    Start-Sleep -s 2
}

```

### cmd01.txt
```
echo "This is Server01"
```

### cmd02.txt
```
echo "This is Server02"
```

## 執行方式
開啟資料夾後對 main.ps1 點右鍵，點擊 `用 PowerShell 執行`
就能在 output 裡看到 Server01.log 和 Server02.log，內容就是 cmd01.txt 與 cmd02.txt 的執行結果。

## 最終結果
此思路完成填入各 server 的資訊與做出區別，且能擴充各 server 所需的 cmd，在不同的資料夾中都能執行，且點右鍵執行後會自動完成。