バッチファイルから起動すると動かないのに、ダブルクリックなら動く理由
Why a program doesn't work when run from a batch file, but works when clicked
Explorerでファイルをダブルクリックすると、Explorerはそのファイルがあるディレクトリをカレントディレクトリに設定する。バッチファイルがフルパスでプログラムを起動してもカレントディレクトリは変わらないため、カレントディレクトリ基準で付随ファイルを探すプログラムはエラーになる。pushdとpopdでディレクトリを切り替えれば解決する。
Explorerでファイルをダブルクリックすると、Explorerはダブルクリックした対象を含むディレクトリをそのプログラムのカレントディレクトリに設定する。
HNでの議論
41- netsharc
DOS/Windowsのコマンドプロンプト(PowerShellのことは聞かないでください)では、ドライブレターごとに独自の「カレントディレクトリ」を持てるという便利な機能があります。
たとえば、ffmpeg.exeがC:\Program Files\FFMpeg\binにあり、D:\SourceVideosにソースファイルがあり、それをffmpegで処理してE:\Outputに出力したいとします。その場合、次のようにできます:
C: (C:ドライブに移動)
cd "C:\Program Files\FFMpeg\bin"
E: (E:\ドライブに移動)
cd D:\SourceVideos (E:\に留まったまま、D:の「カレントディレクトリ」が変更されます)
cd Output (E:\Outputに入る)
これで、C:ffmpeg.exe -i D:scene1.mp4 output-scene1.mp4 を実行でき、Windowsは各ドライブレターの「カレント」ディレクトリにあるファイルにアクセスします。
- xg15
> エクスプローラーは、ダブルクリックしたものがあるディレクトリをプログラムのカレントディレクトリに設定する
リンク先の記事は参考になり、自分の疑念を裏付けてくれました:「クリックしたもの」は実行ファイルである必要はなく、実行ファイルが起動ハンドラとして登録されているドキュメントである場合もあり、その場合カレントディレクトリはそのドキュメントのディレクトリになります。
シェル名前空間内のリンクやアイテムがどう扱われるかも知りたいところです。
- tveita
これらの顧客は、バッチファイルのデバッグのためにRaymond Chenを一次サポートに置くのに、サポート料としていくら払っているんだ?
- PaulHoule
まあ、explorer.exeのUIにはCMD.EXEやBashのような「カレントディレクトリ」という概念はありません。複数のディレクトリを開くことができ、どれも他より優先されることはありません。
コマンドラインプログラムの文化について考えると、nodeエコシステムではプログラムが特定のディレクトリに「住んで」いて、常にそのディレクトリでそのプログラムを扱うという考え方が非常に強いです。これは多くの面で便利ですが…たとえば、データ分析プログラムを書いていて、それを$PATHに置き、データがある場所にcdしてそこで作業したいとしますよね?
- lordnacho
関連する問題として、自動化を設定したときに、自動化スクリプトがスクリプトをテストしたユーザーとは異なる権限を持つ別のユーザーとして実行されることが判明する場合があります。これは「自分のマシンでは動く」から「動く」に移行しようとするときに現れる、ちょっとした煩わしさの一つにすぎません。