【Windows】PowerShellの使い方

WindowsにはPowerShellというアプリが最初からインストールされています。
このPowerShellでは、コマンドという命令文を入力してOS(Windows)を操作することができます

Macであればターミナルを使用しますが、WindowsではこのPowerShell(または後述するコマンドプロンプト)を使用します。

Macのターミナルと同様に、普通にパソコンを使用するだけであればこのPowerShellを使用する機会はないかもしれませんが、プログラミングを進めていくと使用する機会がありますので、基本的な操作を学習しましょう。

このPowerShellは「コマンドライン」と呼ばれる命令行を記述します。Enterキーを押したり改行コードを含めるなど、行が終了するとコマンドが実行されます。

コマンドプロンプトとPowerShell

Windowsにはコマンドプロンプトという同じようなアプリがあります。このコマンドプロンプトはMS-DOSプロンプト(エムエス-ドス プロンプト)と呼ばれるアプリの後継にあたるものです。

このMS-DOSプロンプトとコマンドプロンプトには互換性がある部分も多く、MS-DOSプロンプトの開発が終了した2000年以降ではコマンドプロンプトが使用されてきました

しかし、このコマンドプロンプトには短所と言える部分があり、それを補うための上位互換としてWindows7からはPowerShellがデフォルトで搭載されるようになります

ただ、コマンドプロンプトとPowerShellには完璧といえる互換性がなく、コマンドプロンプトに依存したものが多くあることから現在も共存している状態となっています

bashzshとの違い

MacのターミナルではbashまたはzshというUnix Shell(ユニックス シェル)が使用されています。
ユーザーがコマンドでコンピュータを操作するためのプログラムのことをShell(シェル)と言います。UnixというのはOS(オペレーティングシステム)の一つで、50年以上前に誕生したOSです。このUnixを始祖とした多くのOSが誕生してきました。Linux(リナックス)やmacOS(マックオーエス)、Android(アンドロイド)もその中の一種です。

Windowsは、このUnixとは全く異なる構造のOSであり、他のOSと比べて特殊な部類に入ります。そのため、コマンドプロンプトではUnix系シェルで使用されるコマンドが未対応であったりコマンドが異なるといったことが多々あります
しかし上位互換であるPowerShellはUnix系シェルのコマンドでも実行が可能で、近年では「macOS」や「Linux」でも動作可能になりました。

また、PowerShellを使用すればMicrosoft Office製品(Excel、Wordなど)を操作することもできるため、作業効率化のための自動化プログラムなども作ることができます

プロンプト(コマンド入力位置)の見え方の違いとして、bashzshは、%$が表示されたあとにコマンドを入力しますが、コマンドプロンプトやPowerShellでは>の後にコマンドを入力します。

今後のページでコマンド入力の箇所が%$となっている場合は、その後に続くコマンドを>の後に入力して実行してください。

また、特に記述がない場合はPowerShellを使用してください

PowerShellを開く

Windows10でPowerShellを開く方法について解説します。

  1.  画面下にあるタスクバーの検索ボックスに「PowerShell」と入力してください。
  2. 検索結果に「Windows PowerShell」が表示されるので選択して起動します。
PowerShellをタスクバーから検索する
PowerShellをタスクバーから検索
PowerShellを開く
PowerShellを開いた直後

ディレクトリ操作のチュートリアル(PowerShell)

ここでは基本的なコマンドを実際に実行してみましょう。

PowerShellを新しく開いてください。

pwd(Print Working Directory)

現在の作業ディレクトリを表示するコマンドです。

以下のコマンドを実行することで、現在どのディレクトリで操作しているのかを絶対パスで確認することができます。


PS C:¥Users¥xxx> pwd
Path
----
C:¥Users¥xxx
    

絶対パスとは、一番上の階層(ルート)から特定のファイルまたはディレクトリまでのパスのことです。
パスは階層ごとに円記号(¥)で区切られていますが、指定する場合はスラッシュ(/)を使用することができます。また、絶対パスは多くの場合先頭がドライブ名(C:)から始まります

mkdir(Make Directories)

ディレクトリ(フォルダ)を新しく作成します。

以下のようにコマンドを実行すれば、現在の作業ディレクトリに新しくtestというディレクトリを作成します。


PS C:¥Users¥xxx> mkdir test

    ディレクトリ: C¥Users¥xxx

Mode               LastWriteTime       Length Name
----               -------------       -----------
d-----      2020/12/01     18:24              test
    

絶対パスでは C:¥Users¥[ユーザー名]¥test というディレクトリを作成したことになります。

更に、以下のようにコマンドを実行するとtestディレクトリの中にhogeというディレクトリを作成することができます。


PS C:¥Users¥xxx> mkdir test/hoge

    ディレクトリ: C¥Users¥xxx¥test

Mode               LastWriteTime       Length Name
----               -------------       -----------
d-----      2020/12/01     18:31              hoge
    

この test/hoge というのは相対パスと言います。

絶対パスとの違いは、相対パスの場合、先頭がドライブ名(C:)から始まらないことと、現在の作業ディレクトリを基準とした相対的なパスを用いることです。

また、絶対パスと同様にディレクトリの下層ディレクトリ(またはファイル)を指すときはディレクトリ名と下層ディレクトリ名を円記号(¥)またはスラッシュ(/)で区切ります

cd(Change the current Directory)

現在の作業ディレクトリを他のディレクトリに移動します。

コマンドの後に入力するパラメータはディレクトリの場所(パス)である必要があります。

以下のコマンドで、先ほど作成したhogeディレクトリに移動します。


PS C:¥Users¥xxx> cd test/hoge
PS C:¥Users¥xxx¥test¥hoge> 
    

相対パスで上の階層のtestを指す場合はドットを2つ重ねて..とします。

一つ上のtestディレクトリに移動する場合は以下のようにコマンドを実行します。


PS C:¥Users¥xxx> cd ..
PS C:¥Users¥xxx¥test> 
    

ls(List directory contents)

このコマンドを実行することで、ディレクトリ内のファイルやディレクトリをリスト形式で表示することができます。


PS C:¥Users¥xxx> ls

    ディレクトリ: C¥Users¥xxx¥test

Mode               LastWriteTime       Length Name
----               -------------       -----------
d-----      2020/12/01     18:31              hoge
    

WindowsのPowerShellではUnix系シェルの-lオプションを使用してファイルの所有者情報などを表示することができません。

似たことをPowerShellで行う場合は以下のように記述します。


PS C:¥Users¥xxx¥test> Get-ChildItem -Recurse | Foreach-Object { Get-Acl $_.FullName }


ディレクトリ: C:¥Users¥xxx¥test


Path Owner                 Access
---- -----                 ------
hoge LAPTOP-EKJU8PIE¥nexus NT AUTHORITY¥SYSTEM Allow  FullControl...
    

ここで使用しているGet-ChildItemというコマンドはPowerShell本来のコマンドの書き方です。

lsコマンドも本来であればGet-Item * というコマンドを使用しますが、これだとUnix系シェルを使用しているユーザーが使いにくくなるのでlsというエイリアス(別名)が用意されています。

ですので、Unix系シェルとコマンドは同じでも結果や使用できるオプションに違いがあることがあります

rmdir (Remove empty directories)

このコマンドは空のディレクトリを削除する場合に使用します。

hogeディレクトリを削除してみましょう。


PS C:¥Users¥xxx¥test> rmdir hoge
    

lsコマンドを実行するとhogeディレクトリが削除され、何も出力されないことが分かります。

ただし、もしhogeディレクトリの中に他のファイルやディレクトリが存在する場合、つまり空ではないディレクトリを削除する場合は、以下のように警告メッセージが出力されます。

 


PS C:¥Users¥xxx¥test> rmdir hoge

確認
C:¥Users¥nexus¥test¥hoge の項目には子があり、Recurse
パラメーターが指定されていませんでした。続行した場合、項目と共にすべての子が削除されます。続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y
    

ディレクトリ内のすべてのファイル(またはディレクトリ)を削除する場合は、Yを入力してEnterキーを押します。

そもそもこの警告メッセージを表示させたくない場合は、メッセージに書いてあるとおり以下のようにRecurseパラメータを指定します。


PS C:¥Users¥xxx¥test> rmdir -Recurse hoge
    

Unix系シェルのrmdirコマンドでは空ではないディレクトリを削除することはできませんでしたが、PowerShellのrmdirコマンドでは内部でRemove-Itemコマンドが使用されており、このコマンドはUnix系シェルのrmコマンドと同じように動作します。

また、PowerShellのrmコマンドも内部的にRemove-Itemコマンドが使用されるため、rmdirではなくrmと置き換えても同じように削除されます。

チュートリアルを試してみよう!

前のレッスン
次のレッスン

Twitterでアウトプット

理解したことや分からないところはTwitterでつぶやいてみよう!

この学習ページで学んだことをTwitterでアウトプットしてください。

アウトプットするメリット

学習仲間が増える

同じ課題を持った仲間が増えるため、学習へのモチベーションが継続しやすくなります。

より深く理解する

頭では理解したと思っていても、文章化することで初めて気づくことがあります。