Visual Studio Code上で Windows Script Hostの動作チェックをしようとしてタスク実行でハマったのでメモ
ターミナルをNyagosに指定した状態で タスクを実行してみる。
Cofigure Taskのテンプレート Others で作られるサンプルタスク
Ctrl
+Shift
+b
したらターミナルが開いて Hello
してくれる(はず)
{
// 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
}
}
]
}
- 実行結果(エラー)
> 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>
$
問題点は二つ
謎のパラメータが追加されている。
> 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 に直接パラメータを追加してみる(失敗)
パラメータごと " "
でくくられてしまってるっぽい。
"terminal.integrated.shell.windows": "\"${env:SCOOP}\\apps\\nyagos\\current\\nyagos.exe\" -c",
> Executing task: echo Hello <
ターミナル プロセスが起動に失敗しました: シェル実行可能ファイル ""d:\scoop\<User>\apps\nyagos\current\nyagos.exe" -c" へのパスが存在しません。
ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
terminal.integrated.shellArgsにパラメータを追加してみる(失敗)
やっぱり cmd.exe用の/d
が付与されている。
"terminal.integrated.shell.windows": "${env:SCOOP}\\apps\\nyagos\\current\\nyagos.exe",
"terminal.integrated.shellArgs.windows": ["-c"],
> Executing task: echo Hello <
'/d' is not recognized as an internal or external command,
operable program or batch file
ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
対策
対策といっても直接 exe実行でうまく行かないならバッチファイルなりWSHなり経由するしかないわけですが。そういえば みんな大好き cmderではどうしているのかと確認してみたら、パラメータのありなしでシェル振り分けられてました。
IF [%1] == [] (
REM -- manually opened console (Ctrl + Shift + `) --
CALL "%~dp0..\init.bat"
) ELSE (
REM -- task --
CALL cmd %*
exit
)
タスクの時は直接 cmd.exeを起動。タスク窓は実行したらすぐ閉じるわけだし、ノーマルな環境での動作確認という意味でもこれでいいのか。
結論
cmderの判定部分をまんまコピーして Nyagos起動部だけ書き換え。バッチファイルの保存場所はどこでもいいんだけど Scoop使いなので一応 persistフォルダに。
@echo off
IF [%1] == [] (
REM -- manually opened console (Ctrl + Shift + `) --
%SCOOP%\apps\nyagos\current\nyagos.exe
) ELSE (
REM -- task --
CALL cmd %*
exit
)
"terminal.integrated.shell.windows": "${env:SCOOP}\\persist\\nyagos\\my_nyagos-vscode.bat",
動作確認
-
タスク実行
ctrl
+shift
+b
> Executing task: echo Hello < Hello ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
-
手動でターミナル起動
ctrl
+shift
+@
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