VSCode で Nyagos : タスクランエラーを回避する

Visual Studio Code上で Windows Script Hostの動作チェックをしようとしてタスク実行でハマったのでメモ


## ターミナルをNyagosに指定した状態で タスクを実行してみる。

Cofigure Taskのテンプレート Others で作られるサンプルタスク
`Ctrl`+`Shift`+`b` したらターミナルが開いて `Hello` してくれる（はず）

``` .vscode\tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "echo",
            "type": "shell",
            "command": "echo Hello",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```



* 実行結果（エラー)

```terminal
> Executing task: echo Hello <

/d: unknown parameter
/c: unknown parameter
echo: unknown parameter
Hello: unknown parameter
Nihongo Yet Another GOing Shell 4.4.9_4-windows-amd64 by go1.16
(c) 2014-2021 NYAOS.ORG <http://www.nyaos.org>
<MyPC:E:/tasktest>
$
```



問題点は二つ

###  謎のパラメータが追加されている。

```terminal
> Executing task: echo Hello <

/d: unknown parameter
/c: unknown parameter
```

この `/d` と `/c` は cmd.exe用のパラメータですね。tasks.jsonで `"type": "shell"`  = cmd.exe って決め打ちでパラメータが付与されてるみたい。　　
しかし起動されるのは`"terminal.integrated.shell.windows"`でユーザーが指定しているターミナルソフト=Nyagos なのでエラーになるということのようです。



### Nyagosがコマンドを受け付けていない。

Nyagosにコマンドを渡すには`-c` か`-k`を付与する必要がありますが、settings.jsonでパラメータを指定してもうまくいきません。




#### terminal.integrated.shell に直接パラメータを追加してみる（失敗）

パラメータごと  `" "` でくくられてしまってるっぽい。

```settings.json
"terminal.integrated.shell.windows": "\"${env:SCOOP}\\apps\\nyagos\\current\\nyagos.exe\" -c",
```

```terminal
> Executing task: echo Hello <

ターミナル プロセスが起動に失敗しました: シェル実行可能ファイル ""d:\scoop\<User>\apps\nyagos\current\nyagos.exe" -c" へのパスが存在しません。

ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
```

#### terminal.integrated.shellArgsにパラメータを追加してみる（失敗）

やっぱり cmd.exe用の`/d`が付与されている。

```settings.json
    "terminal.integrated.shell.windows": "${env:SCOOP}\\apps\\nyagos\\current\\nyagos.exe",
    "terminal.integrated.shellArgs.windows": ["-c"],
```

```terminal
> Executing task: echo Hello <

'/d' is not recognized as an internal or external command,
operable program or batch file

ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
```



## 対策

対策といっても直接 exe実行でうまく行かないならバッチファイルなりWSHなり経由するしかないわけですが。そういえば みんな大好き cmderではどうしているのかと確認してみたら、パラメータのありなしでシェル振り分けられてました。

```cmder\vendor\bin\vscode_init.cmd

IF [%1] == [] (
    REM -- manually opened console (Ctrl + Shift + `) --
    CALL "%~dp0..\init.bat"
) ELSE (
    REM -- task --
    CALL cmd %*
    exit
)
```

タスクの時は直接 cmd.exeを起動。タスク窓は実行したらすぐ閉じるわけだし、ノーマルな環境での動作確認という意味でもこれでいいのか。



## 結論

cmderの判定部分をまんまコピーして Nyagos起動部だけ書き換え。バッチファイルの保存場所はどこでもいいんだけど Scoop使いなので一応 persistフォルダに。

```my_nyagos-vscode.bat
@echo off
IF [%1] == [] (
    REM -- manually opened console (Ctrl + Shift + `) --
    %SCOOP%\apps\nyagos\current\nyagos.exe
) ELSE (
    REM -- task --
    CALL cmd %*
    exit
)
```

```setting.json
"terminal.integrated.shell.windows": "${env:SCOOP}\\persist\\nyagos\\my_nyagos-vscode.bat",
```



### 動作確認

* タスク実行 `ctrl`+`shift`+`b`

  ```terminal
  > Executing task: echo Hello <
  
  Hello
  
  ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
  
  ```

  

* 手動でターミナル起動   `ctrl`+`shift`+`@`

  ```terminal
Nihongo Yet Another GOing Shell 4.4.9_4-windows-amd64 by go1.16
  (c) 2014-2021 NYAOS.ORG <http://www.nyaos.org>
<MyPC:E:/tasktest>
  $ 
```
  
  
  
  うまく行った
  
  

## 参考

https://hebogna.hatenablog.com/entry/2017/12/31/213830

https://qiita.com/LemonmanNo39/items/e02e48cde286b69dce55

https://code.visualstudio.com/docs/editor/integrated-terminal#_can-i-use-cmders-shell-with-the-terminal-on-windows

https://github.com/zetamatta/nyagos/blob/master/Doc/02-Options_ja.md