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


はじめに

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

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

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

aliasおさらい(実行環境を整える)

PowerShellはUnixのコマンドとの互換性を意識してか、 cdwget が打ち込めますが、これらはPowerShellで定義されたコマンドのエイリアスです。
登録しているエイリアスは、以下のコマンドから確認できます

PS C:\> alias

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

aliasGet-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 という変数が定義されており、上記コマンドで開かれるメモ帳の中に、エイリアスをガシガシ書いてゆきます。

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

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 を読み込みましょう。

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を変更します(永続的に反映されます)。

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ワンライナー の準備が整いました。

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

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

よく使う順に4つ。


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のGUIで出来ることは何でもPowerShellで出来る らしいので、普段の面倒くさいルーチンワークはガシガシaliasに書いちゃいましょう。

Appendix

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

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

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