はじめに
株式会社パレットリンクの@TS_1230です。
普段の業務ではbatファイルやps1ファイルを編集することが多いのですが、学生時代はWindowsではなくMacやUbuntuでbashコマンドを使っていた為、なかなかWindowsコマンドの勝手が掴めないこともあったりなかったり。。。
なので、ここで一度お勉強しようと思い、勉強のきっかけとして本記事を書くことにしました。
PowerShellとは
「WindowsにはコマンドプロンプトとPowerShellがあるけど片方だけで十分では?」と思っていたので、まずPowerShellのできた背景について調べてみました。
背景
Windows2000から「コマンドプロンプト」という名称のCUI環境がありましたが、LinuxやUnixのコマンドと比べた場合、機能的に劣っていると言われていたそうです。
その問題を解決するためにMicrosoft社によってプロジェクトが立ち上がり、2006年にPowerShellがリリースされました。
使い分け
背景だけ見るとPowerShellだけで良いような気がしましたが、以下のように使い分けると効率的であるとも言われていました。単純操作をPowerShellで実行すると冗長になってしまうこともあるのでコマンドプロンプトの方が良い場合もあるのですね。
PowerShellはコマンドプロンプトと異なり、出力結果がテキストではなくてオブジェクトとして扱われます。そのため単純なコマンドではシンプルなコマンドプロンプトの方が速く感じる場合があります。ただし複雑な操作を行う場合はコマンドプロンプトはコマンド操作が複雑になるので、PowerShellで行った方が効率的です。
引用記事:https://qiita.com/MetroOsamu/items/9e611310b3ec13460565
PowerShellで出来ること
PowerShellはオブジェクトを扱えて色んなことができます!と言っていますが、具体的に何ができるかあまりわかっていないのでPowerShellのコマンド("コマンドレット"というらしい)を見て、気になったものをいくつかまとめてみようと思います。
Get-verb
このコマンドを実行すると、ほとんどのコマンドが準拠する動詞の一覧が返されます。 応答には、これらの動詞の動作の説明が含まれています。 ほとんどのコマンドはこの名前付け規則に従っているため、コマンドの動作に対する期待が設定されます。 このコマンドは、独自のコマンドを作成するときに、適切な動詞とコマンドの名前を選択するのに役立ちます。
直訳そのままで「動詞を取得する」コマンド、わかりやすいですね。
コマンドレットの命名規則として、動詞と名詞のペアで構成されるというものがあるらしいです。このコマンドを使って動詞を取得することで求めているコマンドレットが探しやすくなったり、独自のコマンド作成時の参考にできるみたいです。
$ Get-Verb
Verb AliasPrefix Group Description
---- ----------- ----- -----------
Add a Common Adds a resource to a container, or atta…
Clear cl Common Removes all the resources from a contai…
Close cs Common Changes the state of a resource to make…
Copy cp Common Copies a resource to another name or to…
Enter et Common Specifies an action that allows the use…
︙
Get-Command
コマンドレット、エイリアス、関数、フィルター、スクリプト、アプリケーションなど、コンピューターにインストールされているすべてのコマンドを取得します。 Get-Command は、システムで使用できる PowerShell モジュールとコマンドからコマンドを取得します。
先ほどのGet-Verbコマンドと組み合わせてコマンドを探せそうですね。先ほどの実行結果にあった"Copy"という動詞で検索してみると、コピー系のコマンドが2つあることがわかりました。
$ Get-Command -verb Copy
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Copy-Item 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Copy-ItemProperty 7.0.0.0 Microsoft.PowerShell.Management
動詞ではなく名詞部分で検索をする場合は-Nounオプションを使うみたいですね。"Command"関係のコマンドを検索してみると、Get-command以外にも色々あることがわかりました。
$ Get-Command -Noun Command
CommandType Name Version Source
----------- ---- ------- ------
Function Find-Command 2.2.5 PowerShellGet
Cmdlet Get-Command 7.5.0.500 Microsoft.PowerShell.Core
Cmdlet Invoke-Command 7.5.0.500 Microsoft.PowerShell.Core
Cmdlet Measure-Command 7.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Trace-Command 7.0.0.0 Microsoft.PowerShell.Utility
Find-Command
先ほどの検索結果から「Get-CommandとFind-Commandの違いってなんだろう...」と思ったので、こちらについても調べてみました。
コマンドレット、エイリアス、関数、ワークフローなどの PowerShell コマンドを検索します。 Find-Command は、登録済みリポジトリ内のモジュールを検索します。
Get-Commandが、ローカル環境にあるコマンドから検索しているのに対して、Find-Commandはインターネット上の公開リポジトリにあるコマンドを探すそうです。検索対象のリポジトリやコマンド名をオプションにつけることで検索できました。
$ Find-Command -Repository PSGallery -Name Find-Command
Name Version ModuleName Repository
---- ------- ---------- ----------
Find-Command 2.2.5 PowerShellGet PSGallery
Find-Command 0.0.4 CompatPowerShellGet PSGallery
また、Install-ModuleやSave-Moduleと組み合わせることでそのままインストールもしくは保存が可能みたいですね。
Find-Command -Repository PSGallery -Name Find-Command | Save-Module -Path <保存先のパス> -Verbose
さいごに
今回はPowerShellが出来た背景とPowerShellでできることのほんの一部について書かせていただきました。コマンド1つ取ってもオプションが複数あったり、コマンドの組み合わせ次第で出来ることの幅が広がるのでちゃんと使いこなすにはまだまだ時間がかかりそうですね。。。
調べていくうちに、コマンドレットで使われているクラスの継承関係や.NETフレームワークなど、関連する項目について勉強するとPowerShellについてより深く学べるのだろうということも分かったので、時間がある時にそちらについても勉強したいと思いました。
拙い記事になってしまいましたが、最後まで読んでいただきありがとうございました!
パレットリンクでは、日々のつながりや学びを大切にしながら、さまざまなお役立ち記事をお届けしています。よろしければ、ぜひ「Organization」のページもご覧ください。
また、私たちと一緒に未来をつくっていく仲間も募集中です。ご興味をお持ちの方は、ぜひお気軽にお問い合わせください。一緒に新しいご縁が生まれることを楽しみにしています。
参考