📄

PowerShellで、複数コマンドを一つずつ確認しながら実行するスクリプト

2024/08/11に公開

はじめに

以前、Linuxで複数コマンドを一つずつ確認しながら実行するスクリプトを記事にしました。

https://zenn.dev/arbr/articles/2790a886e89384

今回はそれをPowerShellで作ってみました。

概要

以前のものと一緒の動きですが、記載しておきます。

  • 複数コマンドを改行で区切ったファイルを、スクリプトファイル実行時に引き渡して使います。
  • 最初に対象のコマンドとインデックス番号を表示して、何番目から始めるかを指定します。
  • 各コマンド実行時は、コマンドの文字列を表示し、実行する/しない を指示します。
    • 実行しない を指示した時点でスクリプトを終了します。

ファイルと実行

まずはスクリプトファイルです。

execute_commands.ps1
# スクリプト実行時にファイルパスを指定
param (
    [string]$FilePath
)

# ファイル内容を読み込み、各行を配列に格納
$commands = Get-Content -Path $FilePath

# 配列をループして、インデックス付きで内容を表示
for ($i = 0; $i -lt $commands.Length; $i++) {
    Write-Output ("[{0}] {1}" -f $i, $commands[$i])
}

# 有効なインデックス番号の入力を促す
$startIndex = -1
while ($startIndex -lt 0 -or $startIndex -ge $commands.Length) {
    $promptMessage = "開始インデックス番号を入力してください (0 ~ {0})" -f ($commands.Length - 1)
    $inputIndex = Read-Host $promptMessage

    if (-not [int]::TryParse($inputIndex, [ref]$startIndex)) {
        Write-Output "無効な入力です。整数を入力してください。"
        $startIndex = -1
    }
}

# 配列のコマンドを実行
for ($j = $startIndex; $j -lt $commands.Length; $j++) {
    $command = $commands[$j]
    $confirmation = ""
    while ($confirmation -ne "y" -and $confirmation -ne "n") {
        $confirmation = Read-Host "次のコマンドを実行してもよろしいですか? `"$command`" (y/n)"
    }

    if ($confirmation -eq "n") {
        Write-Output "スクリプトを終了します。"
        break
    } elseif ($confirmation -eq "y") {
        try {
            Invoke-Expression $command
        } catch {
            Write-Output "コマンドの実行中にエラーが発生しました: $_"
        }
    }
}

以下がテスト用のコマンド群のファイルです。

commands.txt
Write-Output "This is a test message."
Get-Process | Where-Object {$_.CPU -gt 100}
$name = Read-Host "Enter your name"
Write-Output "Hello, $name! Welcome to the test script."
# 年齢を聞きます
$age = Read-Host "Enter your age"
Write-Output "You are $age years old."
# 別のPS1ファイルを実行
.\AnotherScript.ps1
date

内部で呼び出している別ファイルです

AnotherScript.ps1
Write-Output "This is a message from AnotherScript.ps1."

実行するコマンドは以下になります。

.\execute_commands.ps1 -FilePath "commands.txt"

実行した結果は以下のようになります。

おわりに

WinSrvでも、操作ミスが防げるような仕組みに使えると思い記事にしました。
操作の標準化として、これに従うように作ってもらえると、運用側は楽になるかと思います。

この記事がどなたかのお役に立てれば幸いです。

Discussion