Powershell Foreach、While、およびその他のループのしくみ

Powershell Foreach、While、およびその他のループのしくみ

プログラミング学習の重要な最初のステップは、ループを操作することです。ありがたいことに、PowerShellはあなたのスキルとともに成長し続けます。





コンピューターのスピーカーが機能しないのはなぜですか

時間と労力を節約するために、ループ内で毎日使用する既存のコマンドをフレーム化できます。 MakeUseOfでより多くの記事を読むという重要な作業をしている間、スクリプトは手間のかかる作業を行います。





Powershell ForEachループ:高度なデータ処理への扉

ForEachは、ForEach-Objectのエイリアスです。 (エイリアスは、PowerShellのコマンドのショートカットにすぎません。)これは、PowerShellがデータを処理する方法について話す良い機会です。





最新のプログラミング言語と同様に、PowerShellはオブジェクト指向です。 PowerShellのすべてがオブジェクトです。つまり、変数も 拡張されたプロパティと機能があります 。このプロパティにより、検索を変数に設定して、結果の配列を作成できます。

$yourVar = Get-ChildItem *
foreach ($file in $yourVar){
Your Steps
}

一部の言語では、この配列の処理は多段階のプロセスになります。まず、長さを取得してから、各ステップをカウントアップします。



PowerShellでは、配列をステップスルーし、ForEachを使用して各配列に対してアクションを実行します。これにより、数行のコードが節約され、スクリプトが長い場合に役立ちます。たとえば、以下は、いくつかのPowershellForEachループを使用する小さなスクリプトです。 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 Directory
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およびDoWhile:条件付きループ

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

i=0
while(i<10){
Your Steps
i+=1
}

問題は、カウンターを使用していない場合、テストがtrueであっても、コードを少なくとも1回実行する必要がある場合があることです。これは、以下のサンプルスクリプトの場合です。したがって、そのような場合は、Do-Whileループを使用する必要があります。構文は少し異なります。

do{
Your Steps
}while(Conditional Statement)

これらを使用することは、初心者のプログラマーにとってはそれほど明白ではありません。通常の日常のスクリプトを実行すると、それほど頻繁にスクリプトに遭遇することはありません。それらが特に役立つのは、プロセスの成功をテストするための間に合わせのタイマーを作成することです。

Twitterで単語をブロックする方法

リモートマシンを再起動し、15分以内に復旧しない場合に警告する簡単なスクリプトを作成します。このシナリオは、ホームサーバーまたは他のマシンが頻繁に再起動しないことを前提としています。コンピュータが通常より速く起動する場合は、時間を自由に調整してください。

再起動と確認:Do-Whileループの使用

このスクリプトは少し単純です。まず、 コンピューターを再起動 リモートマシンを再起動するコマンド。 (ここでは、再起動コマンドにダミーのIPを使用しました。必ず、これをコンピューターのDNS / IPで上書きしてください)。次に、カウンター変数を作成します。 次に、それを0に設定します。次に、Start-Sleepを使用してDoループを作成し、スクリプトを300秒(5分)停止します。 2番目のコマンドは、カウンターに1つ追加します。

Restart-Computer -ComputerName 127.0.0.1
i=0
do{
Start-Sleep -Seconds 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'
}

次に、While基準があります。 Orテストを使用して、障害がアラートを生成することを確認します。別の方法は、リモートマシンを無限に待機するスクリプトループです。マシンをチェックするために、私たちはを使用しています テスト接続 コマンドレット。簡単にするために、これはPowerShellのPingです。パラメータを追加します -静かな これにより、パケットの結果ではなく、TrueまたはFalseが返されます。 Orステートメントの2番目の部分は、カウンターが3を超えるかどうかをチェックします。

ループが完了したら、出力を作成します。つまり、カウンターをチェックする必要があります。これは簡単なif / elseステートメントです。 3より大きい場合、スクリプトはリモートマシンが応答していないことを出力します。そうでない場合は、再起動が成功したことを出力します。

その他のループ

PowerShellで使用できるループは他に2種類あります。これらは前の2つのループにいくらか関連しており、あまり一般的に使用されていません。 Forループは、Whileの例と同様に機能します。評価ですべての基準を設定してから、コマンドレットを設定します。

for($i = 0;$i -lt 10;$i++){
Your Steps
}

DoUntilループはDoWhileループに似ていますが、Wh​​ileステートメントをUntilに変更するだけです。サンプルスクリプトでは、動作に関しては同じです。これはスタイルの選択ですが、他の状況ではDoWhileの方が用途が広いです。したがって、覚えているのが1つだけの場合は、DoWhileの方が便利です。

PowerShellには、これらの各ループにも役立ちます。あなたは追加することによって助けを得ることができます だいたい Get-Helpのループ名の前。次に、各タイプの例とその他のヒントを確認できます。これらは行き詰まった場合に役立つはずです。

あなたと一緒に成長し続ける

この時点で、堅牢なスクリプトの作成を開始するためのほとんどのスキルがあります。ホームリグを自動化する場合でも、作業時間を節約する場合でも、ループはスクリプトがより多くのことを実行するのに役立ちます。これらのループをエラー処理と組み合わせると、スクリプトが基本を超えて移動します。これにより、より高度な言語への扉が開かれます。

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

共有 共有 つぶやき Eメール これらのWindowsファイルとフォルダを削除して、ディスク領域を解放します

Windowsコンピュータのディスク領域をクリアする必要がありますか?ディスクスペースを解放するために安全に削除できるWindowsファイルとフォルダは次のとおりです。

次を読む
関連トピック
  • プログラミング
  • パワーシェル
  • スクリプティング
著者について マイケル・マコーネル(44件の記事が公開されました)

Michaelは運命のときにMacを使用しませんでしたが、Applescriptでコーディングすることはできます。彼はコンピュータサイエンスと英語の学位を持っています。彼はしばらくの間、Mac、iOS、およびビデオゲームについて書いています。彼は10年以上、スクリプトと仮想化を専門とする日中のITモンキーです。

電話番号なしのFacebookの2要素認証
マイケル・マコーネルのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください