چرا برنامه با کلیک ماوس اجرا می شود اما در بچ فایل خطا می دهد؟ — Why a program doesn't work when run from a batch file, but works when clicked
خلاصه
بررسی یکی از نکات قدیمی سیستم عامل ویندوز توسط Raymond Chen که نشان می دهد چرا تفاوت در تعیین Current Directory هنگام اجرای یک برنامه از طریق Explorer یا Batch File باعث بروز خطای عدم دسترسی به فایل های جانبی می شود. این موضوع برای توسعه دهندگان ویندوز که با مسیردهی های نسبی سر و کار دارند اهمیت بالایی دارد.
مقدمه و زمینه فنی
برای بسیاری از توسعهدهندگان ویندوز پیش آمده است که برنامهای با دابلکلیک ساده روی آیکن آن به درستی کار میکند، اما وقتی همان برنامه را درون یک Batch File (فایل bat.) صدا میزنند، با خطای عجیب و غریبی مواجه میشوند. این مسئله بار دیگر توسط Raymond Chen، یکی از مهندسان ارشد مایکروسافت، در وبلاگ معروف Old New Thing بررسی شده است.
ریشه مشکل: تفاوت در Current Directory
دلیل اصلی این رفتار به نحوه مدیریت پوشه جاری یا همان Current Directory توسط سیستمعامل مربوط میشود:
- اجرا از طریق Explorer: وقتی کاربر روی یک فایل اجرایی یا حتی یک سند مرتبط (Document) در Windows Explorer دابلکلیک میکند، Explorer به طور خودکار پوشه جاری را روی دایرکتوری حاوی همان فایل تنظیم میکند. این کار برای برنامههایی طراحی شده است که به دنبال فایلهای جانبی (Ancillary Files) در کنار خود میگردند.
- اجرا از طریق Batch File: بر خلاف حالت قبل، اگر برنامهای را با مسیر کامل (Full Path) از درون یک اسکریپت دستوری اجرا کنید، دایرکتوری جاری همان پوشهای خواهد ماند که بچ فایل در آن قرار دارد (یا پوشهای که ترمینال از آنجا فراخوانی شده است)، نه لزوماً پوشه محل نصب برنامه.
اگر برنامهای فرض را بر این بگذارد که فایلهای پیکربندی، دیکناریها یا منابع خود را باید از دایرکتوری جاری بخواند، در صورت اجرا از طریق بچ فایل دچار مشکل میشود.
راه حل
راهحل این مشکل بسیار ساده است. توسعهدهنده باید پیش از اجرای برنامه، دایرکتوری جاری را به محل فایل اجرایی تغییر دهد. در بچ فایلها، استفاده از دستورات pushd برای رفتن به پوشه مورد نظر و سپس popd برای بازگرداندن مسیر اولیه پس از اتمام کار، استانداردترین روش است.
نکات تکمیلی و بحث Hacker News
در بخش نظرات Hacker News، کاربران به نکات جالبی اشاره کردند:
- کاربران تاکید کردند که این رفتار تنها محدود به فایلهای
.exeنیست؛ اگر روی یک فایل مستند (Document) دابلکلیک کنید که با یک نرمافزار خاص باز میشود، دایرکتوری جاری باز هم پوشه حاوی همان سند خواهد بود نه پوشه نصب نرمافزار. - برخی کاربران نیز به طنز از حضور مستقیم Raymond Chen برای حل چنین مسائل پیشپاافتادهای در سطح پشتیبانی ابراز تعجب کردند.
همچنین به عنوان یک سناریوی جایگزین، اگر برنامه نیاز به مسیرهای خاصی در متغیر محیطی PATH داشته باشد، میتوان از کلید رجیستری App Paths استفاده کرد تا سیستمعامل بهطور خودکار مسیرهای اضافی را هنگام اجرا اعمال کند.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل