目次
PowerShellとは?
Windows PowerShell、ご存知でしょうか。その名が表す通りWindows上にて対話形式でコマンドを実行するシェルです。Microsoftの説明によれば以下の通りです。
Windows PowerShell は、特にシステム管理者向けに設計された Windows コマンド ライン シェルです。 Windows PowerShell には対話型のプロンプトとスクリプト環境が含まれており、それらを単独で、または組み合わせて使用できます。
対話型の環境以外もあるのですが、今回は対話型のコマンド実行環境について簡単に紹介していきたいと思います。シェルと言えば有名なのが、LinuxのBashなどです。非常に高機能なシェルだといえます。一方、Windowsには古くから「コマンドプロンプト」と言われる、似たような対話式のコマンド実行環境がありました。こちらでもちょっとしたことは出来るのですが、Bashほど便利な機能やツール群は揃っていません。最近ではWindows上でもBashを使うことができますが、導入のハードルが高かったり、利用できないコマンドもあったりするため、十分とは言えないでしょう。PowerShellはBashに劣らず高機能なコマンドを豊富に備えており、操作もBashに共通する部分が多くあります。また、導入に関してはWindows10ならば最初からインストールされているので、手間は全くかかりません。では、そんな魅力的なPowerShellについて紹介していきましょう。
PowerShellの起動方法
さっそくPowerShellを起動してみましょう。なお、筆者の環境はWindows 10 Home バージョン 1909(OSビルド 18363.720)です。Windows 10ユーザーであればどなたでも起動できるでしょう。GUIで行いたい場合は、スタートメニューの「W」欄から「Windows PowerShell」を探して実行してください。もし、上記の手順でスタートメニューに存在しない場合やキーボードのみで操作を行いたい場合は次のようにします。Windowsキー + R を押して「ファイル名を指定して実行」からpowershell
と入力して実行してください。上記のいずれかの手順でPowerShellが起動し、対話式のコマンドウィンドウが表示されます。
PowerShellでコマンドを実行する
では、コマンドを実行してみましょう。ここで実行するのはGet-ChildItem
というコマンドです。コマンドラインにGet-ChildItem
と入力してエンターキーを押してください。
1
2
3
4
5
6
7
8
9
10
11
12
|
PS C:\Users\user1> Get-ChildItem
ディレクトリ: C:\Users\user1
Mode LastWriteTime Length Name
---- ------------- ------ ----
da---- 2019/01/17 21:59 .android
d----- 2015/04/09 1:00 .AndroidStudio
d----- 2018/10/05 21:44 .AndroidStudio2.3
d----- 2019/09/24 1:44 .atom
d----- 2019/10/29 1:00 .config
:<code></code>
|
実行すると、カレントディレクトリ以下のディレクトリとファイルが表示されます。前項の手順でPowerShellを起動した場合、ホームディレクトリは起動したWindowsユーザーのディレクトリになるので、その中にあるファイル一覧が表示されるでしょう。もし作業を終えてPowerShellを終了したくなったら、exit
と入力してエンターキーを押してください。ウィンドウが閉じ、プログラムが終了します。なお、PowerShellの世界においてはGet-ChildItem
などのコマンドは正確にはコマンドレット(cmdlet)と言います。コマンドライン上で実行できるものには他に関数(function)がありますが、ここでは区別せず、両者ともコマンドとして扱います。
PowerShell上の便利な操作
まずは簡単なコマンドを実行してみました。PowerShellには他にも覚えておくと便利な操作があります。では、PowerShellを使うにあたり、もっと素早く正確に作業を行えるような便利な操作を紹介していきましょう。
- エイリアス
- タブによる補完
- コマンドヒストリー
エイリアス
PowerShellには、コマンドに別名をつけてより覚えやすく簡単に利用するエイリアスという機能があります。先ほどGet-ChildItem
コマンドを実行して、既に他のシェルをお使いの方は、何かに似ていると思いませんでしたか?LinuxやmacOSをお使いの方ならls
、今までWindowsでコマンドプロンプトを利用していた方ならdir
を思い浮かべることでしょう。そして、ls
やdir
の方が短くてタイプしやすいと思うかもしれません。実はPowerShellではls
もdir
も使えてしまうのです。早速コマンドラインにてls
を実行してみてください。
1
|
PS C:\Users\user1> ls
|
先ほどGet-ChildItem
を実行したのと同じ結果が表示されるでしょう。さらにそれ以外にも、カレントディレクトリの移動にcd
、文字列の出力にecho
なども使えます。本来はカレントディレクトリの移動はSet-Location
、文字列の出力はWrite-Output
というコマンドを用いるのですが、PowerShellではそれらのコマンドに別名(エイリアス)をつけることができます。エイリアスを用いることで他のシェルに慣れ親しんだ方も利用しやすくなっています。エイリアスは自分で設定することもできますし、最初から設定されているものもあります。ls
やecho
などの基本的なものは最初から設定されています。他にどんなエイリアスが設定されているか知りたい方はPowerShellにてGet-Alias
コマンドを実行してください。設定されているエイリアスの一覧が表示されます。
タブによる補完
コマンドやコマンドのパラメーター名、ファイル名などの入力の途中でタブ(Tab)キーを押すことにより、以降を自動的に入力してくれます。新しい環境で新しいコマンドを実行しようとすると、コマンド名を間違えたり、覚えていてもタイプミスをしてしまったりすることもあるでしょう。例えば、現在のディレクトリ内のプレーンテキストファイルをすべて表示したいとします。Get-Ch
まで入力してタブキーを押してみてください。
1
|
PS C:\Users\user1> Get-Ch<Tab>
|
以降が補完されGet-ChildItem
と入力されます。さらにパラメーターを与えて、Get-ChildItem -Path ./* -I
と入力したところで、パスで指定したものから、さらに条件に一致するものを取得するパラメーター名のスペルを忘れてしまったとします。そんなときでもタブキーを押してみてください。
1
|
PS C:\Users\user1> Get-ChildItem -Path ./* -I<tab>
|
Include
パラメーターが補完され、その後にパラメーターの値として*.txt
を入力すれば簡単にGet-ChildItem -Path ./* -Include *.txt
コマンドが完成します。このタブによる補完機能はファイル名やディレクトリ名でも有効です。兄弟ディレクトリのprojects
ディレクトリに移動したいときにはcd ../p
と入力してからタブキーを押せば、タブキーを押すごとにp
から始まる兄弟ディレクトリが順次入力されます。
コマンドヒストリー
コマンドの履歴から、以前に入力したコマンドを参照または実行できます。あるディレクトリでその中身を確認しようとGet-ChildItem
をいくつかのパラメーターをつけて実行したとしましょう。しかし、その中には目的のファイルが無かったとします。そして、cd
コマンドで別のディレクトリ移動したあと、もう一度先ほどと同じコマンドを実行したいのですが、パラメーターをつけて実行するのがやや面倒です。そんな時はコマンドライン上で上(↑)キーを押してみてください。1回上キーを押すとコマンドライン上に1つ前に実行したコマンドが入力されます。この場合ですと、ディレクトリ移動に使用したcd
コマンドが出てくるでしょう。その状態からもう1回上キーを押すと、さらにそこから1つ前に実行したコマンドが入力されます。これで先ほど入力したやや長いパラメーター付きのコマンドを簡単に呼び出すことができます。現在のコマンド履歴を確認するにはGet-History
コマンド、履歴の中から指定してコマンドを直接実行するにはInvoke-History
コマンドが利用できます。
PowerShellで出来ること
では最後に応用編としてPowerShellでやや複雑な処理を行ってみましょう。特定のディレクトリ内のテキストファイル(*.txt)をZIPアーカイブしてから、メールに添付して自分のGmailアカウントに送信することにします。詳細な説明は省きますが、「こんなことも出来るんだ」とPowerShellの可能性を感じてみてください。まずは、タイプミスを防ぐために変数archiveに作成するZIPファイルのフルパスを設定しておきます。
1
|
PS C:\Users\user1> $archive = “$pwd\mydocs.zip”
|
次にZIPアーカイブを作成します。ここではルートディレクトリ直下のfolder1
ディレクトリ内のすべてのテキストファイルのみをアーカイブにまとめます。
1
|
PS C:\Users\user1> Get-ChildItem -Path c:/folder1/*.txt | Compress-Archive -DestinationPath $archive
|
Get-ChildItem
とZIPアーカイブを作成するCompress-Archive
コマンドをパイプライン|
でつないでいます。そして作成されたZIPファイルをSend-MailMessage
コマンドを使い、メールで送信します。メールアドレスのユーザー名とパスワードは伏せています。また、PowerShellに限らず、アプリケーションからGoogleアカウントでメールを送信するためには、Googleアカウントの設定から「アプリパスワード」を発行する必要があります。
1
2
3
4
5
6
7
8
9
10
11
|
PS C:\Users\user1> Send-MailMessage `
>> -To ******@gmail.com `
>> -From ******@gmail.com `
>> -SmtpServer smtp.gmail.com `
>> -Subject "my powershell zip" `
>> -Body "zip archive for me." `
>> -Attachments $archive `
>> -Credential $(New-Object System.Management.Automation.PSCredential ******@gmail.com, (ConvertTo-SecureString **************** -AsPlainText -Force)) `
>> -Port 587 `
>> -UseSsl `
>> -Encoding $([System.Text.Encoding]::UTF8)
|
以上で完了です。いかがでしょうか。最後のコマンドはパラメーターが多いとはいえ、使用したコマンドはたったの3コマンドです。このようにPowerShellは様々なコマンドを組み合わせて複雑な処理を簡単に行えるのです。
Windowsと親和性の高い強力なPowerShell
ここまで駆け足でPowerShellの紹介と簡単な使い方を説明しました。もしかしたらLinuxやmacOSのユーザーの皆様は「こんなことはBashで出来る」とお考えかもしれません。しかし、WindowsにはずっとGUIの文化があり、cmd.exe
のようなCUIはLinuxなどに比べて非力でした。PowerShellはそんなWindowsに与えられた強力なシェルなのです。Windowsに標準で搭載されていることからもわかるように、Windows上でCUIによる様々な処理を行えます。個人の利用はもちろん、Windowsコンピューターにより構成されたシステムの管理にも非常に役に立ちます。この記事を読み、興味を持たれた方はPowerShellを使ってみてはいかがでしょうか。
インフラエンジニア専門の転職サイト「FEnetインフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。