Powershell入門 - 02.コマンドの基本①

基本的な用語として、Powershellで使われるコマンドのことを`コマンドレット`と言います。  

今回はPowershellの基本として、ディレクトリ(フォルダ)の操作に関するコマンドレットを勉強していきます。
GUIによる操作になれていると、操作のしづらさなどを感じると思いますが、頑張って慣れていきましょう。

# 1. ディレクトリの操作

## 1.1. カレントディレクトリを確認する(Get-Location)
CLIを学ぶ上で一番最初に身に着けてほしいことは「現在の自分の位置(**カレントディレクトリ**)を把握すること」です。

カレントディレクトリは`Get-Location`コマンドレットを使って確認できます。
では、Powershellで実行してみましょう。

```powershell
(base) PS C:\Users\XXXXX> Get-Location

Path
----
C:\Users\XXXXX


(base) PS C:\Users\XXXXX>
```

Pathと書かれた部分の`C:\Users\XXXXX`がカレントディレクトリの**フォルダパス**になります。 
この部分の見方を簡単に説明します。

まず、WindowsのCドライブは以下のような階層構造になっています。 
```powershell
C:
- Program Files
- Users
　- Public
　- XXXXX(自分のユーザ名)      # 現在いる位置はココ
- Windows
・・・
```

`C:\Users\XXXXX`の`\`の記号がフォルダの切れ目になっていて、それぞれがフォルダ名に対応しています。
これを日本語で説明すると、「[C:]の中にある[Users]の中にある[XXXXX]フォルダ」となり、それがカレントディレクトリのパスです。

次に、なぜカレントディレクトリが重要かですが、現在の場所が異なるだけで結果が大きく変わることがあるからです。

例えば、以下のコマンドレットを実行するとします。
```powershell
Get-ChildItem
```

これは「[カレントディレクトリにある]すべてのファイル/フォルダを表示する」コマンドレットです。
当然、この操作をDドライブ直下で行った場合と、Cドライブ直下で行った場合では結果が異なります。

この例では意図しない場所で実行したとしても特に影響はありません。
ですが、もし **「\[カレントディレクトリにある\]ファイルを削除する」** というコマンドを実行したらどうでしょうか？
重大な事故を引き起こす可能性もあるので、必ず現在の位置を確認するクセをつけましょう。

### 1.1.1. もう一つの確認方法

実はGet-Locationを使わなくても、カレントディレクトリは確認できます。
皆さんのpowershellの画面を見てみましょう。

```powershell
(base) PS C:\Users\XXXXX>
```
コマンドを入力する行の左側には、常にカレントディレクトリが表示されています。  
そうなると、Get-Locationは意味のないコマンドのように思えますがそうではありません。
そのあたりの理由については、別の記事で説明します。

#### 余談
今後、様々なコマンドレットを学びますが、そのたびに`Get-Location`などをすべて入力するのは正直面倒です。  
この場合、キーボードの`tab`キーを押すことで、入力途中の状態のところから先を補完してくれます。
いくつか候補がある場合は、何度かtabを押すことで選択肢が順番に出てくるので活用しましょう・

## 1.2. カレントディレクトリを変更する(Set-Location)
今回はDドライブ直下にpowershellという名前で資料を格納しました。  
カレントディレクトリをこの場所に変更しましょう。

```powershell
(base) PS C:\Users\XXXXX> Set-Location D:\powershell\
(base) PS D:\powershell>
```

`Set-Location`はカレントディレクトリをセットするためのコマンドレットです。  
このコマンドレットには、パラメータを1つ渡す必要があります。
そのパラメータが「カレントディレクトリにしたいフォルダのフォルダパス」になります。  
上記のコードを実行したことで、カレントディレクトリは「Dドライブの中のpowershellフォルダ」になりました。

### 1.2.1. 絶対パスと相対パス
資料として配布したフォルダは以下のような構成となっています。
```powershell
D:
  - powershell               # カレントディレクトリは今はココ
    - data
      - sampleFolder1
        - sample2.txt
        - sample3.txt
        - sample4.log
        - sample5.py
      - sampleFolder2
        - sampleFolder3
          - sample10.log
        - sample6.txt
        - sample7.txt
        - sample8.log
        - sample9.py
      - sample1.txt
      - sample1.py
```

Set-Locationなど、フォルダパスを指定する場合、指定方法には`絶対パス`と`相対パス`があります。
まず、絶対パスはドライブから順番に階層を辿った場合のパスを書きます。
例えば、sampleFolder1をカレントディレクトリに指定する方法は以下の通りです。
```powershell
Set-Location D:\powershell\data\sampleFolder1
```

絶対パスは、はがきの宛先の書き方に似ています。
例えば、皇居の住所(東京都千代田区千代田１−１)は以下のように考えられます。
```powershell
東京都
  - 千代田区
    - 千代田
      - １丁目
        - １番地
```
このようにトップの位置(この例では東京都)から一階層ずつ掘り下げていくのが、絶対パスの考え方です。

では、以下の例題を解いてみましょう。

---
#### 例題1.
絶対パスを使って、カレントディレクトリをsampleFolder3に変更しなさい。

---

一方、相対パスは「自分から見て、どの位置に相手がいるか」を指定します。
例えば、自分の家の隣の家の場所を説明する場合、一々住所をすべて読み上げるより、「私の家の右(左)隣」と説明したほうが早いですよね？
相対パスも自分から見た相手の位置を伝えるため、絶対パスより短く書ける傾向にあります。

説明のため、一度カレントディレクトリをdataフォルダに変更します。
```powershell
Set-Location D:\powershell\data
```
カレントディレクトリ以下の階層のフォルダへ移動する場合、`Set-Location .\(フォルダ名)`、あるいは単純に`Set-Location (フォルダ名)`とします。

```powershell
Set-Location .\sampleFolder1      # Set-Location sampleFolder1 でも可
```
逆に一つ上の階層へ移動したい場合は、`Set-Location ..\`と`.(ドット)`を2つ重ねて書きます。
```powershell
Set-Location ..\
```
2つ上の階層に移動する場合は、`..\..\`と書きます。それ以降も同じ考えでOKです。
では、同じ階層どうしのカレントディレクトリへはどう移動すれば良いでしょうか？

こちらは例題として考えてみましょう。

---

#### 例題2.
カレントディレクトリをsampleFolder1に設定しなさい（絶対パスでも相対パスでもOK)
その後、相対パスを使って、カレントディレクトリをsampleFolder2に変更しなさい。

---

## 1.3. フォルダの中身を表示する(Get-ChildItem)
GUIであればエクスプローラーを使うことで、あるフォルダに含まれるファイル一覧を目視で確認することができます。
Powershellでも`Get-ChildItem`を使うことでカレントディレクトリの中身を確認できます。
```powershell
(base) PS D:\powershell\data> Set-Location D:\powershell\data
(base) PS D:\powershell\data> Get-ChildItem


    ディレクトリ: D:\powershell\data


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-r---        2022/08/10      9:06                sampleFolder1
d-r---        2022/08/10     13:19                sampleFolder2
-a----        2021/02/25      8:33              0 sample1.py
-a----        2022/08/10      9:08              6 sample1.txt
```

また、フォルダパスをパラメータとして渡すことで、パラメータで指定されたフォルダの中身を表示を表示できます。
こちらについては、例題で確かめてみてください。

---
#### 例題3.
sampleFolder2の中身を表示しなさい

----

# 2. コマンドレットについて
## 2.1. コマンドレットの調べ方(Get-Command, Get-Help)

Powershellのコマンドレットはすべて`動詞-名詞`という法則に従って命名されています。
例えば、`Get-ChildItem`もGetという動詞とChildItemという名詞によって構成されていますね。

どのようなコマンドレットがあるか調べたい場合、以下の`Get-Command`が役に立ちます。
さっそく実行してみましょう。
```powershell
Get-Command
```
実行すると、定義済みのコマンドの一覧が表示されます。
この一覧のうち、コマンドレットであるものは左側に`Cmdlet`と書かれたものだけになります。
コマンドレットのみを抽出する場合は、以下のように書きます。
```powershell
Get-Command -CommandType Cmdlet
```

この中でさらに調べたいコマンドについては、`Get-Help`を使って詳細を確認しましょう。
例えば、Get-Locationについて調べてみます。
```powershell
(base) PS D:\powershell\data> Get-Help Get-Location

名前
    Get-Location

構文
    Get-Location  [<CommonParameters>]

    Get-Location  [<CommonParameters>]


エイリアス
    gl
    pwd


注釈
    Get-Help を実行しましたが、このコンピューターにこのコマンドレットのヘルプ ファイルは見つかりません
    でした。ヘルプの一部だけが表示されています。
        -- このコマンドレットを含むモジュールのヘルプ ファイルをダウンロードしてインストールするには、U
    pdate-Help を使用してください。
        -- このコマンドレットのヘルプ トピックをオンラインで確認するには、「Get-Help Get-Location -Onli
    ne」と入力するか、
           https://go.microsoft.com/fwlink/?LinkID=113321 を参照してください。



(base) PS D:\powershell\data>
```

Get-Helpを使うと基本的な使い方を確認できます。
ただし、注釈にかかれている通り、表示されるのはヘルプの一部だけになります。
そこで、以下のコマンドレットを実行してみましょう。

```powershell
Get-Help Get-Location -Online
```

実行するとMicrosoftの公式ドキュメントへ飛び、コマンドレットの詳細が確認できます。
授業内で教えられるコマンドレットはほんの一部だけになります。
やりたいことが見つかったら、自分でコマンドを調べてみると良いと思います。

---

#### 例題4.
`Get-Content`の使い方を調べなさい。  
その後、sample3.txtの中身を表示しなさい。

#### 例題5.
Get-ChildItemのヘルプを調べ、dataフォルダとそのサブフォルダのすべての要素を表示しなさい。

---

## 2.2. エイリアスについて
Linuxなど他のOSに慣れていると、カレントディレクトリの変更は`Set-Location`ではなく`cd`というコマンドで覚えている人もいます。
これは、Linuxのシェルで使われているコマンドなのですが、これらの既存のコマンド名と互換性を持たせるため、もしくは単純に名称を短縮するために、いくつかのコマンドレットには別名が登録されています。
この別名のことを`エイリアス`と言います。

登録されているエイリアスは以下のコマンドで調べることができます。
```powershell
Get-Alias
```
もしくは、調べたいコマンドレットがわかっている場合、Get-Helpの結果にも表示されているのでそちらを活用しましょう。

例えば、Get-ChildItemはlsという名前でエイリアスが登録されているので、dataフォルダの中身は以下の通りに調べることができます。
```powershell
ls D:\powershell\data
```


---

#### 例題6.
カレントディレクトリを表示する処理をそのコマンドレットのエイリアスを使って実施しなさい。

#### 例題7.
次の一連の処理をエイリアスを使った形式に書き換えなさい。
```powershell
Set-Location D:\powershell\data\sampleFolder1\
Get-ChildItem
Get-Content sample3.txt
```

---

Prev : [01.Powershellとは](./a7fc364da620ba68849e)
Next : [03.コマンドの基本②](./ce474e3eee7d827ce55d)

[目次へ戻る](./926b8053a031539437a3)