バッチファイルから実行するとプログラムが動作しないが、ダブルクリックでは正常に動作する理由

2026/10/27 6:14

バッチファイルから実行するとプログラムが動作しないが、ダブルクリックでは正常に動作する理由

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

顧客は 2026 年 10 月 26 日に、エクスプローラーからダブルクリックしてプログラムが正常に起動するものの、バッチファイル経由で呼び出された場合は失敗するという問題を報告した。根本原因は Windows のデフォルト動作によるものである:エクスプローラーから実行可能ファイルを起動すると、現在のディレクトリがそのファイルの所在地に設定されるが、バッチファイルからはそうならないため、プログラムが当該ディレクトリ相対の補助ファイル(例:ABC.LTC)を期待している場合、スクリプト文脈下での検索が失敗する。即応の対策は、バッチファイル内で

pushd
および
popd
を使用して明示的に作業ディレクトリを変更することである。レイモンドによって提起された二次的な可能性として、App Paths 下のカスタムエントリを検証し、PATH 環境変数が改変されていないか確認することを挙げている。この問題は、相対ファイルパスまたは特定の実行文脈に依存する自動化をバッチスクリプトで行うユーザーや開発者に影響を与える。著者のレイモンドは Windows の進化に関わって 30 年以上の経験を持ち、2003 年に「The Old New Thing」というウェブサイトを設立し、2007 年に Addison Wesley から関連書籍を上梓している。

本文

バッチファイル実行時のエラー解決:作業ディレクトリの重要性

問題の背景と症状

  • ご依頼内容: バッチファイルを作成してプログラムを実行してもらうようお願いされた際、正常に動作しなかった。
  • 現象の詳細
    • エラーメッセージが表示される。
    • エクスプローラーからのダブルクリックでの実行時は問題なしだが、バッチファイルでの実行では動作が異なる。

原因の特定と考察

  • 仮説: 現在のディレクトリ(作業ディレクトリ)が設定されていないため発生していると考えた。
  • 仕組みの解説
    • エクスプローラーから
      .exe
      をダブルクリックすると、そのファイルが存在するディレクトリが自動的に「現在のディレクトリ」になる。
    • 目的: プログラムが必要な補助ファイルを現在ディレクトリから検索できるようにするため。
    • 具体例: 「LitWare Writer」が
      ABC.LIT
      を受け付けた際、関連ファイル(
      ABC.LTC
      や
      ABC.LDC
      )も同様に現在ディレクトリから探さなければならないケースがある。
  • 結論: お客様のプログラムも補助ファイルを現在ディレクトリを基準に検索していると推測され、バッチファイル実行時に作業ディレクトリを変更していなかったため失敗していたと判断した。

解決策の実施

  • 方法: プログラムのフルパスを実行するだけでなく、
    pushd
    コマンド
    を用いて実行前にディレクトリを変更した。
  • 確認結果: ディレクトリ変更後の実行では正常に動作することを確認できた。
  • 復元手順: 元のディレクトリに戻るには
    popd
    を使用すればよい(
    pushd
    と対応するコマンド)。

関連する考察(余談)

  • 検証した仮説: 「App Paths」でカスタムエントリーを設定し、プログラム実行時に「PATH」環境変数に追加すべきディレクトリを指定していないかという点も検討したが、今回のケースでは作業ディレクトリの問題が主因だった。

カテゴリとトピック

  • カテゴリ
  • トピック
  • 執筆者

執筆者について

レイモンドは Windows の進化に伴う活動に 30 年以上携わってきました。2003 年に「The Old New Thing」というウェブサイトを立ち上げ、当初予想を遥かに上回る人気を集めました。これは彼にとってなお恐怖の種となっています。同サイトは偶然にも同じタイトル(Addison Wesley、2007 年)で書籍化されました。彼は時折、Windows Dev Docs の Twitter アカウントに登場し、有益な情報をもたらさない話を語っています。

次へ読む

  • 次の記事

最新情報を入手

  • 新しい投稿を公開された際に通知を受け取るには こちら をクリックしてください。
  • このブログをフォローする

同じ日のほかのニュース

一覧に戻る →

2026/10/31 2:25

僕の一番好きなPower Macは、ニンテンドーWiiだ

## Japanese Translation: Rairii のゲスト投稿では、ArtX ベースの PowerPC システム(特にニンテンドーコンソールであるゲームキューブ、Wii、Wii U)への古典的な Mac OS バージョン 7.6 と 9.2.2 の成功したポート作業について詳述されている。同プロジェクトは 2025 年 6 月 22 日に開始され、AI の助力なしに完全に手動作業によるコーディング、リバースエンジニアリング、デバッグを通じて完了している。大きな突破点は、FAT ファイルシステムを備えた OpenBIOS を改修して Mac OS イメージをロードできるようにしたことであり、開発者は NT ARC ファームウェアローダーなどの既存のツールの再利用を行ったが、ドライバーは大幅に修正した:Elliott Nunn の virtio ベースのディスプレイドライバーの再利用、"SD Gecko"(SPI アダプター)および"EXI-IDE"(SPI エミュレーション)ディスクドライバーの実装、物理アドレス空間の前提条件と MMIO マッピングのエラーを修正する「Trampoline」へのパッチ適用などである。重要なカーネルパッチはマイクロコントローラー用のビットフラグの修正、Flipper および PCI アーキテクチャ間の中断コントローラの不整合への対処、レガシーモードの問題の解消といったハードウェア固有の課題に対応している。具体的なレガシーバグも修正された例として、「SuperMario」m68k 環境におけるシリアルポートコード内の無限ループがある。現在、SD を通じて SPI で実機上で Mac OS 7.6 は 40 秒以内に正常に起動するが、Mac OS 9.2.2 については不安定な Open Transport コンポーネントを除去しクラッシュを防ぐためにさらなる作業が必要である。

2026/10/30 16:09

Cursor マーケットの VS コード拡張機能「Claude Code」に後門が存在する

## Japanese Translation: 公式 Cursor マーケットPLACE で配布されている公式 Claude Code 拡張機能(バージョン 2.1.313)に重大な裏門(バックドア)が発見された。攻撃者は Windows、Linux、macOS のいずれの環境でもユーザーのマシンに対して永続的なアクセス権を取得できる。ベンダーが管理する配布チャネルに関する標準的な仮説とは異なり、この悪意のあるアップデートは SSH キーを埋め込み、逆回線トンネルを確立することで、インストール時に直接ユーザーの関与を必要とせずにもれなくシェルへの完全なアクセス権限を取得する。この脅威は macOS のセットアップスクリプトに含まれる特定の脆弱性を利用し、セキュリティチェックを迂回すると同時に、機微なシステムデータを攻撃者管理のサーバーにビーコン送信している。Cursor は以来、その登録から該当の侵害されたリリースを削除した。バージョン 2.1.313 を使用している組織は、直ちに環境を検査し、拡張機能をアンインストールし、埋め込まれた認証情報や実行中のトンネルプロセスを能動的に探してセキュリティを回復する必要がある。この事件は、堅牢なサプライチェーン監査の緊急性を示しており、正規の開発ツールが企業ネットワーク内におけるデータ窃取および lateral movement(横方向移動)の予期せぬベクトルとして機能し、ベンダー配布ソフトウェアへの信頼を損なう可能性があることを強調している。

2026/10/31 6:30

sanstun:Rust で実装された、sans-IO を採用した並列性に優れた WireGuard 実装

## Japanese Translation: Sanstun は、非推奨の `firezone/boringtun` フォークを代替する、WireGuard 状態機械の最適化された Rust 実装(IO なし)をリリースしました。この新しい設計は、並列処理に適した慣用 API を使用して I/O および副作用(時間と乱数を含む)をコアビジネスロジックから分離することで、使いやすさ、セキュリティ向上、パフォーマンスを優先しています。主な利点には、プロトコル不変性をマッピングする型を通じたコンパイル時安全性、`Instant` オブジェクトによる時間処理を通じた正確なシステムシミュレーション、Diffie-Hellman 鍵交換およびクッキー管理を通じた DoS 攻撃に対する内蔵防御が含まれます。API は明示的に記録業務(例:カプセル化の開始)と重い暗号化/復号化を分離することで同期ボトルネックを回避し、暗号処理をワーカースレッドにオフロードした場合のベンチマークでは 45 倍以上のスピードアップの可能性を示しています。ユーザーは現在、パケットを手動でバッファリングする必要があり、`Tunnel::initiate_handshake` を通じてハンドシェイクを開始する必要がありますが、この設計はプライベートハンドシェイクコンスストラクタ(`Interface::receive` のみアクセス可能)を介してコンパイル時にレート制限および正しいトンネルルートを強制します。このアプローチにより、以前のフォークで問題となった直感的ではないドレインや設定できないバッファサイズのなどの内部バッファリング問題は解消されます。Sanstun パターンは Rust に限定されず、様々なプログラミング言語での実装にも有益である可能性があります。Apache 2.0 ライセンスの下で crates.io で利用可能であり、非推奨の `firezone/boringtun` フォークから移行する過程で GitHub の issue および PR を通じて貢献を招集しています。

バッチファイルから実行するとプログラムが動作しないが、ダブルクリックでは正常に動作する理由 | そっか~ニュース