今すぐalias登録すべきPowerShellワンライナー

# はじめに

PowerShellで開発する気がなくても、PowerShellを使う機会が最近増えてきたのでAliasを覚える事にしました。

 -  VS Code の統合ターミナルからエイリアスを使って簡単なコマンドを打ちたい…… 
 -  ローカル開発環境に立てたサーバーを見るためにhostsを編集したいけど、毎回ググったりするのに嫌気が指してきた……

※2018年12月時点での環境（PowerShell  5.1.17134.407）で確認しています。
※PowerShellのエイリアスに関する設定が済んでいる場合は以下のページ内リンクをクリックしてください。
[→ 今すぐalias登録すべきPowerShellワンライナー](#今すぐalias登録すべきpowershellワンライナー)


#aliasおさらい（実行環境を整える）
PowerShellはUnixのコマンドとの互換性を意識してか、 `cd` や `wget` が打ち込めますが、これらはPowerShellで定義されたコマンドのエイリアスです。
登録しているエイリアスは、以下のコマンドから確認できます

```powershell
PS C:\> alias

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           ac -> Add-Content
Alias           asnp -> Add-PSSnapin
...
```

`alias` は `Get-alias` のaliasで、Unixの `alias` のように振る舞います。

```
PS C:\> Get-alias gal

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           gal -> Get-Alias
```

デフォルトで振られているので親切ですね。

さて、例えば `Get-ChildItem` コマンドをソートし、なおかつbashの `ls -lat` っぽく振る舞わせるためにこんなPowerShellを書いたとします。

```
PS C:\Users\hoge\Desktop> Get-ChildItem -force | Sort-Object -Property @{ Expression = 'LastWriteTime'; Descending = $
true }, @{ Expression = 'Name'; Ascending = $true } | Format-Table -AutoSize -Property Mode, Length, LastWriteTime, Name


Mode      Length LastWriteTime       Name
----      ------ -------------       ----
-a-hs-       282 2018/12/13 22:06:38 desktop.ini
-a----       750 2018/12/13 0:27:03  hoge.pub
-a----     43272 2018/12/12 7:21:13  piyo.jpg
-a----   5306273 2018/12/10 2:28:56  fuga.gif
-a----      1042 2018/12/10 2:11:40  foo.lnk
-a----     92853 2018/11/28 23:16:01 bar.JPG
...
```

ちなみに普通に `ls` するとこうなる。

```
PS C:\Users\hoge\Desktop> ls


    ディレクトリ: C:\Users\hoge\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2017/04/06      1:20                hoge
d-----       2017/11/15      8:48                piyo
d-----       2016/10/10      0:39                fuga
d-----       2016/05/14     16:45                foo
-a----       2017/01/04      2:31       14416236 bar.zip
-a----       2017/12/22     21:40      228161282 fizz.wav
-a----       2017/11/13      1:03       10224523 buzz.mp3
-a----       2018/12/10      2:28        5306273 1.gif
```

あまり変わりませんがそういう事にしておいてください。

PowerShellにも.bashrcのようなものがあり、このワンライナーをシェルの起動時に実行されるスクリプトとして記述してみましょう。

```
PS C:\> notepad $profile
```

起動時に実行されるスクリプトの場所として `$profile` という変数が定義されており、上記コマンドで開かれるメモ帳の中に、エイリアスをガシガシ書いてゆきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82888/405f923f-0f2d-56e6-2b4a-56a7119e2503.png)

ファイルが存在しない場合、 `New-Item -type file -force $profile` と打ち込むことで対象のパスに新しいファイルが作成されます。

```text
function CustomListChildItems { Get-ChildItem $args[0] -force | Sort-Object -Property @{ Expression = 'LastWriteTime'; Descending = $
true }, @{ Expression = 'Name'; Ascending = $true } | Format-Table -AutoSize -Property Mode, Length, LastWriteTime, Name }
sal ll CustomListChildItems
```

最初 `$profile` の中は空なので、試しに先程のコマンドをエイリアスにしてみます。

1行目で関数を宣言し、2行目でエイリアスを登録しています。
※この記事はワンライナーがテーマなので、必要に応じて改行してください

さて `$profile` を読み込みましょう。

```powershell
PS C:\Users\hoge\Desktop> & $profile
& : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\hoge\Documents\WindowsPowerShell\Micros
oft.PowerShell_profile.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsof
t.com/fwlink/?LinkID=135170) を参照してください。
```

このようなメッセージが出た場合、Execution_Policiesを変更します。

```
PS C:\Users\hoge\Desktop> Start-Process powershell.exe -Verb runas
```

管理者権限でPowerShellを起動して、

```
PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned
```

[ExecutionPolicy](https://go.microsoft.com/fwlink/?LinkID=135170)を変更します（永続的に反映されます）。

ExecutionPolicyに関しては、スクリプトが実行可能なレベルとして他にも色々ありますが、必要最低限を考えるとRemoteSignedで良いと思います。

```
PS C:\> . $profile
PS C:\> gal ll

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ll -> CustomListChildItems
```

`. $profile` で `$profile` を読ませたら、 `ll` コマンドで動作確認をします。

```
PS C:\> ll

Mode        Length LastWriteTime       Name
----        ------ -------------       ----
-a-hs-    16777216 2018/12/17 20:58:57 swapfile.sys
-a-hs- 33285996544 2018/12/17 20:58:55 pagefile.sys
-a-hs- 10276958208 2018/12/17 20:58:52 hiberfil.sys
d--hs-             2018/12/16 15:46:29 System Volume Information
d-r---             2018/12/15 16:24:07 Program Files
```

これで、`今すぐalias登録すべきPowerShellワンライナー` の準備が整いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82888/5110b710-2ce3-e1f4-7f60-f4b97d343718.png)


また、VSCodeのターミナルが `integrated` （デフォルト）の場合、この時点で上のターミナル（ `Ctrl+@` ）からでもエイリアスが機能するようになります。

#今すぐalias登録すべきPowerShellワンライナー

よく使う順に4つ。

```powershell

function CustomListChildItems { Get-ChildItem $args[0] -force | Sort-Object -Property @{ Expression = 'LastWriteTime'; Descending = $true }, @{ Expression = 'Name'; Ascending = $true } | Format-Table -AutoSize -Property Mode, Length, LastWriteTime, Name }
sal ll CustomListChildItems

function CustomSudo {Start-Process powershell.exe -Verb runas}
sal sudo CustomSudo

function CustomHosts {start notepad C:\Windows\System32\drivers\etc\hosts -verb runas}
sal hosts CustomHosts

function CustomUpdate {explorer ms-settings:windowsupdate}
sal update CustomUpdate
```
ワンライナーで書いておくとどんなaliasを振っているのか分かってとても良い。

以下簡単な解説。

- ll
    - `ls -lat` のように振る舞います
- sudo
    - PowerShellを管理者権限として実行する時、普通の権限のコンソールからこれを実行すると管理者権限でPowerShellが起動します
- hosts 
    - Notepadを使ってWindows10環境のhostsファイルを管理者権限で開きます
- update
    - Windows Updateを開きます
    - `ms-settings` のイディオムを使うことでWindowsの設定を一発で開くことができます
        - http://www.atmarkit.co.jp/ait/articles/1707/11/news009.html の2ページ目を参考に

基本的に `WindowsのGUIで出来ることは何でもPowerShellで出来る` らしいので、普段の面倒くさいルーチンワークはガシガシaliasに書いちゃいましょう。

#Appendix

PowerShellは奥が深いようで、便利PowerShellスクリプトはGitHub上で色々な方がリポジトリを公開しています。やはりシステム管理者向けのハックが多い印象。

 - https://github.com/BornToBeRoot/PowerShell
 - https://github.com/lazywinadmin/PowerShell

モジュールまで作られている。PowerShellMafiaとは……

 - https://github.com/PowerShellMafia/PowerSploit


参考までに今までブックマークしたQiitaのPowerShell系記事を紹介させて頂きます。

- https://qiita.com/AnarchyInvestor/items/b281d9e8239ac21a461b
    - ちょっと長いけどたくさんのコマンドが端的にまとまっていて参考になります。
- https://qiita.com/tomoko523/items/87ccaec05a433b02f67e
    - かわいいプロンプトは正義。
- https://qiita.com/kikuchi/items/59f219eae2a172880ba6
    - ExecutionPolicyに関する日本語ドキュメントはちょっと不親切な感じなので、参考になります。
- https://qiita.com/tiibun/items/5719869552ee5b713d83
    - alias使うまで毎日のように見てた（覚えられないので）
- https://qiita.com/cd01/items/da9a36582372e7d0a7f6
    - 便利PowerShell。引数でゴニョるタイプのスクリプトはargumentでエイリアスを無理やり実装するより覚えたほうが良さそう