用于下载文件并检查下载文件完整性的 Powershell 脚本

Powershell script to download files and check integrity of downloaded files

我编写了这个 powershell 脚本来从 url 下载文件。它工作正常,但我的脚本只检查文件名,如果下载的文件已损坏,该脚本不会重新下载文件。可以用 powershell 做到这一点吗?我还需要在 download_history.log 文件中记录错误。

$start_time = Get-Date
$download_folder_v3 = "D:\test"
# Download URL list
$page_url_v3 = "http://test.com/example"
$file_path_v3 = "http://test.com/example/v3/"
$files_downloaded = 0
"Starting Download $(Get-Date)" >> $download_folder_v3\download_history.log
# Test for download folder and create if doesn't exist
If (-Not (Test-Path "$download_folder_v3")) {
    echo "creating $download_folder_v3 " >> $download_folder_v3\download_history.log
    New-Item $download_folder_v3 -type directory
 } 
Else {
   echo "$download_folder_v3 already exists" >> 
   $download_folder_v3\download_history.log
 }

$filename_list = Split-Path -Leaf ((Invoke-WebRequest -UseBasicParsing -Uri $page_url_v3).Links.Href)

foreach ($file in $filename_list) {
    If (Test-Path "$download_folder_v3$file") {
        echo "$download_folder_v3$file already exists" >> $download_folder_v3\download_history.log
    } 
    Else {
       echo "Downloading $_file_path_v3$file to $download_folder_v3$file"  >> $download_folder_v3\download_history.log
       Invoke-WebRequest -Uri ($_file_path_v3+$file) -UseBasicParsing -OutFile "$download_folder_v3$file"
       $files_downloaded += 1
    }
}

更新

我已经创建了一个用于下载 exe 和 zip 文件的列表,有没有办法只将最后修改的文件(上传到 url)添加到列表:

filename_list = Split-Path -Leaf ((Invoke-WebRequest -UseBasicParsing -Uri $page_url_v3).Links.Href | Where-Object {$_ -match "(^\d*.exe$|\d*.zip$)"})

是的,但您需要提前知道下载文件的校验和,或者有办法从下载服务器检索这些文件。您可以使用 Get-FileHash cmdlet 验证预期的校验和。例如,如果您知道下载文件的预期 SHA256 校验和:

( Get-FileHash -Algorithm SHA256 C:\Path\To\File.extension ).Hash -eq 'expected_checksum'

您也可以 check the expected file size using the Content-Length header(以字节为单位,并且仅当网络服务器提供此信息时才有效)但这不如检查文件的校验和准确。

( Invoke-WebRequest $url -Method Head ).Headers.'Content-Length' -eq ( Get-Item $downloadedFilePath ).length