💡

NodeのSingle executable applicationsをWindowsでやる

2024/09/23に公開

はじめに

はじめまして。Never3924です。
Single executable applicationsをWindowsでやる時にすこしつまづいたのでメモとして残しておきます

今回の記事ですが、Windows以外とかでこれができる人は断然こっちのほうがいいです。
https://zenn.dev/haru141/articles/8d16362c386e69
これをWindowsでできるようにしたよ、ってだけなので。

要件

Windowsであること
動作確認: 10のみ、11未確認です

本編

では、始めます。
まず、コマンドプロンプトを起動してください。
次にファイルがある改装まで移動してください。
そしたら上記のURLにある「中間ファイルを作成」まで行ってください。
そこでもしエラーが出ましたら、文字コードとかを疑ってみてください。
次のコマンドですが、以下のように変更してください。手間が少し増えます。

cp $(command -v node) hello

から

for /f "delims=" %i in ('where node') do copy "%i" hello

に変更してください。そうしたらあとは道なりに進んだら完了です。

なぜこうなったのか (解説)

cp $(command -v node) hello

から

for /f "delims=" %i in ('where node') do copy "%i" hello

になった理由ですが、まずWindowsではcpコマンドは未対応です。そうすると

copy "$(command -v node) hello"

とできます。次にcommandもないので同じ働きをするwhereに変えます。

copy "$(where node)" hello

となりますが、コマンドプロンプトでは$()で展開できません。
そこでforが登場します。
for /f "delims=" %i in ('where node')とやると実行結果が変数%iに格納されます。気味悪いですね。

これはどういう仕組みなのかと言うと、まずfor /fはコマンドの出力を行ごとに処理するため('where node')が実行され、for /f "delims=" %i in ('C:\dummyPath')となります。
次に"delims="、つまりパスが区切られないまま変数%iに格納されます。

そうしたらコマンドの出力は1行しかないので、1回しか実行されません。
なのでコマンドの実行結果がそのままそっくり%iに入り、copy "%i" helloに実行結果が代入されてくれるってわけですね。

最後に

ふぅ、実行よりも解説のほうが長かった気がします...w
Qiitaがメンテナンスでかけなかったので初めてZennでやってみました。

ちなみにcp "$(command -v node)" helloのWindows変換はAIにやってもらいました。
解説もAIです
私は何をしたのかって言うと特にしてないですね...

ではまた。

Discussion