PowerShellでディレクトリやファイルの一覧を表示させよう
Windows10のPowerShellを使って、ディレクトリやファイルの一覧を表示させてみましょう。
まず、スタートメニューから「Windows PowerShell」を選択して、PowerShellを起動します。
PowerShellのコンソール画面が表示されます。
Windows10に標準でインストールされているPowerShellのバージョンは5.1ですが、最新のバージョンは7.2です。(2022/1/28現在)
コンソールから以下のコマンドを入力してEnterキーを押下すると、カレントディレクトリにあるディレクトリやファイルの一覧が表示されます。
Get-ChildItem
PowerShellでは、コマンドのことをコマンドレットといいます。
コマンドレットは、動詞-名詞の組み合わせになっていますが、名前が長いの難点です。
そのため、コマンドレットには、エイリアス(別名)が用意されています。
Get-ChildItemの場合は、dir、gci、lsをエイリアスとして使うことができます。
なお、出力結果は全て同じです。
以下のコマンドレットを使うと、利用できるエイリアスの一覧が出力されます。
Get-Alias
また、特定のコマンドレットのエイリアスのみを表示したい場合は、以下のオプションを指定します。
Get-Alias -Definition コマンドレット名
指定したディレクトリに存在するファイルの合計サイズを計算するプログラム
ファイル一覧を表示するやり方が分かったところで、簡単なプログラムを作ってみましょう。
Get-ChildItemを使って、指定したディレクトリ配下のファイルサイズを合計するプログラムです。
1 2 3 |
$size = 0 Get-ChildItem -Path $Args[0] -File | ForEach-Object {$size += $_.Length} Write-Host "ファイルの合計サイズは $size byteです" |
このプログラムは3行しかありませんが、2行目が少し難しいかもしれません。
Pathオプションの$Args[0]はスクリプトに渡す第1引数で、このプログラムではディレクトリを指定します。
引数を渡さない場合は$Args[0]に何も入っていないので、カレントディレクトリのファイル一覧を取得します。
取得したファイル一覧をForEach-Objectがオブジェクトとして一つずつ受け取ります。
$_.Lengthを使って、一つずつ受け取ったファイルの情報からサイズを取得して、変数$sizeに加算していくという流れになります。
PowerShellの実行ポリシーを設定しよう
早速プログラムを動かしたいところですが、PowerShellのプログラムは、Windows10ではデフォルトで実行できないようになっています。
デフォルトの状態でプログラムを実行すると、以下のようなエラーメッセージが出力されます。
エラーメッセージ
このシステムではスクリプトの実行が無効になっているため、ファイル XXX.ps1 を読み込むことができません。
詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
Windowsサーバの場合は、デフォルトで実行できるようになっています
そのため、PowerShellの実行ポリシーを変更する必要があります。
まず、以下のコマンドレットを使用して、現在の状態を確認してみましょう。
Get-ExecutionPolicy
デフォルトでは、Restrictedと表示されると思います。
これは、個々のコマンドの実行は許可するが、スクリプトの実行は許可しないという設定です。
実行ポリシーの種類は、以下の通りです。
実行ポリシー | 内容 |
AllSigned | スクリプトを実行できる 全てのスクリプトや構成ファイルが署名されている必要がある |
Bypass | ブロックされず、警告やプロンプトは表示されない |
Default | 既定の実行ポリシーを設定 |
RemoteSigned | スクリプトを実行できる ローカル上のスクリプトは署名されなくてもよい リモート上のスクリプトや構成ファイルは署名されている必要がある |
Restricted | 個々のコマンドは許可するが、スクリプトは許可しない |
Undefined | 実行ポリシーが設定されていない |
Unrestricted | 署名されていないスクリプトも実行できる |
また、実行ポリシーには、その影響範囲を決定するスコープという概念があります。
スコープには以下の種類があり、優先順位は上の方が高くなります。
スコープ | 内容 |
MachinePolicy | コンピュータの全てのユーザのグループポリシーに対して設定 |
UserPolicy | コンピュータの現在のユーザのグループポリシーに対して設定 |
Process | 現在のセッションのみに影響 |
CurrentUser | 現在のユーザのみに影響 |
LocalMachine | 現在のコンピュータ上の全てのユーザに影響 |
スコープは、上記のGet-ExecutionPolicyにListオプションを付けることによって、表示することができます。
それでは、PowerShellのプログラムを実行するために、実行ポリシーを変更しましょう。
実行ポリシーの変更は、以下のコマンド使います。
Set-ExecutionPolicy -ExecutionPolicy ポリシー名 -Scope スコープ名
ここではローカルにあるプログラムを実行するので、RemoteSignedを指定します。
スコープは、一般ユーザでPowerShellを起動した場合、CurrentUserのみ変更できます。
他のスコープの実行ポリシーを変更する場合は、管理者ユーザでPowerShellを実行する必要があります。
作成したプログラムを実行しよう
それでは、作成したプログラムを実行してみましょう。
実行する時は、プログラム名の前にディレクトリを指定します。
サンプルでは、カレントディレクトリを表す「./」を使っています。
PowerShellの詳しい仕様などに関しては、以下の公式サイトを参照してください。