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

用于下载文件并检查下载文件完整性的Powershell脚本,powershell,powershell-4.0,Powershell,Powershell 4.0,我编写了这个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

我编写了这个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'
也可以以字节为单位,仅当web服务器提供此信息时才有效,但这不如检查文件的校验和准确

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

如何检查下载的文件是否损坏?你是说它是否被下载了?下载文件的大小不幸的是,url只告诉我文件大小和日期。是否可以在url上获取文件大小,然后与下载文件的大小进行比较?是的,我已经更新了关于如何根据下载url读取内容长度标题的答案。谢谢。有没有办法在foreach中使用此语法并使用regex获取exe文件的大小?是的,您可以在循环中使用我的第二个示例块来提供当前url和当前下载的文件。