如果文件已使用powershell更改,我该如何下载文件

Mar*_*ark 4 powershell

我正在使用这个简单的函数来下载文件:

function DownloadFile([string]$url, [string]$file)
{
    $clnt = new-object System.Net.WebClient
    Write-Host "Downloading from $url to $file " 
    $clnt.DownloadFile($url, $file)
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我正在使用的脚本调用它可以多次调用,目前这可能意味着多次下载文件.

如果文件本地不存在或者服务器版本较新(例如服务器上的LastModifiedDate大于本地LastModifiedDate),我该如何修改函数才能下载?

编辑: 这是我到目前为止,似乎工作,但不希望有2次调用服务器.

function DownloadFile([string]$url, [string]$file)
{
    $downloadRequired = $true
    if ((test-path $file)) 
    {
        $localModified = (Get-Item $file).LastWriteTime 
        $webRequest = [System.Net.HttpWebRequest]::Create($url);
        $webRequest.Method = "HEAD";
        $webResponse = $webRequest.GetResponse()
        $remoteLastModified = ($webResponse.LastModified) -as [DateTime] 
        $webResponse.Close()

        if ($remoteLastModified -gt $localModified)
        {
            Write-Host "$file is out of date"
        }
        else
        {
            $downloadRequired = $false
        }

    }

    if ($downloadRequired)
    {
        $clnt = new-object System.Net.WebClient
        Write-Host "Downloading from $url to $file"
        $clnt.DownloadFile($url, $file)
    }
    else
    {
        Write-Host "$file is up to date."
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*wis 8

本周我一直在打这个,并提出了这个问题

# ----------------------------------------------------------------------------------------------
# download a file
# ----------------------------------------------------------------------------------------------
Function Download-File {
Param (
	[Parameter(Mandatory=$True)] [System.Uri]$uri,
	[Parameter(Mandatory=$True )] [string]$FilePath
)

#Make sure the destination directory exists
#System.IO.FileInfo works even if the file/dir doesn't exist, which is better then get-item which requires the file to exist
If (! ( Test-Path ([System.IO.FileInfo]$FilePath).DirectoryName ) ) { [void](New-Item ([System.IO.FileInfo]$FilePath).DirectoryName -force -type directory)}

#see if this file exists
if ( -not (Test-Path $FilePath) ) {
	#use simple download
	[void] (New-Object System.Net.WebClient).DownloadFile($uri.ToString(), $FilePath)
} else {
	try {
		#use HttpWebRequest to download file
		$webRequest = [System.Net.HttpWebRequest]::Create($uri);
		$webRequest.IfModifiedSince = ([System.IO.FileInfo]$FilePath).LastWriteTime
		$webRequest.Method = "GET";
		[System.Net.HttpWebResponse]$webResponse = $webRequest.GetResponse()

		#Read HTTP result from the $webResponse
		$stream = New-Object System.IO.StreamReader($webResponse.GetResponseStream())
		#Save to file
		$stream.ReadToEnd() | Set-Content -Path $FilePath -Force 

	} catch [System.Net.WebException] {
		#Check for a 304
		if ($_.Exception.Response.StatusCode -eq [System.Net.HttpStatusCode]::NotModified) {
			Write-Host "  $FilePath not modified, not downloading..."
		} else {
			#Unexpected error
			$Status = $_.Exception.Response.StatusCode
			$msg = $_.Exception
			Write-Host "  Error dowloading $FilePath, Status code: $Status - $msg"
		}
	}
}
}
Run Code Online (Sandbox Code Playgroud)