PowerShell Whileループ:基本への回帰ガイド

PowerShellは、自動化やWindowsベースのシステムの管理に多くの機能を提供する強力なスクリプト言語です。最も一般的に使用される構文の1つは、PowerShellのwhileループです。

PowerShellスクリプトの学習中に無限ループに陥ってしまった場合でも心配はいりません。PowerShellのwhileループがあなたを素晴らしい脱出へ導きます。そして、このチュートリアルでは、スクリプトを書きながらPowerShellでのwhileループの基本に戻ります。

次のレベルのPowerShellスクリプト作成スキルを身につけるために、読み続けてください!

前提条件

このチュートリアルは実演形式です。一緒に進めるためには、以下のものを用意してください:

  • A Windows machine – This tutorial uses Windows 10.
  • Windows PowerShell 5.0以上がインストールされていること – このチュートリアルではPowerShell 7を使用します。
  • A user account with administrator privileges.

単一条件のwhileループの実行

whileループの中でも、最も簡単なタイプの1つは単一条件タイプです。このタイプのループは、指定された条件がtrueに評価される限り、一連の指定されたコマンドを実行します。’False’が返されると、ループが終了し、スクリプトの残りの部分が実行されます。

以下は、単一の条件 while ループの構文です:

  • 最初に気づくことは、括弧の使用です。条件は括弧で囲まれ、コードブロックは条件が true の間に実行される PowerShell コマンドのセットです。
  • 注意すべき2つ目の点は、条件がブール値を返す必要があり、その値は True または False に評価されることです。
while (condition)
{

	# 実行するコードブロック

}

以下のコードを実行します。ここでは、$val の値は 0 から始まり、コードブロックが実行されるたびに 1 ずつ増加し、$val 変数の値が 3 になるまで続きます。

$val3 になると、条件が False になり、ループが中断され、スクリプトの残りの部分が実行されます。

# $val 変数を初期値 0 で宣言
$val = 0

# $val 変数の値が 3 になるまで while ループを設定
while($val -ne 3)
{
	# $val 変数の値を 1 ずつ増加
	$val++
	
	# $val 変数の現在の値を表示
	Write-Host $val
}
Understanding Single Condition While Loops.

前述の例では、whileループで条件を使用することができます。ただし、PowerShellの組み込み変数($trueおよび$falseなど)も使用してWhileループを作成できます。

以下の構文は、$trueがもはや$trueでなくなるまで実行されます。言い換えれば、このループは永遠に実行されます。ただし、無限ループから抜ける方法を常に含める必要があります。そうしないと、永遠にスタックします。このチュートリアルの後でbreakcontinueを使用してループから抜ける方法について詳しく学びます。

while($true)
{

	# 実行するコード ブロック

}

以下のコード ブロックを実行します。これは永遠に実行され、$iの値をコンソールに表示します。

# $i変数を0の初期値で宣言
$i = 0

# 条件が$trueの間、Whileループを設定
while($true)
{
	# $iの値を1増やす
	$i++
	
	# $i変数の現在の値を表示
	Write-Host $i
}

今、ループから抜けるにはCtrl+Cを押します。このループは多くのシステムリソースを消費するため、注意して使用してください。

Executing a while loop with PowerShell’s built-in ($true) variable

複数条件を持つWhileループを実行する

さらに、単一条件のwhileループに加えて、複数条件のwhileループも作成できます。単一条件のWhileループと同様に、条件は真(True)または偽(False)のいずれかを返さなければなりません。

以下は、複数条件のwhileループの構文であり、単一条件のwhileループの構文と類似しています。主な違いは、以下の演算子で区切られた複数の条件を含めることができる点です:

  • AND (-and) – 両方の条件が真である必要があります。
  • OR (-or)(どちらかの条件が真であることができます)。
# AND演算子
while (condition1 -AND condition2)
{

	# 実行するコードブロック

}

# OR演算子
while (condition1 -OR condition2)
{

	# 実行するコードブロック

}

以下のコードを実行し、$val3でない(-ne)かつ$i5でない(-ne)間ループします。

両方の変数の値がそれぞれの条件に達すると、ループが終了し、スクリプトの残りの部分が実行されます。

# 初期値として $val と $i 変数を 0 で宣言します
$val = 0
$i = 0

# $val が 3 に等しくなり、$i が 5 に等しくなるまで While ループを実行します
while($val -ne 3 -and $i -ne 6)
{
	# $val を 1 ずつ増やします
  $val++
	# $i を 2 ずつ増やします
  $i += 2
	# $val と $i 変数の現在の値を表示します
  Write-Host "$val, $i"
}

AND 演算子を使用した while ループの実行

Executing a while loop with AND operator

以下のコードを実行して、ユーザーに年齢を尋ねます。その値は $age 変数に格納されます。

ユーザーが数値を入力し、それが 1 未満であるか、数値ではない場合 (-nomatch)、ユーザーに再度有効な数値を入力するように促します。この動作は、ユーザーが有効な入力を複数回入力する機会を与えるのに役立ちます。

# ユーザーに年齢を入力するように促します
$age = Read-Host "Please Enter Your Age"

# ユーザーが有効な入力を提供するまで While ループを実行します
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# ユーザーに有効な年齢の数値を再度入力するように促します
  $age = Read-Host "Please Enter Your Valid Age"
}
# 有効な年齢入力を表示します
Write-Host "Your age is $age

以下の出力では、ユーザーに年齢を入力するように三度促されたことがわかります。

  • 最初の入力では、ユーザーは数字ではないtenを入力しました。
  • 2回目の入力では、ユーザーは1未満の0を入力しました。
  • 3回目の入力では、ユーザーは有効な年齢である10を入力しました。
Executing a while loop with the OR operator

WhileループでBREAKおよびCONTINUEキーワードを使用する

PowerShellスクリプトに柔軟性を追加する方法を見てきました。ただし、Whileループの実行をより制御するために、BREAKキーワードとCONTINUEキーワードを追加します。

たとえば、配列内の特定の数のアイテムのみを処理したい場合、BREAKキーワードを使用して、処理するアイテムの数が達成されたときにループを終了することができます。

これらのキーワードの機能は次のとおりです。

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

以下のコードを実行すると、10個のアイテムの配列をループ処理します。

以下のコードでは、$iの値をチェックするifステートメントがあります。もし$iの値が5であれば、continueキーワードはループ内の残りのコードをスキップし、次のイテレーションに進みます。もし$iの値が8であれば、breakキーワードはループを終了し、スクリプトの残りの部分に進みます。

それ以外の場合、whileループは(Write-Host)を表示して$i変数の値を1増やします。

# 10個のアイテムからなる$arrayを宣言
$array = 1..10
# 初期値が0の変数$iを宣言
$i = 0
# 条件が満たされるまでWhileループを実行
while($i -lt $array.Count)
{
	# $iが5と等しいか確認
  if($i -eq 5)
  {
		# そうであれば、$iを1増やす
    $i++
		# 次の繰り返しに進む
    continue
  }
	# $iが8と等しいか確認
  if($i -eq 8)
  {
		# そうであれば、Whileループを抜けてスクリプトの残りを続行
    break
  }
	# $iの現在の値を出力
  Write-Host "Processing item $i"
	# $1を1増やす
  $i++
}

出力の下部に表示されているように、ループは配列の5番目と8番目のアイテムをスキップしました。whileループは他のすべてのアイテムを処理し、8番目のアイテムに到達した後に終了しました。

Executing a while loop with break and continue keywords

Whileループの実行時間の制限

通常、ループの実行時間を制限したい場合があります。おそらく、リモートサーバーに接続しようとしています。その場合、whileループ内で Start-Sleepコマンドレットを使用して、サーバーが応答するまで待機し、タイムアウトしてループを終了できます。

Start-Sleepコマンドレットは、スクリプトの実行を指定された時間だけ一時停止します。

以下のコードを実行して、現在の日付と時刻を取得し、$startTime変数に保存します。whileループは、現在の日時が$startTimeに保存された値から10秒未満の間実行されます。

whileループが実行されると、Start-Sleepコマンドレットがスクリプトの実行を1秒間一時停止します。

以下のコードブロックは、実際の使用時に必要な内容に基づいたものです。ループ内のコードを必要に応じて追加できます。

# 現在の日付/時刻を取得して保存します
$startTime = Get-Date
# 現在の日付/時刻が10秒未満の間、Whileループを実行するように設定します
	# $startTimeに保存された値から
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# メッセージを出力します
  Write-Host "Waiting for server to respond..."
	# スクリプトを1秒間一時停止します
  Start-Sleep -Seconds 1
}

以下に、ループが終了する前に10秒間継続して実行されるのが見えます。

Limiting the time a while loop runs

結論

PowerShellのwhileループは、複雑な概念に直面したときにループに詰まるのを避けたり、スクリプトを書く際に便利です。そして、このチュートリアルでは、より柔軟で強力なスクリプトを作成するためのwhileループのさまざまな方法を学びました。

この新たな知識を活用すれば、可能性は無限大です。だから、なぜ論理演算子やキーワードの使用を最大限にして、スクリプトでタスクを自動化しないのでしょうか?

Source:
https://adamtheautomator.com/powershell-while-loop/