WindowsのTerminalを使う開発時の初期設定

# はじめに
Windowsで、PowerShellとAnacondaとWSLのUbuntuを使う開発をやってます。役割は、PowerShellはgit、Anacondaはpythonの環境とか、Ubuntuでdockerを使ってます。よくあるのでは・・・？

それをWindowsのTemrinalで３つのタブでやってるんですけど、毎日きっちり同じ作業をするだけで、数分かかってめんどくさい。指の準備運動みたいな感じ。とにかくめんどくさい。

ということでそれを自動化したメモです。
どなたかのご参考になれば。
またよりよい方法があればコメント欄で教えてください。

# 最初に結論、全コード
下記の`.ps1`ファイルを作って、右クリックから`Power Shellで実行`することで解決してます。
```powershell:初期設定.ps1
# 1. import
Add-Type -AssemblyName Microsoft.VisualBasic
Add-Type -AssemblyName System.Windows.Forms

# 2. Terminal起動
Start-Process wt.exe
sleep -Milliseconds 1000
$app = Get-Process -Name "WindowsTerminal"
[Microsoft.VisualBasic.Interaction]::AppActivate($app.ID)

# 3. Powershell
[System.Windows.Forms.SendKeys]::SendWait("cd C:\path_to_dev_dir{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("git status{ENTER}") 

# 4. anaconda
[System.Windows.Forms.SendKeys]::SendWait("^(+2)") 
sleep -Milliseconds 2000
[System.Windows.Forms.SendKeys]::SendWait("conda info -e{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("conda activate using_environment{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("cd C:\path_to_dev_dir{ENTER}") 

# 5. Ubuntu
[System.Windows.Forms.SendKeys]::SendWait("^(+3)") 
sleep -Milliseconds 3000
[System.Windows.Forms.SendKeys]::SendWait("cd /mnt/c/path_to_dev_dir{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("sudo service docker start{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("docker-compose up{ENTER}") 

```
順に説明します。

# 1. 最初の呪文
```powershell:初期設定.ps1の1/5
# 1. import
Add-Type -AssemblyName Microsoft.VisualBasic
Add-Type -AssemblyName System.Windows.Forms
```
あとで鍵かっこの`[System.Windows.Forms.SendKeys]::SendWait`とかを使うためのimport文です。
これを書かないと、`型 [System.Windows.Forms.SendKeys] が見つかりません。`というエラーが出ます。

# 2. Terminal起動
```powershell:初期設定.ps1の2/5
# 2. Terminal起動
Start-Process wt.exe
sleep -Milliseconds 1000
$app = Get-Process -Name "WindowsTerminal"
[Microsoft.VisualBasic.Interaction]::AppActivate($app.ID)
```
Terminalを起動して、アプリケーションを最前面に送ります。
このタイミングで別の作業をやろうと最前面に来たTerminalのウィンドウより前に何かをやると、そっちにキーを押す信号が送られる（SendKeyされる）ので触ってはいけないです。（ここはダサいから、本当はなんとかしたい）

`wt.exe`が、ターミナル（Windows Temrinal）のプログラムですね。準備ができるまで１秒待ってます。（ここもダサいけど、まじめに待つ処理を書いても数秒早く終わるということしか得られないので、費用対効果的にこれでいいかなと）

`Get-Process`でプロセス情報を得ます。ここで指定している「WindowsTemrinal」ですが、ほかのアプリでこの作業をしたいときのために書いておきます。
これはPowerShellの画面で、`Get-Process | Select-Object`とやると一覧をざーっと見ることができます。出てくる表の`ProcessName`を指定します。なので起動中の秀丸エディタを呼び出したいときの指定方法は？というと、秀丸エディタを起動した状態で上のコマンドを実行してみたらなんとなくわかります。ちなみに`Hidemaru`でした。exeファイル名とほとんど同じかもしれませんが、一応コマンドで見た方がよいかと。

`AppActivate`にプロセスID`$app.ID`を渡すと、ウィンドウが最前面に来ます。

# 3. PowerShell
```powershell:初期設定.ps1の3/5
# 3. Powershell
[System.Windows.Forms.SendKeys]::SendWait("cd E:\Public\github\yo16\bookshelf_2023{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("git status{ENTER}") 
```
最初はPowerShellで開発フォルダへ移動しています。`cd ～`というキー入力を送って、最後にENTERしてます。
そのあと、`git status`して状態を確認してます。

# 4. Anaconda
```powershell:初期設定.ps1の4/5
# 4. anaconda
[System.Windows.Forms.SendKeys]::SendWait("^(+2)") 
sleep -Milliseconds 2000
[System.Windows.Forms.SendKeys]::SendWait("conda info -e{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("conda activate using_environment{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("cd C:\path_to_dev_dir{ENTER}") 
```
つぎのAnacondaは、`Ctrl+Shift+2`で起動しています。
これは、私のTemrinalでは、下のように設定しているからできることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/84105a7d-40b8-d0a9-b0ac-4ae0befb429e.png)
この設定方法は私の下記の記事とか、「windowsターミナルの設定追加方法」でググって調べてみてください。基本的にはショートカットを見て、マネして作ります。ご要望があればAnacondaの設定方法版も書きます。

https://qiita.com/yo16/items/f849bdd419b1c8ba1aac

話がそれたので戻して、Anacondaを起動するときの`^`とか`+`は、下記をご覧ください。`^`はCtrl、`+`はShiftだけど、結構癖があります。

https://learn.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364423(v=msdn.10)?redirectedfrom=MSDN

そのあとなんとなく2秒ほど待ち、自動だったら不要だけど人だったらやる`conda info -e`をなんとなくしておいて、使う環境を`conda activate`しています。ここは普通のanacondaの操作方法。

# 5. Ubuntu
```powershell:初期設定.ps1の5/5
# 5. Ubuntu
[System.Windows.Forms.SendKeys]::SendWait("^(+3)") 
sleep -Milliseconds 3000
[System.Windows.Forms.SendKeys]::SendWait("cd /mnt/c/path_to_dev_dir{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("sudo service docker start{ENTER}") 
[System.Windows.Forms.SendKeys]::SendWait("docker-compose up{ENTER}") 
```
最初の起動手順はAnacondaと同じで、Ubuntuは３にしているので`Ctrl+Shift+3`です。
OSの起動なのでなんとなく３秒待って、あとはコマンドを送っているだけです。
cdして、Dockerのサービスを起動して（いちいちやらなくていい設定方法があるのでソレやりたい人は調べてください）、`docker-compose`を使ってるので起動するところまでやってます。

# まとめと所感
難しいことはなく、知ってるか知らないかだけの話でした。私は暗記しておくほど脳の記憶容量が大きくないので、すぐ忘れて、次に必要な時にこの自分の記事を見てコピペすることになるでしょう。

意外とこういう自動的に処理をする系の作業は、やらない人はやろうとしないです。できるかどうかすら考えない。ま、やればいっか、という感じで近視眼的。新しいことを調べたり考えたりしないといけないから、ちょっとした敷居があるんですよね。だけど１度やったらもう忘れていいし、こういうことの積み重ねで、仕事の早い人とそうでない人の差が出ると、私は思います。

一方で、退屈なことはPythonにやらせようという本が爆発的に人気になってたりして、自動化勢も割といるとも言えますね。「ま、やればいっか」勢の人は、本当に後れを取るんだと思います。
<a href="https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E7%AC%AC2%E7%89%88-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/4873119278?keywords=%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFpython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86&qid=1684645917&sprefix=%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AF%2Caps%2C231&sr=8-1&linkCode=li2&tag=utaubanana22-22&linkId=a47f40e41cd1487c8245eb66c7745fb0&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873119278&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=utaubanana22-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=utaubanana22-22&language=ja_JP&l=li2&o=9&a=4873119278" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
この記事を読んでくださっている方は自動化勢だと思いますので、まだ始められていない方は、とりあえず簡単なところからやってみたらいかがでしょうか。
私も、この`ps1`ファイルをwindowsを起動したら勝手に連動して起動してもらうためにはどうしたらいいか（`shell:startup`を検索して入れるだけなんですが）とか、Visual Studio Codeも開くとか、Explorerもとか、さらに改善していきます！