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