\r\n\r\n

powershellのforeach、while、その他のループのしくみ

プログラミング学習の重要な第一歩はループの使用です。powershellのforeach、while、その他のループは、高度なコードの開発に役立ちます...

プログラミングを学ぶ上で重要な最初のステップはループを使うことです。ありがたいことに、PowerShellはあなたのスキルに合わせて成長します。

powershell-loops

毎日使う既存のコマンドをフレーム化してループさせることで、時間と労力を節約することができます。MakeUseOfの記事の重要な仕事についての詳細を読むと、あなたのスクリプトが重い役割を果たすのです!

powershellのforeachループ:高度なデータ処理への扉

ForEachは、ForEachオブジェクトのエイリアスです。(エイリアスとは、PowerShellにおけるコマンドのショートカットに過ぎない)。今こそ、PowerShellのデータ処理方法について議論する良い機会です。

PowerShellはオブジェクト指向のプログラミング言語です。PowerShellではすべてがオブジェクトであり、変数でさえ拡張されたプロパティや関数を持つことになります。このため、検索対象を変数に設定し、結果を配列で表示することが可能です。

$yourVar = Get-ChildItem *
foreach ($file in $yourVar){.
あなたの歩幅
}

言語によっては、この配列の処理は、まず長さを計算し、次に各ステップを計算するというように、多段階の処理になることもある。

PowerShellでは、1つのステップで配列を繰り返し処理し、ForEachを使って各配列に対して操作を実行します。これにより、数行のコードを節約することができ、長いスクリプトがある場合に便利です。例えば、ここにいくつかのPowershellのForEachループを使う小さなスクリプトがあります。30日間開いていないすべてのファイルを含むZIPファイルが作成されます。

foreachループを使ったファイルアーカイブシステムの構築

ステップダウンしていこう。Get ChildItem を使用すると、Documents フォルダにあるすべてのファイルを取得することができます。環境変数$env:USERPROFILEは、現在の設定ファイルを使用するスクリプトを実行します。この変数は、ハードコードされたパスよりも移植が容易です。検索結果を変数 $MyDocs に代入し、ForEach ループを作成して $MyDocs の各 $Doc を段階的に巡回させる。

$oldDocs = @()
$MyDocs = Get-ChildItem -Path "$($env:USERPROFILE)\Documents" -Recurse
foreach ($doc in $MyDocs){。
if($doc.LastAccessTime -lt $(Get-Date).addDays(-30)){.
$oldDocs += $doc
}
}
$ArchiveFolder = New-Item -Path "$($env:USERPROFILE)\Documents$((Get-Date -Format MMddyy).toString())".-ItemType ディレクトリ
foreach ($doc in $oldDocs){.
Move-Item -Path $doc.FullName -Destination "$($ArchiveFolder.FullName)\$($doc.Name)" -Confirm $false。
}
$source = $ArchiveFolder.FullName
$destination = "$($env:USERPROFILE)\Documents$($ArchiveFolder.Name).zip"
Add-Type -AssemblyName "system.io.compression.filesystem"。
[io.compression.zipfile]::CreateFromDirectory($source,$destination)を使用します。
if(test-path $destination){。
Remove-Item -Path $ArchiveFolder -Recurse -Confirm $false
}

ループの中で、各ファイルのLastAccessTimeプロパティが30日より前のものであることをチェックします。get-Dateコマンドレットで取得し、AddDays関数で負の30を取得します。もしそうなら、そのファイルは配列 $myOldDocs に追加されます。ファイルの並べ替えが終わったら、完成した配列を取得し、ZIPファイルを作成します。この処理は、.NETを少し呼び出す必要があるため、少し複雑です。あまり詳しくなくても心配しないでください。TechNetのヘルプドキュメントからコードを盗み出すことができます。

ここで起こっていることを分解すると、30日以上前の今日の日付を名前にした新しいディレクトリに、すべての古いファイルを移動することになります。フォルダを作成したら、同じ名前のZIPアーカイブを作成する必要があります。アーカイブが成功し、.ZIPファイルが存在することを確認するためのテストを行い、新しいフォルダーを削除します。月に1回実行されるスケジュールタスクに設定します。これにより、スペースを節約し、ドキュメントフォルダを整頓することができます。

whileとdo while:ループの条件

特定の条件が満たされたときだけループを実行したい場合は、Whileループを使用します。カウントを記録するために変数を使用する場合は、最初にそれを設定します。

i=0
while(i<10){
あなたの歩幅
i+=1
}

問題は、カウンターを使用しないと、テストが真であっても、コードが少なくとも一度は実行されることが予想されることです。以下のスクリプト例では、このような場合です。そのため、このような場合はDo Whileループを使う必要があります。構文が若干異なります。

do{
あなたの歩幅
}while(Conditional Statement)

初心者のプログラマーにとって、これらの使い方はあまり分かりやすいものではありません。典型的な日々のスクリプト作成では、おそらくあまり遭遇することはないでしょう。特に便利なのは、**プロセスの成功度をテストするための一時的なタイマーです。

リモートマシンを再起動し、15分以内に回復できなかった場合に警告を発するような簡単なスクリプトを作成する予定です。このシナリオでは、ホームサーバーなど、リブートの頻度が低いマシンを想定しています。普段からパソコンの動作が速い方は、自由に時間を調整してください。

再始動と確認:do whileループの使用

このスクリプトはもう少しシンプルです。まず、Restart Computerコマンドを使用して、リモートコンピュータを再起動します。(ここでは再起動コマンドのためにダミーのIPを使用しています。あなたのコンピュータのDNS/IPで上書きしてください)。次に、カウンタ変数iを作成して0に設定します。次に、Start SleepのDoループを使って300秒(5分)スクリプトを停止します。2番目のコマンドは、カウンターに1を加算します。

Restart-Computer -ComputerName 127.0.0.1
i=0

スタート-スリープ -秒数 300
$i += 1
}while((!(Test-Connection 127.0.0.1 -Quiet)) -or $i -gt 3)
if($i -gt 3){.
Write-Ouput "Remote Machine not responding, please check.".
}
else{
Write-Output "Reboot Succeeded" (再起動に成功しました。
}

それから、私たち独自の基準もありました。フォルトがアラートを生成することを確認するために、Orテストを使用しています。この場合、スクリプトはリモートマシンを待つために延々とループすることになります。マシンをチェックするために、Test-Connectionコマンドレットを使用しています。簡単のために、これはPowerShell Pingです。

ループが完了したら、出力を作成したいと思います。つまり、カウンターを確認する必要があるのです。これは、簡単なif/else文です。3より大きい場合、スクリプトはリモートコンピュータが応答しなかったと出力する。そうでない場合は、出力が正常に再スタートします。

その他の回路

PowerShellでは、他にも2種類のループが用意されています。Forループは、Whileの例と同じように動作します。評価の条件をすべて設定してから、コマンドレットを設定します。

for($i = 0;$i -lt 10;$i++){
あなたの歩幅
}

Do Untilループは、While文がUntilに変更されている以外は、Do Whileループと同様である。これはスタイル上の選択ですが、他の場面ではDo-Whileの方が汎用性が高いです。ですから、1つしか覚えていないのであれば、1つ作っておいた方が便利です。

powershell foreach loops

PowerShellには、あらゆるループに対応したヘルプがあります。get helpでループ名の前にaboutをつけるとヘルプが表示されます。そして、各タイプの例やその他のヒントを見ることができます。これらは、行き詰まったときに役立つはずです。

あなたとともに成長しつづける

この時点で、堅牢なスクリプトを作り始めるために必要なスキルのほとんどを身につけていることになります。ホームリグの自動化にも、仕事の時間短縮にも、ループはあなたのスクリプトをより良くするために役立ちます。これらのループとエラー処理を組み合わせることで、スクリプトの基本を超えることができる。これは、より高度な言語への扉を開くものです。

ループを使用して作成された巧妙なPowerShellスクリプトは何ですか?コメントで共有してください。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ