برنامه ای بنویس برای ویندوز سرور که فولدرهای داخل یک فولدر را در ساعت 2 بامداد زیپ کرده و در فولدر جداگاه ذخیره کند
برای نوشتن یک برنامه که فولدرهای داخل یک فولدر مشخص را در ساعت 2 بامداد زیپ کرده و در فولدر جداگانهای ذخیره کند، میتوانید از اسکریپت PowerShell استفاده کنید. در اینجا یک نمونه اسکریپت را برای این کار ارائه میدهم:
# مسیر فولدری که میخواهید فولدرهای داخلش را زیپ کنید $sourceFolder = "C:\مسیر\به\فولدر\منبع" # مسیر فولدری که میخواهید فایلهای زیپ شده در آن ذخیره شوند $destinationFolder = "C:\مسیر\به\فولدر\مقصد" # گرفتن لیستی از فولدرهای داخل فولدر منبع $directories = Get-ChildItem -Path $sourceFolder -Directory foreach ($dir in $directories) { # تعیین نام فایل زیپ بر اساس نام فولدر و تاریخ فعلی $zipFileName = $dir.Name + "_" + (Get-Date -Format "yyyyMMdd") + ".zip" $zipFilePath = Join-Path $destinationFolder $zipFileName # ایجاد فایل زیپ Compress-Archive -Path $dir.FullName -DestinationPath $zipFilePath } # نمایش پیغام که اسکریپت کار خود را انجام داده است Write-Host "فولدرها با موفقیت زیپ شدند."
برای اجرای این اسکریپت به صورت خودکار در ساعت 2 بامداد، میتوانید از Task Scheduler ویندوز استفاده کنید. در اینجا مراحل ایجاد یک Task جدید در Task Scheduler را شرح میدهم:
Task Scheduler را باز کنید.
در منوی سمت راست، بر روی "Create Basic Task..." کلیک کنید.
یک نام و توضیح برای Task جدید وارد کنید.
در صفحه "Trigger"، "Daily" را انتخاب کنید و Next را فشار دهید.
تاریخ شروع و ساعت 2:00 AM را تنظیم کنید و Next را فشار دهید.
در صفحه "Action"، "Start a program" را انتخاب کنید.
در قسمت "Program/script"، مسیر اجرایی PowerShell را وارد کنید که معمولاً C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe است.
در قسمت "Add arguments (optional)"، -File "مسیر\به\اسکریپت.ps1" را وارد کنید.
تنظیمات را بررسی کنید و Task را ذخیره کنید.
اکنون، اسکریپت PowerShell شما هر روز در ساعت 2 بامداد اجرا خواهد شد و فولدرهای مورد نظر را زیپ میکند.
می خواهم به صورت خودکار هر هفته جمعه ساعت 2 بامداد این کار تکرار شود
برای اجرای این اسکریپت به صورت خودکار هر هفته در روز جمعه ساعت 2 بامداد، باید Task Scheduler ویندوز را تنظیم کنید. در اینجا به شما نشان میدهم که چگونه این کار را انجام دهید:
Task Scheduler را باز کنید.
در منوی سمت راست، بر روی "Create Task..." کلیک کنید (به جای "Create Basic Task...").
در تب "General"، یک نام و اختیاراً توضیح برای Task جدید وارد کنید.
به تب "Triggers" بروید و بر روی "New..." کلیک کنید.
در پنجره جدید، "Weekly" را انتخاب کنید.
در قسمت "Start"، تاریخ و زمان شروع را تنظیم کنید به طوری که ساعت 2:00 AM باشد.
در قسمت "Recur every"، عدد 1 را وارد کنید تا هر هفته تکرار شود.
در قسمت "Weekly"، تیک روز جمعه را بزنید.
بر روی OK کلیک کنید تا Trigger را ذخیره کنید.
به تب "Actions" بروید و بر روی "New..." کلیک کنید.
در قسمت "Action"، "Start a program" را انتخاب کنید.
در قسمت "Program/script"، مسیر اجرایی PowerShell را وارد کنید که معمولاً C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe است.
در قسمت "Add arguments (optional)"، -ExecutionPolicy Bypass -File "مسیر\به\اسکریپت.ps1" را وارد کنید.
در قسمت "Start in (optional)" میتوانید مسیر پوشهای که اسکریپت در آن قرار دارد را وارد کنید (بدون نقل قولها).
بر روی "OK" کلیک کنید تا Action را ذخیره کنید.
به تب "Conditions" و "Settings" بروید و تنظیمات دلخواه خود را اعمال کنید.
بر روی OK کلیک کنید تا Task جدید را ذخیره کنید.
اکنون، Task Scheduler شما تنظیم شده است تا اسکریپت PowerShell را هر هفته در روز جمعه ساعت 2 بامداد اجرا کند.
تعدا فولدر های قابل زیپ زیاد است
اگر تعداد فولدرهایی که میخواهید زیپ کنید زیاد است، اسکریپت باید به گونهای باشد که بتواند به صورت خودکار تمامی فولدرها را پردازش کند. اسکریپت PowerShell زیر تمامی فولدرهای موجود در مسیر مشخص شده را زیپ خواهد کرد و هیچ محدودیتی برای تعداد فولدرها وجود ندارد:
# مسیر فولدری که میخواهید فولدرهای داخلش را زیپ کنید $sourceFolder = "C:\مسیر\به\فولدر\منبع" # مسیر فولدری که میخواهید فایلهای زیپ شده در آن ذخیره شوند $destinationFolder = "C:\مسیر\به\فولدر\مقصد" # گرفتن لیستی از فولدرهای داخل فولدر منبع $directories = Get-ChildItem -Path $sourceFolder -Directory foreach ($dir in $directories) { # تعیین نام فایل زیپ بر اساس نام فولدر و تاریخ فعلی $zipFileName = $dir.Name + "_" + (Get-Date -Format "yyyyMMdd") + ".zip" $zipFilePath = Join-Path $destinationFolder $zipFileName # ایجاد فایل زیپ Compress-Archive -Path $dir.FullName -DestinationPath $zipFilePath } # نمایش پیغام که اسکریپت کار خود را انجام داده است Write-Host "فولدرها با موفقیت زیپ شدند."
این اسکریپت محدودیتی در تعداد فولدرها ندارد و تمامی فولدرهای موجود در مسیر $sourceFolder را زیپ خواهد کرد. جهت اجرای این اسکریپت در ساعت 2 بامداد هر جمعه، مراحل تنظیم Task Scheduler که در پاسخ قبلی بیان شده است را دنبال کنید.
اگر فولدرهای زیادی دارید و نگران این هستید که این عملیات زمان زیادی ببرد یا منابع سیستم را به شکل نامطلوبی استفاده کند، میتوانید از اسکریپت برای محدود کردن تعداد فولدرهایی که در هر دوره زیپ میشوند استفاده کنید یا اسکریپت را به گونهای تنظیم کنید که فولدرها را در چندین دوره مختلف زیپ کند. همچنین میتوانید با استفاده از پارامتر -Background در دستور Start-Job فرآیند زیپ کردن را به صورت پسزمینه اجرا کنید تا بر روی کاربرد عادی سرور تأثیر کمتری داشته باشد.
بیشتر
اگر تعداد فولدرها بسیار زیاد است و نیاز به مدیریت بهینه منابع دارید، میتوانید از تکنیکهای مختلفی استفاده کنید تا اطمینان حاصل کنید که فرآیند زیپ کردن بار زیادی بر روی سیستم ایجاد نمیکند.
یکی از روشها برای مدیریت بهینه فرآیند، اجرای اسکریپت به صورت پسزمینه و تقسیم کار به چند بخش است. برای مثال، میتوانید اسکریپت را طوری تنظیم کنید که تعداد مشخصی از فولدرها را در هر دوره زیپ کند و سپس به مدت مشخصی استراحت کند تا سیستم فرصت بازیابی داشته باشد. همچنین میتوانید از مکانیزمهای نظارتی برای اطمینان از اینکه فرآیند به درستی کار میکند استفاده کنید.
در اینجا یک نمونه اسکریپت PowerShell با این قابلیتها را ارائه میدهم:
# تنظیم مسیر فولدر مبدا و مقصد $sourceFolder = "C:\مسیر\به\فولدر\منبع" $destinationFolder = "C:\مسیر\به\فولدر\مقصد" # تعیین تعداد فولدرها برای هر بخش $batchSize = 10 # گرفتن لیست فولدرها $directories = Get-ChildItem -Path $sourceFolder -Directory # شمارشگر برای تعیین تعداد فولدرهای پردازش شده $counter = 0 foreach ($dir in $directories) { # ایجاد نام فایل زیپ $zipFileName = $dir.Name + "_" + (Get-Date -Format "yyyyMMddHHmmss") + ".zip" $zipFilePath = Join-Path $destinationFolder $zipFileName # زیپ کردن فولدر Compress-Archive -Path $dir.FullName -DestinationPath $zipFilePath # افزایش شمارشگر $counter++ # بررسی اگر شمارشگر به اندازه تعداد بخش رسیده باشد if ($counter -ge $batchSize) { # استراحت برای مدت معین Start-Sleep -Seconds 60 # استراحت برای 60 ثانیه $counter = 0 # بازنشانی شمارشگر } } Write-Host "تمام فولدرها با موفقیت زیپ شدند."
این اسکریپت هر $batchSize (در این مثال 10) فولدر را زیپ میکند و سپس برای 60 ثانیه استراحت میکند قبل از اینکه به پردازش بقیه فولدرها ادامه دهد. این امر کمک میکند تا فشار کمتری به سرور وارد شود و از احتمال بروز مشکلات ناشی از استفاده بیش از حد از منابع جلوگیری کند.
برای اجرای اسکریپت در ساعت 2 بامداد هر جمعه، میتوانید از Task Scheduler استفاده کنید و مراحلی که در پاسخهای قبلی توضیح داده شده را دنبال کنید.
این کد را چگونه ثبت کنم و در چه مسیری قرار دهم
برای استفاده از کد PowerShell که در بالا ارائه شد، شما باید آن را در یک فایل با پسوند .ps1 ذخیره کنید و آن فایل را در مسیری قرار دهید که به آن دسترسی داشته باشید و بتوانید از طریق Task Scheduler به آن مراجعه کنید. در زیر مراحل کلی برای ایجاد و ذخیره اسکریپت را شرح میدهم:
کد PowerShell را که میخواهید اجرا کنید، کپی کنید.
برنامه Notepad را باز کنید (یا هر ویرایشگر متن دیگری که ترجیح میدهید).
کد را در Notepad بچسبانید.
فایل را با انتخاب گزینه File > Save As... ذخیره کنید.
در پنجره ذخیره، به مسیری بروید که میخواهید اسکریپت را در آن قرار دهید. این میتواند هر مسیری باشد که به آن دسترسی دارید، برای مثال C:\Scripts.
در قسمت File name: یک نام برای فایل انتخاب کنید و پسوند آن را .ps1 قرار دهید، مانند CompressFolders.ps1.
از کشوی Save as type: گزینه All Files (*.*) را انتخاب کنید.
بر روی دکمه Save کلیک کنید تا فایل ذخیره شود.
پس از ذخیره اسکریپت، میتوانید آن را از طریق Task Scheduler تنظیم کنید تا به صورت خودکار اجرا شود. مراحل اضافه کردن اسکریپت به Task Scheduler به شرح زیر است:
بر روی منوی Start کلیک کرده و Task Scheduler را جستجو کنید.
Task Scheduler را باز کنید.
در منوی سمت راست، بر روی Create Task... کلیک کنید.
تب General را پر کنید و نام و توضیحاتی برای Task جدید وارد کنید.
به تب Triggers بروید و بر روی New... کلیک کنید. سپس تریگر را برای اجرا در ساعت 2 بامداد هر جمعه تنظیم کنید.
به تب Actions بروید و بر روی New... کلیک کنید. در قسمت Program/script: مسیر کامل PowerShell را وارد کنید (C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe) و در قسمت Add arguments (optional): پارامترهای -ExecutionPolicy Bypass -File "C:\Scripts\CompressFolders.ps1" را وارد کنید (مطمئن شوید که مسیر فایل .ps1 را به درستی وارد کردهاید).
تنظیمات را در تبهای Conditions و Settings بررسی و سفارشی کنید.
بر روی OK کلیک کنید تا Task ذخیره شود.
اکنون اسکریپت شما برای اجرا در زمان مشخص شده تنظیم شده است.
این قسمت رو بیشتر توضیح بده Add arguments (optional):
وقتی در Task Scheduler یک Task جدید ایجاد میکنید و به بخش Actions میروید، یکی از گزینههایی که باید پر کنید Add arguments (optional) است. این بخش برای وارد کردن پارامترهایی است که قرار است به برنامه یا اسکریپتی که میخواهید اجرا کنید، ارسال شوند.
در مورد اجرای اسکریپتهای PowerShell از طریق Task Scheduler، پارامترهایی که معمولاً استفاده میشوند عبارتند از:
-ExecutionPolicy Bypass: این پارامتر به PowerShell میگوید که سیاستهای اجرایی را نادیده بگیرد، که معمولاً برای اجازه دادن به اجرای اسکریپتهایی که به صورت محلی ذخیره شدهاند، لازم است.
-File "مسیر\به\اسکریپت.ps1": این پارامتر به PowerShell مسیر کامل فایل اسکریپت .ps1 را که میخواهید اجرا شود، میگوید.
بنابراین، در بخش Add arguments (optional)، شما باید این پارامترها را به همراه مسیر دقیق فایل اسکریپت PowerShell وارد کنید. مثال زیر نشان میدهد چگونه باید این پارامترها را وارد کنید:
-ExecutionPolicy Bypass -File "C:\Scripts\CompressFolders.ps1"
در این مثال:
C:\Scripts\CompressFolders.ps1 باید با مسیر دقیقی که فایل اسکریپت شما در آن قرار دارد، جایگزین شود.
اطمینان حاصل کنید که مسیر به اسکریپت در داخل نقل قولها ("") قرار دارد، به خصوص اگر مسیر شامل فضای خالی باشد.
پس از وارد کردن پارامترها در این بخش، Task Scheduler هنگام اجرای Task، این پارامترها را به PowerShell منتقل میکند تا اسکریپت موردنظر شما با تنظیمات مشخص شده اجرا شود.
آیا این سیستم از نظر امنیتی مشکلی ندارد
از نظر امنیتی، اجرای اسکریپتهای PowerShell در یک سرور میتواند نگرانیهایی را به همراه داشته باشد، به خصوص اگر اسکریپتها دسترسی به منابع حساس داشته باشند یا اگر از منابع نامطمئن استفاده شوند. برای اطمینان از امنیت سیستم هنگام استفاده از اسکریپتها و Task Scheduler، موارد زیر را در نظر بگیرید:
محدود کردن دسترسیها: اسکریپتهایی که اجرا میکنید باید تنها دسترسیهای لازم برای انجام وظایف مشخص شده را داشته باشند. از اجرای اسکریپتها با دسترسیهای ادمین (Administrator) بدون نیاز جلوگیری کنید.
بررسی دقیق اسکریپت: قبل از اجرای هر اسکریپتی، محتوای آن را بررسی کرده و از اهداف و عملکردهای آن مطمئن شوید. این کار جلوی اجرای کد مخرب یا ناخواسته را میگیرد.
استفاده از سیاستهای اجرایی PowerShell: PowerShell سیاستهای اجرایی (Execution Policies) را ارائه میدهد که میتوانند جلوی اجرای اسکریپتهای نامطمئن یا بدون امضا را بگیرند. در مثال بالا، از پارامتر -ExecutionPolicy Bypass استفاده شد که همه سیاستها را نادیده میگیرد، اما این کار باید تنها زمانی انجام شود که از ایمن بودن اسکریپت اطمینان دارید.
مدیریت دقیق Task Scheduler: تنها کاربران مورد اعتماد و با دسترسیهای لازم باید قادر به ایجاد یا تغییر Tasks در Task Scheduler باشند.
آپدیت و نگهداری: مطمئن شوید که سیستمعامل و PowerShell بهروز هستند تا از وجود آخرین بهروزرسانیهای امنیتی بهرهمند شوید.
مانیتورینگ و لاگها: فعالیتهای مربوط به Task Scheduler و اسکریپتها باید مانیتور شوند و لاگهای مربوط به آنها باید برای بررسیهای بعدی ذخیره شوند.
استفاده از اصول کمترین امتیاز: اسکریپتها باید با حداقل دسترسیهای لازم برای انجام وظایفشان اجرا شوند.
فایروال و آنتیویروس: اطمینان حاصل کنید که فایروال و آنتیویروس فعال هستند و به روز رسانی شدهاند تا از سیستم در برابر تهدیدات امنیتی محافظت کنند.
با رعایت این اصول، میتوانید ریسکهای امنیتی مربوط به اجرای اسکریپتها و استفاده از Task Scheduler را به حداقل برسانید.
کلیک کنید و با نماینده ما در واتساپ ارتباط بگیرید!