راه حل دوم: کاربران هميشه تنبل اند!!!!
همانطور که ملاحظه کرديد شايد ملال آور ترين نکته در استفاده از روش مرحله قبل ،ويرايش فايل Main.bat بود.در واقع اگر تعداد عکسها 5 تا نبود (چه بيشتر و چه کمتر) نياز به ويرايش اين فايل وجود داشت که اين موضوع با توجه به اين نکته که کاربران هيچ گاه تمايل به محدود شدن ندارند،هدف بعدي را براي من به اين شکل ترسيم کرد: «برنامه اي مانند مرحله قبل اما اين بار بدون نياز به ويرايش،براي هر تعداد عکس».
برای اجرای این راه حل ،مراحل زیر را انجام دهید:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.
3) فايل MyCW.bat را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند و از فرمت Bitmap باشد،را انتخاب کنيد و در پوشه عمليات کپي کنيد.اگر عکس Bitmap نداريد،مي توانيد توسط Paintويندوز،عکسهاي فرمت هاي ديگر را باز کرده و به به نوع Bitmap ذخيره (Save as) کنيد.در ضمن هيچ تفاوتي بين انواع Bitmap (دو رنگ،هشت رنگ يا ...) نمي باشد.
5) عکس هاي مرحله قبل (Bitmap هاي کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم).به شکل «WP*.bmp» نامگذاري کنيد که در آن به جای ستاره،یک عبارت قرار دهید (مهم نیست چه عبارتی،فقط طوری باشد که فرمت مورد نظر حفظ شود).مثلا:
WP1.bmp , WPaa.bmp , WP3.bmp , WP1250.bmp , ....
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد البته اين تغيير،به همان ترتيبي که هنگام نامگذاري عکسها رعايت کرده بوده ايد،خواهد بود.برای اینکه بدانید کدام عکس به عنوان WallPaper بعدی خواهد بود،کافیست به پوشه عملیات رفته و به دنبال فایلی با نام آغازین «cur» باشید.
فایل MyCW.bat از پنج بخش تشکیل شده است:
بخش اول: برای معرفی متغیر ها است (اگر متغیر ها قبلا در سیستم معرفی شده اند،آنها را به مقدار پیش فرض یعنی مقدار تهی تنظیم می کند):
SET _FWP_FIRST=""
SET _FWP_CUR=""
SET _FWP_NEXT=""
این سه متغیر ها به ترتیب برای ذخیره نام اولین فایل در لیست فایلها،نام فایل جاری که استفاده شده است و نام فایلی که باید برای مرحله بعد به عنوان WallPaper قرار گیرد،می باشد.
بخش دوم : در این بخش تمام فایلها با فرمت «WP*.bmp» مرتب شده و در فایل Dir.txt ذخیره می شود.سپس تمام آنها برای انجام محاسبات به بخش پنجم ارسال می شود و در نهایت فایل Dir.txt حذف می شود (این فایل به مانند یک بافر برای نگهداری نام فایلها استفاده می شود).در بخش پنجم متغیر های بالا مقدار دهی می شوند.
dir WP*.bmp /b | SORT > Dir.txt
FOR /F %%i in (Dir.txt) do call :Section2 %%i
del Dir.txt
بخش سوم: با توجه به مقادیر تنظیم شده،اگر لازم باشد (به آخر فهرست رسیده باشم و یا هنوز WallPaper ای تنظیم نشده باشد)،مقادیر مناسب برای متغیر «_FWP_NEXT» تنظیم می شود:
if %_FWP_CUR=="" (
SET _FWP_NEXT=%_FWP_FIRST%
) ELSE (
if %_FWP_NEXT%=="" SET _FWP_NEXT=%_FWP_FIRST%
del cur_%_FWP_CUR% > nul
)
بخش چهارم: در این بخش عملیات تخصیص WallPaper انجام می شود (فایل بعدی در مسیر WallPaper کپی شود و یک کپی نیز از همین فایل با پیش وند cur ایجاد می شود) و عملیات پایان یافته است.
copy %_FWP_NEXT% cur_%_FWP_NEXT% > nul
copy %_FWP_NEXT% "%USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp" > nul
goto :EOF
بخش پنجم: با توجه به مقادیر نام فایل ورودی،اگر فایل با نام فایل ورودی و پیشوند cur وجود داشته باشد،یعنی این فایل به عنوان فایل جاری(_FWP_CUR) است.بعد از یافتن فایل جاری،اولین فایل،فایل بعدی(_FWP_NEXT) است و همواره اولین فایل درخواستی به عنوان فایل اول(_FWP_FIRST) ذخیره می شود.
:Section2
IF EXIST cur_%1 (
SET _FWP_CUR=%1
) ELSE (
if NOT %_FWP_CUR%=="" (IF %_FWP_NEXT%=="" SET _FWP_NEXT=%1)
if %_FWP_FIRST%=="" SET _FWP_FIRST=%1
)
goto :EOF
نکته : در خطوط بالا،دستور goto :EOF به معنی پایان برنامه است.
این روش،نسبت به روش پست قبل،دارای یک مزیت است و آن اینکه برای ایجاد فهرست بیشتر فایل نیازی به تغییر در فایل MyCW.bat نبوده و کافیست فایل خود را در پوشه عملیات کپی و نامی با فرمت «WP*.bmp» به آن اختصاص دهید.
البته این روش همجنان فایل ها را به ترتیب (یا اصطلاحا از یک کنار) نمایش داده و بعد از رسیدن به آخر لیست،دوباره به اول فهرست بر می گردد.
سئوال 1: این علامت بزرگتر که که در خط:
dir WP*.bmp /b | SORT > Dir.txt
گذاشتید یعنی چی؟
جواب: این علامت یک عملگر است و مسیر خروجی رو مشخص می کند.به این معنی که خروجی باید در کجا قرار گیرد.به شکل پیشفرض خروجی ما بر روی صفحه نمایش است ولی گاهی اوقات لازم داریم خروجی را به مسیر دیگری هدایت کنیم.مثلا به یک فایل (همچنین این خروجی می تواند چاپگر باشد یا یک اتصال شبکه و یا ...).در اینجا خروجی دستور
dir WP*.bmp /b | SORT
به جای نمایش بر روی صفحه به یک فایل به نام Dir.txt فرستاده می شود.به این منظور که بتوانیم خروجی دستور را در خطوط بعدی(منظور همان خط For است) مورد تحلیل قرار دهیم.توجه کنید که عملگر «<» باعث می شود که فایل Dir.txt اگر وجود ندارد، ساخته شود و اگر وجود دارد،رو نویسی شود (اطلاعات قبلی آن از بین می رود).عملگر های دیگری هم وجود دارد که یکی دیگر از آنها عملگر «<<» است.این عملگر مانند «<» عمل می کند با این تفاوت که اگر فایل خروجی موجود باشد،محتویات آن را نابود نکرده و محتویات جدید را به انتهای محتویات قبلی اضافه (Append) می کند.
سئوال 2: من دستور «?/ Dir» را توی CMD زدم و فهرست سوئیچ هاش را دیدم. هیچ جا سوئیچی «|» تعریف نشده بود؟!!!
جواب: نه دوست من این سوئیچ نیست،این هم یک عملگر است که به آن عملگر «PipeLine» یا «لوله» می گویند (با توجه به شکل ظاهری اش و کاری که انجام می دهد،کاملا این نام برازنده آن است).این عملگر در واقع خروجی یک دستور (دستور سمت چپ) را به یک دستور دیگر (سمت راست) می فرستد.در اینجا خروجی dir با سوئیچ هایش ،به دستور Sort ارسال می شود تا مرتب شده و به خروجی فرستاده شود.توجه کنید که تمام دستورات را می توان در سمت چپ (فرستنده به) لوله قرار داد ولی هر دستوری را نمی تواند در سمت راست (دریافت کننده از) لوله قرار گیرد و باید دستور مورد نظر، بتواند Pipe را پشتیبانی کند (من خودم نمی توانم چنین دستوری در ویندوز بنویسم ولی مقاله ای کامل به فارسی برای نوشتن چنین دستوراتی در لینوکس دیده ام).
سئوال 3: این عبارت «1%» چیست؟
جواب: در هر برنامه خط دستوری،شما می توانید پارامترهایی برای برنامه بفرستید که در واقع برنامه با این پارامتر ها رفتار مناسب را انجام دهد (باید پارامتر های هر برنامه را بشناسید در ضمن سوئیچ ها هم خود نوعی پارامتر هستند).مثلا اگر در خط دستور تایپ کنید «mspaint» برنامه Paint ویندوز اجرا خواهد شد.حالا اگر تایپ کنید «mspaint 1.bmp» برنامه Paint ویندوز به همراه فایل 1.bmp (البته اگر در مسیر فایل جاری موجود باشد) باز می شود و می توان فایل 1.bmp را ویرایش کنید (این همان اتفاقی است که هنگامی که روی 1.bmp راست کلیک می کنید و گزینه «Edit» را انتخاب می کنید،در پشت صحنه ویندوز می افتد و عکس مورد نظر شما تحت برنامه Paint آماده ویرایش می شود).در واقع اساس کار اجرا هر فایلی در برنامه های مختلف،همین خط دستور و پارامترهای آن است.البته ممکن است پارامترها سوئیچ هایی بوده که رفتار برنامه را تحت تاثیر قرار دهد.پس معقول است که ما بخواهیم Batch فایل های خود را نیز با پارامتر هایی اجرا کنیم.برای دسترسی به این پارامترها در Batch ها،باید از عبارت 1% تا 9% برای پارامترهای اول تا نهم استفاده شود.برای دسترسی به پارامتر دهم به بعد باید از دستور Shift استفاده کنیم (با هر بار اجرای این دستور پارامترها یکی به عقب شیفت پیدا می کنند یعنی مقدار قبلی پارامتر %1 نابود شده و مقدار %2 در آن جای می گیرد،مقدار %3 به %2 منتقل می شود و ... و پارامتر دهم به %9 منتقل خواهد شد).در ضمن هنگامی که روی یک Batch فایل (یا هر فایل اجرایی دیگر) DoubleClick می کنید،این فایل بدون پارامتر اجرا می شود.ملاک جدا سازی پارامترها کاراکتر فضای خالی (Space) می باشد.چنانچه یک پارامتر شما دارای کاراکتر فضای خالیست،حتما آن را در «""» قرار دهید تا به عنوان یک پارامتر شناخته شود.
سئوال 4:با توجه به جواب سئوال قبلی،پس اگر فایل MyCW.bat را با DoubleClick اجرا کنیم و یا در StartUp بگذاریم و خودش اجرا شود،بدون پارامتر اجرا می شود،پس این %1 درون دستورات به چه مقدار اشاره می کند؟!!! MyCW که پارامتر ندارد!!؟
جواب: در جواب باید به دو نکته اشاره شود.اول اینکه اگر برنامه ای بدون پارامتر اجرا شود،هر پارامتر با مقدار رشته خالی (یا همان "") تنظیم می شود و در نتیجه اگر شما از %1 یا هر پارامتر دیگری استفاده کنید،مثل این است که از "" استفاده کرده اید.اما نکته دوم به مکان استفاده از %1 بر می گردد.این پارامتر در بخش پنجم استفاده شده است و بخش پنجم با دستور زیر فراخوان می شود:
call :Section2 %%i
در واقع این دستور به مانند این است که ویندوز یک بار دیگر فایل MyCW.bat را اجرا می کند ولی به جای اینکه این فایل از ابتدا پردازش شود،مستقیم به برچسب Section2 می پرد و اجرا می شود.و البته در این فراخوان ما یک پارامتر داریم که همان %%i است که ارسال شده است.
سئوال 5:این خروجی nul چیست که برخی دستورات،خروجی خود را به آن می فرستند؟
جواب: خروجی nul در واقع خروجی تهی است.برای اینکه هیچ چیز بر روی صفحه نمایش،نشان داده نشود از عبارت «nul <» استفاده می شود.
سئوال 6: من تمام مراحل را همانطور که شما نوشته بودید انجام دادم فقط در مرحله 2 به جای نام ChangeWallpaper از نام «My Wallpaper» استفاده کردم،ولی برنامه درست کار نمی کند!با این حال همان نام ChangeWallpaper باعث اجرای درست برنامه می شود.چرا؟آیا برنامه به این نام (ChangeWallpaper) حساس است؟
جواب: خیر برنامه به نام ChangeWallpaper حساس نیست ولی یک نکته ظریف و کلیدی در نام گذاری شما موجود نیست.شما نمی توانید از نامی شامل کاراکتر فضای خالی (SPACE) استفاده کنید (این مشکل را در راه حل پنجم حل خواهیم کرد! برای پیدا کردن دلیل مشکل به پاسخ سئوال سوم نگاه کنید).به عبارت دیگر به جای استفاده از My Wallpaper بهتر است از MyWallpaper یا My_Wallpaper استفاده کنید.بطور کلی مواظب باشید که در سه مکان زیر فضای خالی در نام موجود نباشد:- نام پوشه عملیات
- نام پوشه های پدر پوشه عملیات (پس نمی توانید پوشه عملیات خود را در پوشه Program Files یا فرزندان آن قرار دهید)
-نام عکس ها