PowerShellについて





Windows PowerShellは、マイクロソフトが提供するコマンドラインおよび新しいスクリプト言語です。なぜPowerShellを勉強し、気にかけなければならないのですか?それは新しいスタイルのユーティリティだから?もちろん、すべての新しいユーティリティは古いユーティリティと「異なる」と主張されていますが、PowerShellには他のユーティリティと実際に区別されるコンポーネントがいくつかあります。この記事では、PowerShellのスクリプティングコンポーネントのいくつかを見て、一見厄介なことからPowerShellスクリプトの例を作成します。


Windowsコマンドラインユーティリティの簡単な歴史


Windows NTがリリースされた後、CMD.EXEはWindows用のコマンドラインユーティリティになりました。 CMD.EXEはその前身のDOS(COMMAN.COM)の一部のコンポーネントを継承していますが、それでもやはりかなり「原始的な」スクリプト言語に基づいています。つまり、Windowsコマンドファイル(.CMDおよび.BAT)を使用することです。 ) Windows Scripting Host、VBScriptおよびJScript言語の追加により、ユーティリティのスクリプト機能が大幅に強化されました。


これらのテクノロジは、高度なコマンドラインユーティリティとスクリプト環境のバランスの取れた組み合わせです。実際には、CMD.EXE、.CMD、およびWindows Scripting Hostファイルの数が実際の問題ではないため、問題を操作することができます。何が人々を不満にさせるのか、そしていくつかの一見単純な作業を完了することを最も心配している。


コマンドラインツールとスクリプトの "フレームワーク"を使用すると、中程度に合成されたスクリプトでも、バッチコマンド、Windows Scripting Host、および独立した実行可能ファイルの両方を組み合わせる必要があります。各スクリプトは、実行と要求、解析、およびデータの返信に異なる規則を使用します。


CMD.EXEでサポートされている弱い変数、矛盾したインターフェイス、およびWindows設定へのアクセスの制限に加えて、コマンドラインスクリプトの展開と使用がより困難になるという別の弱点もあります。あなたはここで「もう一つの弱点」とは何かを疑問に思うでしょうか?プレーンテキスト(text)だと言ってください。これらのテクノロジでは、すべてがテキスト形式です。コマンドまたはスクリプトの出力はテキストであり、次の命令の入力として機能するように解析およびフォーマットし直す必要があります。これが、PowerShellがすべての従来のユーティリティから削除した基本的な出発点です。


PowerShellスクリプト=ステロイド上のバッチファイル


PowerShell自体は.NET言語で書かれており、.NET Frameworkに大きく依存しています。だからPowerShellはオブジェクト指向のユーティリティとスクリプト言語として設計されています。 PowerShellのすべては、.NET Frameworkの全機能を備えたオブジェクトとして表示されます。コマンドは、そのオブジェクトタイプのプロパティとメソッドを使用して使用できる一連のオブジェクトを提供します。コマンドの出力を別のコマンドのパイプラインに入れたい場合、PowerShellは最初の行のテキスト出力だけでなく、実際にオブジェクトを渡します。これにより、次のコマンドはパイプライン内のオブジェクトのすべてのプロパティとメソッドにアクセスすることができます。


オブジェクトとしてすべてを考慮し、コマンド間でオブジェクトを受け入れることができることは、コマンドラインユーティリティにとって大きな理論上の変更です。それでも、PowerShellは依然として従来のシェルユーティリティのように機能します。コマンド、スクリプト、および実行可能ファイルは、コマンドラインから入力して実行することができ、結果はテキスト形式で表示されます。 Windowsの.CMDファイルと.BATファイル、VBScript、JScript、および実行可能ファイルはCMD.EXE内で機能します。これらはすべてPowerShellで実行されています。ただし、それらはオブジェクト指向ではないため、PowerShellで作成および使用されているオブジェクトに完全にアクセスすることはできません。これらの従来のスクリプトと実行可能ファイルでは、すべてがテキストとして扱われますが、PowerShellを他のテクノロジと組み合わせることができます。一度に変換できない既存のスクリプトの集まりでPowerShellを使い始める場合、これは非常に重要です。


PowerShellスクリプト


技術の素晴らしさを読んで理解することは1つのことであり、それを考慮して使用することは別のことです。この記事の残りの部分では、その機能と使用方法を示すためにPowerShellスクリプトを開発します。


DIRはCMD.EXEで最も人気のあるコマンドの1つです。このコマンドは、親ディレクトリに含まれるすべてのファイルとサブディレクトリを表示します(図1)。各オブジェクトの名前とともに、表示される情報には最新の日時の更新と各ファイルのサイズも含まれます。ディレクトリ内のすべてのファイルの合計サイズ、およびファイルとサブディレクトリの合計数も表示されます。



Hình 1


PowerShellでDIRを実行すると、図2のようなディレクトリ一覧も表示されますが、少し異なります。 PowerShellにはDIRコマンドはありませんが、同じ機能を実行するGet-ChildItemがあります。 PowerShellでは、DIRはGet-ChildItemのエイリアスです。この記事のエイリアスを詳しく調べるつもりはありません。 PowerShellのDIRは、Get-ChildItemの省略形として考えることができます。


PowerShellのDIRは、ファイルとフォルダのリスト、最終更新日時、ファイルサイズという、上記とほぼ同じ情報を提供します。ただし、CMD.EXEのDIRが提供する概要情報が不足しています。ディレクトリ内のすべてのファイルの合計サイズ、ファイルの合計数、およびサブディレクトリの合計数。



Hình 2


シナリオ例では、CMD.EXE DIRコマンドをシミュレートするPowerShellスクリプトを作成する必要があります。以下で、スクリプトの最も重要な部分について説明します。


DIR.PS1:ヘッダ(ヘッダ)


PowerShellスクリプトは、拡張子.PS1のプレーンテキストファイルにPowerShellコマンドを含みます。 DIRを置き換えます。DIR.PS1というテキストファイルを使用します。


スクリプトを実行するには、PowerShell画面に次のコマンドを入力します。


.PS1 X:フォルダ


ここで、Xはドライブのパーティション文字(C、D、Eなど)で、Folderはフォルダ名です。


ドライブパーティションに関する情報を知りたい場合は、Windows Management Instrumentation(WMI)を使用する必要があります。 WMIの詳細はこの記事の範囲外であるため、ここでは触れません。しかし、以下のPowerShellコードは、WMIヘルプを使用しなくても非常に簡単に理解できます。 Get-WmiObjectコマンドで使用する "$ filter"変数を作成できます。このフィルタ(つまり、フィルタ)は、Get-WmiObjectコマンドに、特定のドライブに関する情報だけが欲しいということを伝えます。 Get-WmiObjectコマンドの結果は、$ volInfoという名前の変数に格納されます。 PowerShellではすべてがオブジェクトであることを忘れないでください。 $ volInfoはGet-WmiObjectから返される結果オブジェクトにもなりました。


$ filter = "DeviceID = '" + $ drive + ":'"
$ volInfo = Get-WmiObject - クラスWin32_LogicalDisk - フィルタ$ filter


これで、オブジェクトに関連付けられているすべてのオブジェクトとメソッドにアクセスできます。ドライブパーティションのシリアル番号は、VolumeSerialNumber属性を介してアクセスできます。返される情報は、8文字の文字列のシーケンスです。しかし、多くの場合、ハイフンで区切られた4つの別々の数字でフォーマットしたいと思います。以下の行と同じことができます。最初の行の終わりにあるハイフンは、PowerShellの行シリアル文字です。基本的には、その行が中断されず次の行を含むことをPowerShellに伝えるだけです。行を区切らずにコードを書くとき、幅を狭くしてコードを読み取らせるためには、これを行うべきです。


$ serial = $ volInfo.VolumeSerialNumber.SubString(0、4)+ " - " + `
$ volInfo.VolumeSerialNumber.SubString(4、4)


$ volInfoオブジェクトが利用可能になったので、画面のDIRヘッダー情報を書くことができます。ドライブに名前が付いていない場合、画面のテキストは名前の付いたドライブとは少し異なります。単純なIf-Elseコマンドを使用して、VolumeName属性が空かどうかを確認します。 Write-Hostコマンドは、各コマンド行を画面に書き込むために使用されます。


If ($volInfo.VolumeName -eq "") { Write-Host (" Volume in drive " + $drive + " has no label") } Else { Write-Host (" Volume in drive " + $drive + " is " + $volInfo.VolumeName) } Write-Host (" Volume Serial Number is " + $serial) Write-Host ("`n Directory of " + $args[0] + "`n")

Write-Hostコマンドの最初と最後の "n"文字は、テキストの前後に新しい行を挿入するために使用されます。 Write-Hostコマンドは、各行の末尾に新しい行を追加します。したがって、 "n"の効果はテキスト行の前後に空白行を作成することです。


Bạn có chú ý đến cụm “-eq” trong lệnh If? Đó là một toán tử so sánh bằng. Bảng bên dưới sẽ cho bạn biết tất cả các toán tử so sánh:



























-eq、-ieqで比較
-ne、-in比較は等しくありません
-あなたは本当により大きな比較
- あなた、 - アイより大きいか等しい
-lt、-ilt小さく比較
-le、-ile小さいか等しい

比較演算子の前の-i文字は、演算子で大文字と小文字が区別されないことを示します。



Hình 3: Dữ liệu đầu ra (output) của script hiện bạn đang có


DIR.PS1:ファイル/フォルダ一覧


これで、このフォルダの内容とプロパティを表示する準備が整いました。最初にやるべきことは、PowerShellのGet-ChildItemコマンドを呼び出してファイルのセットを出力し、それらをパラメータとしてスクリプトに入れることです。 Get-ChildItemコマンドは、名前だけでなくファイルとフォルダのオブジェクトセットも取得しますが、これらのオブジェクトを並べ替えるためにSort-Objectコマンドに直接送ることもできます。デフォルトでは、Sort-ObjectコマンドはName属性に基づいてオブジェクトをソートします。だからあなたは他のパラメータを記述する必要はありません。ソートされたオブジェクトのセットは$ itemsという名前の変数に格納されます。


$ items = Get-ChildItem $ args [0] | 0ソートオブジェクト


ファイルオブジェクトとフォルダオブジェクトのコレクションを作成したら、それらを繰り返し処理して適切な機能を表示する必要があります。これに対するコマンドはForEachです。ファイルまたはフォルダごとに、表示される機能は、最後に更新された日時、名前、長さ、またはファイルサイズになります。角かっこ内の文字列は.NET文字列形式コードです。これらは、フィールドの左右を揃えたり、日付、時刻、および数値をフォーマットするために使用されます。これらの文字列フォーマットを理解することはそれほど重要ではありません、なぜならそれらはこのスクリプトの性質を反映するのに不可欠ではないからです。


Ifコマンドは、オブジェクトがディレクトリかどうかを判断する場所です。 Mode属性の最初の文字が "d"の場合、オブジェクトはディレクトリです。ディレクトリのコードはファイルのコードと異なることが多いため、もう一度確認する必要があります。


Ifコマンド内の$ totalDirs ++行に注目してください。これは、電話番号を追跡するためのカウンタです。同様に、すべてのファイルの合計サイズを追跡するために使用される$ totalFiles変数があります。これらの値は常に実行中に計算されます。しかし、それらはファイル一覧表示プロセスが終了したときにのみ表示されます。


ForEach ($i In $items)
{
  $date = "{0, -20:MM/dd/yyyy hh:mm tt}" -f $i.LastWriteTime
  $file = $i.Name
  If ($i.Mode.SubString(0, 1) -eq "d")
  {
     $totalDirs++
     $list = $date + "   {0, -15}" -f "
        " + " " + $file
  }
  Else
  {
     $totalFiles++
     $size = "{0, 18:N0}" -f $i.Length
     $list = $date + $size + " " + $file
  }
  $totalSize += $i.Length
  Write-Host $list
}


Hình 4: Hiển thị dữ liệu xuất của script được update.


DIR.PS1:Postfix(フッター)


残された唯一のことは、このドライブパーティションのファイル、フォルダ、全ファイルの合計サイズ、および空き容量の合計数を画面に書き込むことです。これを行うには、前のセクションで作成したカウンター変数($ totalFiles、$ totalDirs、$ totalSize)を使用する必要があります。スクリプトの作成開始時に作成された$ volInfo変数から空き容量を知ることができます。


Write-Host ("{0, 16:N0}" -f $totalFiles + " File(s)" + `
           "{0, 15:N0}" -f $totalSize + " bytes")
Write-Host ("{0, 16:N0}" -f $totalDirs + " Dir(s)" + `
           "{0, 16:N0}" -f $volInfo.FreeSpace + " bytes free`n")


Hình 5: Hiển thị hoàn toàn dữ liệu đầu ra (output) của script.


予測と改善する能力は


作成したスクリプトはCMD.EXE DIRコマンドと同じ出力データを提供しますが、知っておく必要がある予測がいくつかあり、いくつかの機能強化が可能です。



  • このスクリプトはエラーチェックを行いません。

  • 有効なパスがスクリプトに入力されていない場合、スクリプトはPowerShellエラーメッセージを表示して失敗します。

  • Get-ChildItemコマンドに "。"が含まれていないため、スクリプトで指定されているディレクトリの数はCMD.EXE DIRコマンドから2未満です。そしてCMD.EXEのように ".."ディレクトリ。

  • あなたのスクリプトはファイル名、ディレクトリ名によって順序をソートするだけで他のソートプロパティを提供しません。

  • あなたのスクリプトはディレクトリの内容とすべてのサブディレクトリを表示する機能を持っていません。


終わりに


PowerShellは強力なユーティリティおよびスクリプト言語ですが、特に.NET Framework環境に慣れていない場合は、キャプチャして使用できるようになるまでに少し時間がかかります。この記事とサンプルスクリプトが、PowerShellを理解したい人に役立つことを願っています。しかし、例で作成したスクリプトは非常に単純です。より複雑なアプリケーションに役立つように、より完全に構築および開発できると考えています。





コメント