سکشن اول: آشنایی با روشهای اصلی دانلود فایل در پاورشل
پاورشل (PowerShell) یکی از قویترین ابزارهای خط فرمان و اتوماسیون در سیستم عامل ویندوز است که توسط مایکروسافت توسعه یافته است. این ابزار نه تنها برای مدیریت سیستم و سرورها استفاده میشود، بلکه به کاربران اجازه میدهد تا بهصورت مستقیم با وب، فایل ها، سرویس ها و API ها تعامل داشته باشند. یکی از کاربردهای رایج و مهم پاورشل، دانلود فایلها از اینترنت یا شبکه داخلی است.
در این آموزش از سری مقالات آموزش سیستم عامل و ویندوز در بلاگ ابرآراد، بهصورت مرحلهبهمرحله یاد میگیریم که چگونه با استفاده از سه روش اصلی، Invoke-WebRequest، System.Net.WebClient و Start-BitsTransfer، فایل ها را در محیط پاورشل دانلود کنیم.
چرا دانلود فایل با پاورشل اهمیت دارد؟
در محیطهای سازمانی، سرورهای ابری یا حتی پروژه های DevOps، گاهی نیاز است فایل های بهروزرسانی، اسکریپت ها یا گزارشها بهصورت خودکار از اینترنت یا مخازن داخلی دانلود شوند.
اگر دانلود فایلها در محیطهای اتوماسیونی یا پروژه های DevOps را روی زیرساخت پایدار و مقیاس پذیر انجام میدهید، استفاده از سرور ابری با منابع انعطافپذیر مدیریت اسکریپت ها و عملیات PowerShell را بسیار سادهتر میکند.

به جای استفاده از مرورگر یا نرم افزارهای جانبی، میتوان با چند خط کد پاورشل:
- فایل ها را بهصورت خودکار و زمانبندی شده دریافت کرد.
- چندین فایل را بهطور موازی یا غیرهمزمان (Asynchronous) دانلود نمود.
- دانلودها را با محدودیت پهنای باند مدیریت کرد.
- فرآیند دانلود را در اسکریپت های مدیریتی یا نصب خودکار گنجاند.
در ادامه، با سه روش قدرتمند پاورشل برای انجام این کار آشنا میشویم.
روش اول: دانلود فایل با Invoke-WebRequest
یکی از سادهترین و در عین حال انعطاف پذیرترین روشها برای دانلود فایل در پاورشل، استفاده از دستور Invoke-WebRequest است. این cmdlet از نسخه PowerShell 3 به بعد معرفی شد و برای ارسال درخواست های HTTP/HTTPS و دریافت پاسخ از وب سرورها به کار میرود.
مثال ساده:
Invoke-WebRequest -Uri “https://example.com/file.zip” -OutFile “C:\Downloads\file.zip”
با اجرای این دستور، فایل مورد نظر از آدرس مشخصشده دانلود و در مسیر خروجی ذخیره میشود.
مزایای استفاده از Invoke-WebRequest
1- سادگی و شفافیت: تنها با دو پارامتر اصلی (-Uri و -OutFile) میتوانید دانلود را انجام دهید.
2- پشتیبانی از کوکی ها و نشست ها (Sessions): با استفاده از پارامترهای -WebSession یا -Session میتوانید در دانلودهای متوالی از نشست HTTP استفاده کنید.
3- تعامل با API ها: این روش برای دانلود داده های JSON یا XML از REST API ها نیز قابل استفاده است.
معایب استفاده از Invoke-WebRequest
با وجود سادگی، این روش محدودیتهایی نیز دارد:
- سرعت پایینتر نسبت به سایر روشها، زیرا پاسخ HTTP ابتدا در حافظه ذخیره و سپس روی دیسک نوشته میشود.
- وابستگی به Internet Explorer Engine در نسخههای قدیمی پاورشل (ویندوز سرور Core از این ویژگی پشتیبانی نمیکند).
- مصرف بالای حافظه RAM در زمان دانلود فایل های بزرگ.
پیشنهاد استفاده
اگر در حال دانلود فایل های کوچک (چند مگابایت) هستید یا نیاز به حفظ Session دارید، Invoke-WebRequest انتخابی عالی است. اما اگر به دنبال سرعت بالاتر و مصرف کمتر منابع هستید، باید روشهای دیگر را بررسی کنید.
روش دوم: استفاده از System.Net.WebClient
دومین روش کلاسیک برای دانلود فایل در پاورشل، استفاده از شیء داتنتی System.Net.WebClient است. این روش از زمان ویندوز XP در دسترس بوده و بهدلیل سادگی در اسکریپت نویسی محبوبیت بالایی دارد. System.Net.WebClient در .NET Core و بعد از آن Deprecated شده و باید از HttpClient استفاده شود.
نمونه کد:
$url = “https://example.com/file.zip”
$output = “C:\Downloads\file.zip”
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFile($url, $output)
با اجرای این سه خط کد، فایل مورد نظر از اینترنت دانلود و در مسیر مشخص ذخیره میشود.
مزایای WebClient
1- سرعت بالا: WebClient فایل را مستقیماً از جریان (Stream) HTTP به دیسک منتقل میکند.
2- پشتیبانی کامل از نسخههای Core ویندوز: برخلاف Invoke-WebRequest، برای اجرا به هیچ موتور مرورگری نیاز ندارد.
3- اجرای ساده در یک خط کد: مناسب برای استفاده در اسکریپت های نصب یا بهروزرسانی خودکار.
معایب WebClient
- فاقد قابلیت نمایش وضعیت پیشرفت دانلود (Progress).
- در حالت عادی، بهصورت همزمان (Synchronous) اجرا میشود و سایر دستورات را تا پایان دانلود متوقف میکند.
- کنترل و مدیریت کمتری بر فرآیند HTTP ارائه میدهد.
پیشنهاد استفاده
روش System.Net.WebClient برای کاربرانی که به دنبال دانلود سریع و بدون نیاز به کنترلهای پیچیده هستند، بهترین گزینه است. این روش در سرورهای Windows Server Core نیز بهصورت کامل قابل استفاده است.
روش سوم: استفاده از Start-BitsTransfer
سومین و حرفهایترین روش، استفاده از دستور Start-BitsTransfer است.
BITS یا Background Intelligent Transfer Service یک سرویس داخلی ویندوز است که بهصورت بهینه فایل ها را در پسزمینه دانلود یا آپلود میکند، بدون اینکه پهنای باند شبکه را اشغال کند.

BITS در برخی نسخههای Windows Home ممکن است محدودیت داشته باشد.
نمونه کد:
$url = “https://example.com/file.zip”
$output = “C:\Downloads\file.zip”
Import-Module BitsTransfer
Start-BitsTransfer -Source $url -Destination $output
برای اجرای غیرهمزمان (Asynchronous):
Start-BitsTransfer -Source $url -Destination $output -Asynchronous
مزایای Start-BitsTransfer
1- بیشترین سرعت و پایداری در بین سه روش.
2- قابلیت ادامه دانلود (Resume) در صورت قطع اتصال شبکه.
3- قابلیت محدودسازی پهنای باند برای جلوگیری از اشغال کل ظرفیت اینترنت.
4- پشتیبانی از دانلودهای پسزمینه (Background) بدون ایجاد اختلال در سایر وظایف سیستم.
معایب Start-BitsTransfer
- ممکن است سرویس BITS در برخی نسخههای ویندوز غیرفعال باشد.
- اجرای آن در ماشینهایی با تنظیمات خاص (مثل محیطهای Hardened Server) ممکن است نیاز به مجوز ادمین داشته باشد.
- در اسکریپت های خودکار باید بررسی شود که سرویس BITS فعال است:
Get-Service -Name BITS
پیشنهاد استفاده
اگر قصد دارید فایل های بزرگ یا چندین فایل را بهصورت همزمان دانلود کنید، روش Start-BitsTransfer بهترین انتخاب است. این روش بهویژه در سناریوهای سازمانی، محیط های ابری و سرورهای ویندوزی بسیار کارآمد است.
مقایسه نهایی سه روش
| ویژگیها | Invoke-WebRequest | System.Net.WebClient | Start-BitsTransfer |
| سرعت دانلود | متوسط | بالا | بسیار بالا |
| نیاز به ماژول اضافی | ندارد | ندارد | دارد (BitsTransfer) |
| پشتیبانی از Windows Core | محدود | کامل | کامل |
| قابلیت Resume دانلود | ندارد | ندارد | دارد |
| نمایش پیشرفت دانلود | ندارد | ندارد | دارد |
| پشتیبانی از کوکی و Session | دارد | ندارد | ندارد |
| مناسب برای فایلهای بزرگ | خیر | بله | بله |
| قابلیت Asynchronous | محدود | دارد (DownloadFileAsync) | دارد |
در این بخش از آموزش یاد گرفتیم که پاورشل با سه روش قدرتمند میتواند عملیات دانلود فایل را انجام دهد. هر کدام از این روشها کاربرد مخصوص خود را دارند:
- Invoke-WebRequest: مناسب برای اسکریپت های ساده و نیازمند Session.
- System.Net.WebClient: سریع، سبک و مناسب برای فایل های بزرگ.
- Start-BitsTransfer: پیشرفتهترین روش برای دانلودهای پس زمینه با کنترل پهنای باند.
سکشن دوم: نمونههای عملی، مدیریت خطا، و بهینه سازی دانلودها
در سکشن اول یاد گرفتیم که سه روش اصلی برای دانلود فایل ها در PowerShell وجود دارد:
Invoke-WebRequest، System.Net.WebClient، و Start-BitsTransfer.
اکنون در سکشن دوم وارد بخش حرفهایتر این آموزش میشویم و یاد میگیریم چگونه با استفاده از این دستورات، دانلودهای خود را خودکارسازی، بهینه و ایمن کنیم.
نمونههای عملی از دانلود فایل در PowerShell
مثال ۱: دانلود فایل ساده با Invoke-WebRequest
اگر بخواهید یک فایل کوچک (مثلاً فایل ZIP یا TXT) را دانلود کنید، میتوانید از مثال زیر استفاده کنید:
$source = “https://example.com/update.zip”
$destination = “C:\Downloads\update.zip”
Invoke-WebRequest -Uri $source -OutFile $destination
Write-Host “دانلود با موفقیت انجام شد!”
در این مثال، فایل مستقیماً از وب سایت مورد نظر دانلود و در مسیر مشخص شده ذخیره میشود.
مثال ۲: دانلود چند فایل پشت سر هم
گاهی نیاز دارید چند فایل مختلف را از یک آدرس مشابه یا لیست دریافت کنید.
میتوانید از ساختار حلقه استفاده کنید:
$files = @(
“https://example.com/file1.zip”,
“https://example.com/file2.zip”,
“https://example.com/file3.zip”
)
foreach ($url in $files) {
$filename = Split-Path $url -Leaf
$path = “C:\Downloads\$filename”
Invoke-WebRequest -Uri $url -OutFile $path
Write-Host “دانلود فایل $filename با موفقیت انجام شد.”
}
با این اسکریپت، هر فایل بهصورت جداگانه در پوشه مشخص شده ذخیره میشود.
مثال ۳: دانلود فایل با WebClient بهصورت همزمان (Async)
برای افزایش سرعت یا مدیریت چند دانلود همزمان، میتوانید از متد DownloadFileAsync() استفاده کنید:
$client = New-Object System.Net.WebClient
$url = “https://example.com/bigfile.iso”
$output = “C:\Downloads\bigfile.iso”
$client.DownloadFileAsync($url, $output)
با این روش، فرآیند دانلود در پس زمینه انجام میشود و PowerShell به اجرای سایر دستورات ادامه میدهد.
مثال ۴: دانلود با کنترل خطا و زمانبندی
در مثال زیر از Try/Catch برای کنترل خطاها استفاده شده است:
try {
$url = “https://example.com/update.exe”
$output = “C:\Downloads\update.exe”
Invoke-WebRequest -Uri $url -OutFile $output -ErrorAction Stop
Write-Host “دانلود فایل با موفقیت انجام شد.”
}
catch {
Write-Host “خطایی در فرآیند دانلود رخ داده است:” $_.Exception.Message
}
در صورت بروز خطا، پیام مناسب در خروجی نمایش داده میشود بدون اینکه کل اسکریپت متوقف شود.
مدیریت پیشرفته دانلودها با Start-BitsTransfer
BITS یا Background Intelligent Transfer Service همانطور که گفتیم یکی از بهترین گزینهها برای دانلود فایل های بزرگ است.
در ادامه چند مثال کاربردیتر از استفادهی آن را میبینید.
مثال ۱: دانلود با پهنای باند محدود
برای جلوگیری از اشغال کامل پهنای باند سرور، میتوانید میزان دانلود را محدود کنید:
Start-BitsTransfer -Source “https://example.com/data.zip” -Destination “C:\Downloads\data.zip” -TransferPolicy Limited
مثال ۲: دانلود غیرهمزمان (Asynchronous)
Start-BitsTransfer -Source “https://example.com/bigfile.iso” -Destination “C:\Downloads\bigfile.iso” -Asynchronous
با پارامتر -Asynchronous فرآیند دانلود در پس زمینه ادامه مییابد و کاربر میتواند دستورات دیگر را همزمان اجرا کند.
مثال ۳: بررسی وضعیت دانلودهای فعال
Get-BitsTransfer
این دستور تمام دانلودهای فعال و در حال انتظار را نشان میدهد. برای حذف یک دانلود خاص میتوانید از:
Remove-BitsTransfer -Id <TransferID>
استفاده کنید.
نکات امنیتی هنگام دانلود با PowerShell

دانلود فایل از طریق خط فرمان همیشه باید با احتیاط انجام شود. چند نکته مهم برای امنیت:
- بررسی صحت فایل دانلودی
بعد از دانلود، با استفاده از Get-FileHash میتوانید از صحت و تطابق فایل مطمئن شوید:
Get-FileHash -Path “C:\Downloads\file.zip” -Algorithm SHA256
- دانلود فقط از منابع معتبر
همیشه آدرس فایل را از منابع رسمی دریافت کنید تا از خطر بدافزارها جلوگیری شود. - فعال کردن Execution Policy مطمئن
اگر از اسکریپت ها استفاده میکنید، مطمئن شوید Execution Policy در سطح مطمئن (مانند RemoteSigned) تنظیم شده است:
Set-ExecutionPolicy RemoteSigned
- عدم ذخیره رمز عبور در اسکریپت ها
در صورت نیاز به اعتبارسنجی HTTP، از SecureString استفاده کنید تا رمزها بهصورت امن نگهداری شوند.
در سناریوهای سازمانی که نیاز به امنیت بیشتر، زیرساخت ایزوله و دسترسی کنترل شده وجود دارد، اجرای اسکریپت های پاورشل روی ابرخصوصی (VPC) بهترین انتخاب برای مدیریت ایمن دانلود فایل هاست.
بهینه سازی سرعت دانلود فایل ها
اگرچه سرعت دانلود در پاورشل به عوامل مختلفی مانند پهنای باند، latency شبکه و قدرت سرور مقصد بستگی دارد، با رعایت چند نکته میتوان عملکرد را بهبود داد:
- استفاده از System.Net.WebClient برای دانلودهای تکی و بزرگ
- فعال سازی BITS برای مدیریت بهتر فایل های حجیم
- تنظیم مقدار BufferSize در WebRequest برای کنترل جریان داده
- اجرای اسکریپت روی سیستمهایی با CPU و RAM کافی
- اجتناب از همزمانی زیاد در دانلودها (Concurrency بیش از حد)
چه از سرورهای ابری برای مقیاس پذیری سریع استفاده کنید و چه زیرساخت های ابرخصوصی ابرآراد را برای پردازش امن ترجیح دهید، اجرای اسکریپت های دانلود پاورشل روی این محیطها سرعت، امنیت و قابلیت اتوماسیون را بهطور چشمگیری افزایش میدهد.
مقایسه زمان دانلود بین روشها

بر اساس تستهای تجربی برای فایل ۱۰ مگابایتی در شرایط استاندارد:
| روش دانلود | زمان تقریبی (ثانیه) | سرعت نسبی |
| Invoke-WebRequest | ۲۷ ثانیه | کند |
| System.Net.WebClient | ۷ ثانیه | سریع |
| Start-BitsTransfer | ۶ ثانیه | بسیار سریع |
بنابراین اگر کاربر حرفهای ویندوز هستید و با فایل های بزرگ سروکار دارید، پیشنهاد میشود BITS را برای سرعت و پایداری بیشتر بهکار گیرید.
رفع خطاهای متداول
| نوع خطا | دلیل احتمالی | راهحل |
| Access Denied | مسیر خروجی نیاز به دسترسی ادمین دارد | اجرای پاورشل با Run as Administrator |
| The request was aborted | قطع اتصال شبکه یا فیلتر DNS | بررسی دسترسی اینترنت و آدرس منبع |
| SSL/TLS Error | نسخه TLS قدیمی یا گواهی نامعتبر | اجرای دستور [Net.ServicePointManager]::SecurityProtocol = “Tls12” |
| BITS Service Not Running | سرویس BITS غیرفعال است | اجرای Start-Service BITS |
ترکیب روشها برای اسکریپت های هوشمند
میتوانید با ترکیب چند روش، اسکریپتی بنویسید که بهصورت خودکار روش بهینه را انتخاب کند:
$url = “https://example.com/file.zip”
$output = “C:\Downloads\file.zip”
try {
Start-BitsTransfer -Source $url -Destination $output -ErrorAction Stop
Write-Host “دانلود با BITS انجام شد.”
}
catch {
try {
(New-Object System.Net.WebClient).DownloadFile($url, $output)
Write-Host “دانلود با WebClient انجام شد.”
}
catch {
Invoke-WebRequest -Uri $url -OutFile $output
Write-Host “دانلود با Invoke-WebRequest انجام شد.”
}
}
در این اسکریپت، پاورشل ابتدا تلاش میکند با BITS دانلود را انجام دهد، اگر سرویس فعال نبود، به سراغ WebClient و در نهایت Invoke-WebRequest میرود.
جمعبندی
در این دو سکشن از مقاله، یاد گرفتید که پاورشل ابزار قدرتمندی برای مدیریت و دانلود فایل هاست و با سه روش اصلی زیر میتوان هر نوع فایل را از اینترنت یا شبکه داخلی دریافت کرد:
1- Invoke-WebRequest، ساده و کاربردی برای فایل های کوچک
2- System.Net.WebClient، سریع و سازگار با تمام نسخههای ویندوز
3- Start-BitsTransfer، بهترین گزینه برای دانلودهای بزرگ و حرفهای
همچنین با نحوهی مدیریت خطا، بررسی امنیت، بهینه سازی سرعت و خودکارسازی فرآیند دانلود آشنا شدید.
سوالات متداول
1- برای دانلود فایل های موازی از چه دستوری استفاده کنیم؟
میتوانید از متد DownloadFileAsync() در WebClient یا پارامتر -Asynchronous در Start-BitsTransfer استفاده کنید.
2- اگر سرویس BITS غیرفعال بود چه باید کرد؟
دستور زیر را اجرا کنید:
Start-Service BITS
3- چطور سرعت دانلود را در پاورشل اندازهگیری کنیم؟
با ثبت زمان شروع و پایان:
$start = Get-Date
Invoke-WebRequest -Uri $url -OutFile $output
$time = (Get-Date) – $start
Write-Host “زمان دانلود:” $time.Seconds “ثانیه”
4- آیا امکان دانلود فایل از FTP در پاورشل وجود دارد؟
بله، WebClient از پروتکل FTP نیز پشتیبانی میکند:
$client.DownloadFile(“ftp://example.com/file.zip”, “C:\file.zip”)
5- کدام روش برای استفاده در سرورهای ویندوز Core بهتر است؟
روش System.Net.WebClient چون بدون نیاز به رابط گرافیکی و وابستگی به مرورگر کار میکند.


