for や while でのループ処理って基本だけど実際にどういうときにどういう使い方するのかって開発やってないといまいちピンとこない。
今回は実際にはこんな使い方をするっていることを説明します。シチュエーションはインフラ管理編とでもしておきます。
webでよく見る使い方
使い方 その壱
最も基本的なwhileの使い方かと思います。
1 2 3 4 5 6 7 |
$Count=1 while ($Count -lt 6) { write-host $Count $Count++ } |
動きは以下となります。
- $Count変数に1を代入
- $Count変数が6未満であった場合は3と4を実行
- $Count変数を標準出力に出力
- $Count変数にプラス1
- 2~4を繰り返し
出力結果は以下となります。$Count が6を超えれば自然にループを抜けます。
1 2 3 4 5 6 7 |
> while.ps1 0 1 2 3 4 5 |
使い方 その弐
Break でループを抜ける書き方です。
1 2 3 4 5 6 7 8 9 10 11 |
$Count=1 while ($True) { if ($Count -gt 5) { break } write-host $Count $Count++ } |
出力はその壱と同じです。
こんな使い方ができるよ
IP設定をdhcpに変更するスクリプトを作成したので、ちょっと強引かもしれませんがこんな使い方できるよという紹介です。
動きとしては
- netsh コマンドでdhcpに変更
- ipconfig でIPが取得できているか確認
- 選択肢からIPを確認し直す場合(Yes)と確認を終了する場合(No)を選択
- IPを確認し直す(Yes)を選択した場合は2から再度ループ処理
確認終了を選択した場合(No)は Break にて終了
スクリプトは以下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ADAPTER_NAME = "イーサネット" # dhcp netsh interface ip set address "$ADAPTER_NAME" dhcp # check while ($true) { ipconfig /all | more $typename = "System.Management.Automation.Host.ChoiceDescription" $yes = new-object $typename("&Yes","実行する") $no = new-object $typename("&No","実行しない") $assembly= $yes.getType().AssemblyQualifiedName $choice = new-object "System.Collections.ObjectModel.Collection``1[[$assembly]]" $choice.add($yes) $choice.add($no) $answer = $host.ui.PromptForChoice("<実行確認>","`r`nもう一度IPを確認する場合は「y」を押下`r`n確認をやめる場合は「n」を押下",$choice,0) if ($answer -eq 1) { break } } |
ipconfig を while で回している理由は環境によってはすぐにIPを取得できないこともあるため、ですが、そう考えると ipconfig /release 、ipconfig /renew もいれたほうが良いかも。。。と思ってきました。でも試したところ特に問題なく変更してIPの確認までできたので、いったんこれで良しとします。
ちなみに出力結果は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
> .\chgdhcp.ps1 IP設定をDHCPに変更しています。 Windows IP 構成 ホスト名. . . . . . . . . . . . . . .: xx-PC プライマリ DNS サフィックス . . . . .: ノード タイプ . . . . . . . . . . . .: ハイブリッド IP ルーティング有効 . . . . . . . . .: いいえ WINS プロキシ有効 . . . . . . . . . .: いいえ イーサネット アダプター イーサネット: 接続固有の DNS サフィックス . . . . .: 説明. . . . . . . . . . . . . . . . .: Realtek xxxx Family PCI-E Gigabit... 物理アドレス. . . . . . . . . . . . .: xx-xx-xx-xx-xx-xx DHCP 有効 . . . . . . . . . . . . . .: はい 自動構成有効. . . . . . . . . . . . .: はい IPv4 アドレス . . . . . . . . . . . .: 192.168.2.100(優先) サブネット マスク . . . . . . . . . .: 255.255.255.0 リース取得. . . . . . . . . . . . . .: 2017年5月20日 16:54:29 リースの有効期限. . . . . . . . . . .: 2017年5月21日 16:54:29 デフォルト ゲートウェイ . . . . . . .: 192.168.2.1 DHCP サーバー . . . . . . . . . . . .: 192.168.2.1 DNS サーバー. . . . . . . . . . . . .: 192.168.2.1 NetBIOS over TCP/IP . . . . . . . . .: 有効 <実行確認> もう一度IPを確認する場合は「y」を押下 確認をやめる場合は「n」を押下 [Y] Yes [N] No [?] ヘルプ (既定値は "Y"): # y を押下するともう一度、ipconfig を実行 # n を押下するとループを終了して、次の処理へ(なければ終了) |
ADに参加するためのスクリプトがあったらいいなぁと思っていて、クライアントのIP設定をdhcpに設定し直す必要があるのでこれを使いまわすことができそうでよかったです。