PowerShell ile Dosya Nasıl İndirilir
PowerShell, her türlü betiği yazmak için harika bir betik dilidir. Ancak PowerShell ile dosya da indirebileceğinizi biliyor muydunuz? İnternetten tek veya birden fazla dosya indirmek için PowerShell'i kullanabilirsiniz.
PowerShell ile dosya indirmenin birkaç yöntemi vardır. PowerShell ile herhangi bir URL'den, yerel ağ paylaşımlarından ve kimlik bilgileri korumalı web sitelerinin arkasından dosya indirebiliriz.
Bu yazımızda tek dosya indirmenin en basit yöntemiyle başlayacağız ve ayrıca PowerShell ile dosya indirmenin diğer (daha hızlı) yöntemlerine de göz atacağız.
URL'den Powershell Dosya İndir
PowerShell ile bir URL'den dosya indirmenin en yaygın yöntemiyle başlayacağız. Bunun için Invoke-WebRequest cmdlet'ini kullanacağız. Bir dosyayı indirmek için kaynak URL'yi bilmemiz ve indirmek istediğimiz dosyanın hedefini belirtmemiz gerekir.
-OutFile parametresi gereklidir. Tam yolu girmenize gerek yoktur ancak dosya adı gereklidir.
# Source URL
$url = "http://speed.transip.nl/10mb.bin"
# Destation file
$dest = "c:\temp\testfiles.bin"
# Download the file
Invoke-WebRequest -Uri $url -OutFile $destInvoke-WebRequest, herhangi bir uyarı olmadan zaten mevcutsa yerel dosyanın üzerine yazacaktır.
Invoke-WebRequest ile kimlik doğrulama
Bazı çevrimiçi kaynaklar, dosyalara erişebilmeniz/indirebilmeniz için önce oturum açmanızı gerektirir. Invoke-WebRequest cmdlet'i ile dosyaları indirmek için gerekli olan kimlik bilgilerini sağlayabiliriz.
Otomatik olarak çalıştırılması gereken bir komut dosyası oluşturuyorsanız kimlik bilgilerini komut dosyasının kendisinde saklamanız gerekecektir. Güvenli bir dize parolası oluşturmanızı ve bunu, betiği çalıştıran bilgisayardaki bir metin dosyasında saklamanızı öneririm. Yine de süper güvenli olmayacaktır, ancak betiğinizde düz metin şifresi kullanmaktan biraz daha iyidir.
# URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"
# Define username and password
$username = 'LazyUsrName'
$password = 'StrongPlainTextPasswd'
# Convert to SecureString
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force
# Create Credential Object
$credObject = New-Object System.Management.Automation.PSCredential ($username, $secPassword)
# Download file
Invoke-WebRequest -Uri $url -OutFile $dest -Credential $credObjectPowerShell'deki Start-BitsTransfer ile dosyaları daha hızlı indirin
Invoke-WebRequest yöntemi tüm PowerShell sürümlerinde mevcuttur ve Linux makinelerinde de kullanılabilir. Ama dezavantajı biraz yavaş olmasıdır. Invoke-WebRequest ile dosya, diske yazılmadan önce ilk olarak bellekte arabelleğe alınır.
Daha hızlı ve daha iyi bir yol, PowerShell'de Start-BitsTransfer cmdlet'ini kullanmaktır. Bu cmdlet, dosyaları sıraya koymanıza, önceliği ayarlamanıza (bant genişliği sınırlaması için kullanışlıdır), arka planda çalışabilmenize ve birden fazla dosyayı eşzamansız olarak indirmenize olanak tanır.
Bu, BitsTransfer ile dosya indirmenin en temel yöntemidir; yalnızca bir kaynağa ve hedefe ihtiyacınız vardır.
# URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"
# Download file
Start-BitsTransfer -Source $url -Destination $dest Varsayılan olarak indirme işleri, mevcut maksimum bant genişliğini tüketerek ön planda çalışır. İşin önceliğini ayarlayarak bunu değiştirebilirsiniz:
- Ön Plan - Varsayılan
- Yüksek
- Normal
- Düşük
Önceliği yüksek, normal veya düşük olarak ayarladığınızda yalnızca boştaki ağ bant genişliği kullanılır.
Diğer bir seçenek de indirme işini eşzamansız olarak çalıştırmaktır; böylece aynı anda birden fazla indirme işi başlatabilirsiniz. Bu yöntemi kullandığınızda, indirme işi bittiğinde tamamladığınızdan emin olun.
Start-BitsTransfer -Source $url -Destination $dest -Asynchronous -Priority normal
Gördüğünüz gibi daha önce olduğu gibi aynı bin dosyasını indirdim. Ancak hedef klasöre baktığımızda yalnızca .tmp dosyasını görüyoruz.
İndirme işini tamamlamak için Complete-BitsTransfer'ı çalıştırmanız gerekecektir.
Get-BitsTransfer | Complete-BitsTransferPowerShell ile Birden Fazla Dosya İndirme
PowerShell ile birden fazla dosya indirmek için öncelikle hangi dosyaların mevcut olduğunu bilmemiz gerekir. Web sayfasından içerik almak için öncelikle Invoke-WebRequest cmdlet'ini kullanabiliriz.
http://speed.transip.nl içeriğine bakarsanız indirebileceğimiz ikili dosyaların bir listesini göreceksiniz.
İlk önce web sitesini kazıyacağız
$content = Invoke-WebRequest -URI "http://speed.transip.nl"Bu, yalnızca web sayfasının içeriğini değil aynı zamanda Bağlantılar ve Giriş Alanları gibi diğer özellikleri de döndürecektir.
Bu oldukça basit bir web sayfası, ancak diyelim ki yalnızca “rastgele” adıyla başlayan dosyaları istiyoruz. Basit bir beğeni sorgusu ile bağlantıları filtreleyebilir ve her bağlantıdan yalnızca href özelliğini seçebiliriz.
$randomBinFiles = $content.links | where {$_.innerHTML -like 'random*'} | select hrefArtık tüm rastgele ikili dosyalar için bağlantılara sahibiz. Tek yapmamız gereken her birini indirmek.
Birden fazla dosya indirmeniz gerektiğinde Start-BitsTransfer cmdlet'ini kullanmak daha iyidir. -Asynchronous parametresi ile arka planda aynı anda birden fazla dosya indirmenize olanak sağlar.
BitsTransfer cmdlet'inin diğer avantajları, bağlantı kesintilerini giderebilmesi ve ağ bant genişliği kullanımınızın farkında olmasıdır.
$url = "http://speed.transip.nl"
# Create full links for each entry
$randomBinFiles.foreach( { $_.href = $url + "/" + $_.href })
# Download each file in the background
$randomBinFiles.foreach({
Start-BitsTransfer ($url + "/" + $_.href) -Asynchronous
})
# Complete the BitsTransfer
Get-BitsTransfer | Complete-BitsTransferTüm indirme işlerini -Asynchronous parametresini kullanarak başlatabiliriz. Bu olmadan, BitsTransfer cmdlet'i bir sonraki indirme işlemine başlamadan önce ilk dosyayı tamamen indirir ve bu arada komut dosyanızı beklemeye alır.
İndirme işleminin ilerlemesini göstermek için Get-BitTransfer cmdlet'ini kullanabilirsiniz. İndirme işini durdurmak istiyorsanız Remove-BitTransfer cmdlet'ini kullanın. Tek bir işi JobId'ye göre veya tüm işleri aşağıdakilerle durdurabilirsiniz:
Get-BitsTransfer | % {Remove-BitsTransfer $_.JobId}BitsTransfer indirme işlemini tamamlayın
BitsTransfer'ı Asynchronous parametresiyle birlikte kullanırken aktarılan dosyayı tamamlamak önemlidir. Eşzamansız kullanıldığında, indirme işlemi sırasında geçici bir dosya oluşturulur. Ancak dosyayı gerçekten kullanmak için aşağıdaki cmdlet'i çalıştırmanız gerekir:
Get-BitsTransfer | Complete-BitsTransferPowerShell Sunucudan dosya indirme
PowerShell ile sunucu veya NAS gibi yerel bir ağ kaynağından dosya indirmek için Invoke-WebRequest'i kullanmayacağız. Bunun yerine, bir sunucudan dosya indirmek için Copy-Item cmd'yi kullanabiliriz.
Copy-Items cmdlet'i, tıpkı Invoke-WebRequest cmdlet'i gibi bir kaynak ve hedef alır.
# Set Source and destination
$source = "\\LA-WIN10-LAB01\speedtest\"
$destination = "c:\temp\testfiles"
# Copy all items in the source folder
Copy-Item -path $source -Destination $destination -RecurseCopy-Item cmdlet'i hakkında daha fazla bilgi edinmek istiyorsanız cmdlet ve alternatifleri hakkında daha fazla bilgi verdiğim bu makaleyi okumalısınız.
Powershell Zip Dosyasını İndirin
Zip dosyalarını indirme yöntemi normal bir dosyayla hemen hemen aynıdır. Ancak size bunun zip dosyasını nasıl indirip çıkardığını göstermek istedim. Bu şekilde zip dosyasının içindeki dosyaları manuel müdahaleye gerek kalmadan hemen işleyebilirsiniz.
Zip dosyası olarak indirebileceğimiz bu örnek csv'yi GitHub'da kullanacağım. Zip dosyasının kendisi için bir hedef ve dosyaları çıkarmak istediğimiz yolu belirlememiz gerekiyor.
Invoke-WebRequest, zip dosyasını diğer dosyalar gibi indirir.
# URL and Destination
$url = "https://github.com/datapackage-examples/sample-csv/archive/refs/heads/master.zip"
# Create temp destination for the zip and get zipfile name from source URL
$zipFile = "c:\temp\zipfiles" + $(Split-Path -Path $Url -Leaf)
# Extract path
$extractPath = "c:\temp\zipfiles"
# Download file
Invoke-WebRequest -Uri $url -OutFile $zipFileBir sonraki adım zip dosyasını otomatik olarak istenilen konuma çıkarmaktır. Bunun için bir COM nesnesi kullanacağız. COM nesnesi ile zip dosyasını çıkartabilir ve içeriği istenilen konuma kopyalayabiliriz.
# Create instance of COM Object
$objShell = New-Object -ComObject Shell.Application
# Extract the Files
$extractedFiles = $ObjShell.NameSpace($zipFile).Items()
# Copy the extracted files to the destination folder
$ObjShell.NameSpace($extractPath).CopyHere($extractedFiles)Kapanış
Kaynak dosyanın tam URL'sine sahip olduğunuzda PowerShell ile dosya indirmek oldukça kolaydır. İlk önce bir web sitesini kazımanız gerektiğinde, düzgün bir şekilde kurulum yapmak biraz daha fazla iş gerektirebilir.
Dosyaları indirmek için Start-BitsTransfer cmdlet'ini kullanmayı deneyin ve bunu bir otomatik komut dosyasında kullanırken önceliği normal olarak ayarlayın. BitsTransfer, yeniden deneme, devam ettirme ve bant genişliği kontrolü söz konusu olduğunda Invoke-WebRequest'ten daha fazla seçeneğe sahiptir.
PowerShell ile nasıl dosya indirebileceğinizle ilgili sorularınız varsa aşağıya bir yorum bırakın.



