2021年6月6日日曜日

Deno.runはダブルクォーテーションを渡す際に¥マークが入ってしまう

例えば「dir "C:¥ab c"」のようなコマンドを実行したい場合、「Deno.run({cmd:['cmd', '/C dir "C:¥ab c"']})」とすれば良い…かと思いきや、それを実行するとコマンドラインに渡る文字列は「cmd /C dir ¥"C:¥ab c¥"」となってしまいます。
これがどうにか回避できないと非常に困るので色々試した結果が以下。



結論から言うと、v1.10.2ではバッチファイルを一時的に作成・実行することで回避できます。

具体的な手順は以下。
  1. カレントディレクトリに存在しないファイル名を探す。
  2. 上記で見つけた名前でバッチファイルを作成する。
  3. バッチファイルの中に、実行したいコマンドを書き込む。
  4. Deno.runで上記バッチファイルを実行して出力を読み取る。
  5. バッチファイルを削除する。

カレントディレクトリに対して書き込み権限がないと使えませんが、それさえクリアすれば、とりあえずこれで何とかなりそう。
上記の手順を反映したソースが以下。

上記を実行した結果の画面が以下。



以降は上記のソースに辿り着くまでに試したサンプルです。

スペースを含まないPathなら問題なく動作する。


スペースを含むPathだと意図した結果にならない。


バッチファイルのPathの先頭に「./」がついているとcmdがエラーになっちゃう。
(しかしバッチファイル出力時に上書きを防ぐためにfileExistsにpathを渡す時は「./」が無いとエラーになっちゃう)


以下のサンプルで、バッチファイル経由でのdir実行が可能なことが確認できた。
あとはバッチファイル出力時に既存のファイルを上書きしないようにPathを調整する機能を加えて、冒頭の完成サンプルとした。



以降は、バッチファイルを使わずにDeno.runに渡すパラメータを工夫して回避する、というのをechoで試してみた結果です。
結論から言うと、その方法では無理そうでした。

基本形
スペースを含まない文字なら問題ない。


以下は色々試したけど全部だめだった。





















ちなみに、スペースを含む文字列をコマンドに渡す際、ダブルクォーテーション以外の物で囲ってみたりスペースをエスケープできないかと色々試してみましたが、ダメでした。仕様的にもそうなっている筈なので、当然ですが…。

0 件のコメント:

コメントを投稿