Tìm kiếm trang web

Cách tải xuống tệp bằng PowerShell


PowerShell là một ngôn ngữ kịch bản tuyệt vời để viết tất cả các loại tập lệnh. Nhưng bạn có biết rằng bạn cũng có thể tải xuống một tệp bằng PowerShell không? Bạn có thể sử dụng PowerShell để tải xuống một hoặc nhiều tệp từ internet.

Có một số phương pháp khi tải xuống tệp bằng PowerShell. Chúng tôi có thể tải xuống tệp từ bất kỳ URL nào bằng PowerShell, chia sẻ mạng cục bộ và từ phía sau các trang web được bảo vệ bằng thông tin xác thực.

Trong bài viết này, chúng ta sẽ bắt đầu với phương pháp đơn giản nhất để tải xuống một tệp duy nhất và chúng ta cũng sẽ xem xét các phương pháp khác (nhanh hơn) để tải xuống tệp bằng PowerShell.

Tệp tải xuống Powershell từ URL

Chúng ta sẽ bắt đầu với cách phổ biến nhất để tải xuống tệp từ một URL bằng PowerShell. Đối với điều này, chúng tôi sẽ sử dụng lệnh ghép ngắn Invoke-WebRequest. Để tải xuống một tệp, chúng tôi cần biết URL nguồn và từ bỏ đích đến cho tệp mà chúng tôi muốn tải xuống.

Tham số -OutFile là bắt buộc. Bạn không cần nhập đường dẫn đầy đủ nhưng cần phải nhập tên tệp.

# Source URL
$url = "http://speed.transip.nl/10mb.bin"

# Destation file
$dest = "c:\temp\testfiles.bin"

# Download the file
Invoke-WebRequest -Uri $url -OutFile $dest
Invoke-WebRequest sẽ ghi đè lên tệp cục bộ nếu nó đã tồn tại mà không có bất kỳ cảnh báo nào

Xác thực bằng Invoke-WebRequest

Một số tài nguyên trực tuyến yêu cầu bạn phải đăng nhập trước khi có thể truy cập/tải xuống tệp. Với lệnh ghép ngắn Invoke-WebRequest, chúng tôi có thể cung cấp thông tin xác thực cần thiết để tải xuống tệp.

Nếu bạn đang tạo một tập lệnh cần chạy tự động thì bạn sẽ cần lưu trữ thông tin xác thực trong chính tập lệnh đó. Tôi khuyên bạn nên tạo mật khẩu chuỗi an toàn và lưu trữ nó trong tệp văn bản trên máy tính đang chạy tập lệnh. Nó vẫn không phải là siêu an toàn, nhưng sẽ tốt hơn một chút so với việc sử dụng mật khẩu văn bản gốc trong tập lệnh của bạn.

# 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 $credObject

Tải xuống tệp nhanh hơn với Start-BitsTransfer trong PowerShell

Phương thức Invoke-WebRequest có sẵn trong tất cả các phiên bản PowerShell và cũng có thể được sử dụng trên các máy Linux. Nhưng nhược điểm là hơi chậm. Với Invoke-WebRequest, trước tiên, tệp sẽ được lưu vào bộ nhớ đệm trước khi được ghi vào đĩa.

Cách nhanh hơn và tốt hơn là sử dụng lệnh ghép ngắn Start-BitsTransfer trong PowerShell. Lệnh ghép ngắn này cho phép bạn xếp hàng các tệp, đặt mức độ ưu tiên (hữu ích cho việc giới hạn băng thông), có thể chạy ở chế độ nền và tải xuống nhiều tệp không đồng bộ.

Đây là phương pháp tải file cơ bản nhất bằng BitsTransfer, bạn chỉ cần nguồn và đích.

# URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"

# Download file
Start-BitsTransfer -Source $url -Destination $dest 

Theo mặc định, các công việc tải xuống chạy ở nền trước sẽ tiêu tốn băng thông tối đa hiện có. Bạn có thể thay đổi điều này bằng cách đặt mức độ ưu tiên của công việc:

  • Tiền cảnh - Mặc định
  • Cao
  • Bình thường
  • Thấp

Chỉ băng thông mạng nhàn rỗi được sử dụng khi bạn đặt mức độ ưu tiên thành cao, bình thường hoặc thấp.

Một tùy chọn khác là chạy công việc tải xuống không đồng bộ, cho phép bạn bắt đầu nhiều công việc tải xuống cùng một lúc. Khi bạn sử dụng phương pháp này, đảm bảo rằng bạn hoàn thành công việc tải xuống khi quá trình này hoàn tất.

Start-BitsTransfer -Source $url -Destination $dest -Asynchronous -Priority normal

Như bạn có thể thấy tôi đã tải xuống cùng một tệp bin như trước. Nhưng nếu nhìn vào thư mục đích, chúng ta chỉ thấy tệp .tmp.

Bạn sẽ cần chạy Complete-BitsTransfer để hoàn tất công việc tải xuống.

Get-BitsTransfer | Complete-BitsTransfer

Tải xuống nhiều tệp bằng PowerShell

Để tải xuống nhiều tệp bằng PowerShell, trước tiên chúng ta cần biết tệp nào có sẵn. Trước tiên, chúng ta có thể sử dụng lệnh ghép ngắn Invoke-WebRequest để lấy nội dung từ trang web.

Nếu bạn xem nội dung của http://speed.transip.nl thì bạn sẽ thấy danh sách các tệp nhị phân mà chúng tôi có thể tải xuống.

Đầu tiên, chúng ta sẽ quét trang web

$content = Invoke-WebRequest -URI "http://speed.transip.nl"

Điều này sẽ trả về không chỉ nội dung của trang web mà còn các thuộc tính khác, như Liên kết và Trường đầu vào.

Đây là một trang web khá đơn giản nhưng giả sử chúng ta chỉ muốn các tệp bắt đầu bằng tên “ngẫu nhiên”. Chúng ta có thể lọc các liên kết bằng một truy vấn like đơn giản và chỉ chọn thuộc tính href từ mỗi liên kết.

$randomBinFiles = $content.links | where {$_.innerHTML -like 'random*'} | select href

Vì vậy, bây giờ chúng tôi có các liên kết cho tất cả các tệp nhị phân ngẫu nhiên. Tất cả những gì chúng ta cần làm là tải xuống từng cái một.

Khi bạn cần tải xuống nhiều tệp, tốt hơn hết bạn nên sử dụng lệnh ghép ngắn Start-BitsTransfer. Nó cho phép bạn tải xuống nhiều tệp cùng lúc ở chế độ nền với tham số -Asynchronous

Ưu điểm khác của lệnh ghép ngắn BitsTransfer là nó có thể xử lý các gián đoạn kết nối và nhận biết được việc sử dụng băng thông mạng của bạn.

$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-BitsTransfer

Chúng ta có thể bắt đầu tất cả công việc tải xuống bằng cách sử dụng tham số -Không đồng bộ. Nếu không có nó, lệnh ghép ngắn BitsTransfer sẽ tải xuống hoàn toàn tệp đầu tiên trước khi bắt đầu lần tải xuống tiếp theo trong khi tạm dừng tập lệnh của bạn.

Bạn có thể sử dụng lệnh ghép ngắn Get-BitTransfer để hiển thị tiến trình tải xuống. Nếu bạn muốn dừng công việc tải xuống thì hãy sử dụng lệnh ghép ngắn Remove-BitTransfer. Bạn có thể dừng một công việc dựa trên JobId của nó hoặc tất cả công việc với:

Get-BitsTransfer | % {Remove-BitsTransfer $_.JobId}

Hoàn tất tải xuống BitsTransfer

Điều quan trọng là phải hoàn thành tệp được truyền khi sử dụng BitsTransfer kết hợp với tham số Không đồng bộ. Khi sử dụng Không đồng bộ, nó sẽ tạo một tệp tạm thời trong quá trình tải xuống. Nhưng để thực sự sử dụng tệp, bạn sẽ cần chạy lệnh ghép ngắn sau:

Get-BitsTransfer | Complete-BitsTransfer

Tệp tải xuống PowerShell từ máy chủ

Chúng tôi sẽ không sử dụng Invoke-WebRequest để tải xuống tệp từ nguồn mạng cục bộ, như máy chủ hoặc NAS, với PowerShell. Thay vào đó, chúng ta có thể chỉ cần sử dụng cmd Copy-Item để tải xuống tệp từ máy chủ.

Lệnh ghép ngắn Copy-Items lấy nguồn và đích, giống như lệnh ghép ngắn Invoke-WebRequest.

# 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 -Recurse

Nếu bạn muốn biết thêm về lệnh ghép ngắn Copy-Item thì bạn nên đọc bài viết này, nơi tôi giải thích thêm về lệnh ghép ngắn và các lựa chọn thay thế.

Powershell Tải xuống tệp Zip

Phương pháp tải xuống tệp zip khá giống với tệp thông thường. Nhưng tôi muốn chỉ cho bạn cách tải xuống và giải nén tệp zip. Bằng cách này, bạn có thể xử lý ngay các tệp bên trong tệp zip mà không cần tương tác thủ công.

Tôi sẽ sử dụng csv mẫu này trên GitHub mà chúng ta có thể tải xuống dưới dạng tệp zip. Chúng tôi phải đặt đích cho chính tệp zip và đường dẫn mà chúng tôi muốn giải nén tệp.

Invoke-WebRequest tải xuống tệp zip giống như bất kỳ tệp nào khác.

# 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 $zipFile

Bước tiếp theo là tự động giải nén tệp zip ở vị trí mong muốn. Đối với điều này, chúng ta sẽ sử dụng một đối tượng COM. Với đối tượng COM chúng ta có thể giải nén file zip và sao chép nội dung vào vị trí mong muốn.

# 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)

Kết thúc

Việc tải xuống tệp bằng PowerShell khá dễ dàng khi bạn có URL chính xác của tệp nguồn. Khi bạn cần cạo một trang web trước tiên thì có thể sẽ tốn nhiều công sức hơn một chút để thiết lập đúng cách.

Hãy thử sử dụng lệnh ghép ngắn Start-BitsTransfer để tải xuống tệp và đặt mức độ ưu tiên thành bình thường khi sử dụng nó trong tập lệnh tự động. BitsTransfer có nhiều tùy chọn hơn khi thử lại, tiếp tục và kiểm soát băng thông sau đó là Invoke-WebRequest.

Nếu bạn có bất kỳ câu hỏi nào về cách tải xuống tệp bằng PowerShell, hãy để lại nhận xét bên dưới.

Bài viết liên quan