PowerShell中使用WebClient 下载文件并获取下载进度

        前言:因为项目的需要,使用了PowerShell脚本下载指定的安装包并进行安装,配置处理,在PowerShell脚本中使用了.Net的WebClient进行了文件下载操作,但因为需求问题需要从WebClient中获取下载的进度信息,查找了许久,最后经热心网友:Matrix Xu的指点找到了Register-ObjectEvent这个订阅的方法。

        以下是个人对订阅事件的一些见解:

        

PowerShell中提供订阅事件的一些相关接口:Register-ObjectEvent 、Register-EngineEvent 、Register_WmiEvent等相关接口。

Register-ObjectEvent : 可以订阅由.Net对象生成的事件,比如订阅.Net的WebClient对象的下载完成处理,我们可以通过以下代码实现:

1

2

3

4

5

Register-ObjectEvent -InputObject $client -EventName DownloadFileCompleted `

        -SourceIdentifier Web.DownloadFileCompleted -Action {  

             Write-Host "Downloa

dFileCompleted"

            $Global:isDownloaded = $True

        }

 

 

Register-EngineEvent:可以订阅由PowerShell以及New-Event生成的事件。比如我们需要在PowerShell结束后做一些释放、删除临时文件等的操作,我们可以通过以下代码实现:

 

1

2

3

4

5

6

Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PSEngineEvent]::Exiting) -Action {

           #处理PowerShell退出事件

            Unregister-Event -SourceIdentifier WebClient.DownloadProgressChanged

            Unregister-Event -SourceIdentifier WebClient.DownloadFileComplete

            Unregister-Event -SourceIdentifier Timer.Output

           }

 

 

Register-WmiEvent:可以订阅本地计算机或远程jisuanji 上的WMI事件。比如我们需要记录计算机进程启动一些相关信息,我们可以通过以下代码实现

 

1

2

3

4

register-wmiEvent -class 'Win32_ProcessStartTrace' -sourceIdentifier "ProcessStarted" -action {

             #处理进程启动相关事件

             get-history | where { $_.commandline -like "*start-process*" } | export-cliXml "commandHistory.clixml"

}

 

 

下面附带一个简单的订阅WebClient 进度信息的一个例子:

 


#==============================全局变量区=========================#
[bool]$isDownloaded=$False

#==============================下载函数===========================#
Function Download([String]$url, [String]$fullFileName)
{
    if([String]::IsNullOrEmpty($url) -or [String]::IsNullOrEmpty($fullFileName))
    {
        return $false;
    }
    try
    {
        $client = New-Object System.Net.WebClient 
        $client.UseDefaultCredentials = $True

        #监视WebClient 的下载完成事件 
         Register-ObjectEvent -InputObject $client -EventName DownloadFileCompleted `
        -SourceIdentifier Web.DownloadFileCompleted -Action {   
            #下载完成,结束下载
            $Global:isDownloaded = $True
        }
        #监视WebClient 的进度事件
        Register-ObjectEvent -InputObject $client -EventName DownloadProgressChanged `
        -SourceIdentifier Web.DownloadProgressChanged -Action {
            #将下载的进度信息记录到全局的Data对象中
            $Global:Data = $event
        }

        $Global:isDownloaded =$False

        #监视PowerShell退出事件
        Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PSEngineEvent]::Exiting) -Action {
            #PowerShell 结束事件
            Get-EventSubscriber | Unregister-Event
            Get-Job | Remove-Job -Force
           }
           
         #启用定时器,设置1秒一次输出下载进度
        $timer = New-Object timers.timer
        # 1 second interval
        $timer.Interval = 1000
        #Create the event subscription
        Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier Timer.Output -Action {
            $percent = $Global:Data.SourceArgs.ProgressPercentage
            $totalBytes = $Global:Data.SourceArgs.TotalBytesToReceive
            $receivedBytes = $Global:Data.SourceArgs.BytesReceived
           
            If ($percent -ne $null) {
                 #这里你可以选择将进度显示到命令行 也可以选择将进度写到文件,具体看自己需求
                 #我这里选择将进度输出到命令行
                    Write-Host "当前下载进度:$percent  已下载:$receivedBytes 总大小:$totalBytes"
                    
            }
           
        }
        $timer.Enabled = $True

        #使用异步方式下载文件
         $client.DownloadFileAsync($url, $fullFileName)
          While (-Not $isDownloaded)
           {
                #等待下载线程结束
                Start-Sleep -m 100
           }

         $timer.Enabled = $False
         
        #清除监视
        Get-EventSubscriber | Unregister-Event
        Get-Job | Remove-Job -Force
        #关闭下载线程
        $client.Dispose()
        Remove-Variable client
      
         Write-Host "Finish "
    }
    catch
    {
       
        return $false;  
    }
    return $true;
}
### 回答1: 使用PowerShell下载文件的步骤如下: 1. 打开PowerShell控制台。 2. 使用以下命令创建一个WebClient对象: $webClient = New-Object System.Net.WebClient 3. 使用以下命令下载文件: $webClient.DownloadFile("文件URL", "本地文件路径") 其文件URL是要下载文件的网址,本地文件路径是要保存到的本地文件路径。 例如,要下载一个名为example.zip的文件,它的网址是https://example.com/example.zip,要将它保存到C:\Downloads目录下,可以使用以下命令: $webClient.DownloadFile("https://example.com/example.zip", "C:\Downloads\example.zip") 4. 下载完成后,可以使用以下命令关闭WebClient对象: $webClient.Dispose() 以上就是使用PowerShell下载文件的方法。 ### 回答2: PowerShell 是一种在 Windows 系统上执行脚本和自动化任务的强大工具。通过 PowerShell,我们可以利用其丰富的功能来下载文件。 要在 PowerShell 下载文件,我们可以使用 `Invoke-WebRequest` cmdlet。以下是一个简单的示例: ```powershell $url = "http://example.com/file.txt" $outputPath = "C:\Downloads\file.txt" Invoke-WebRequest -Uri $url -OutFile $outputPath ``` 在上述示例,我们首先指定要下载文件的 URL,并将其分配给变量 `$url`。然后,我们指定我们要将文件保存在本地计算机上的路径,并将其分配给变量 `$outputPath`。 接下来,我们使用 `Invoke-WebRequest` 使用指定的 URL 下载文件,并使用 `-OutFile` 参数指定要将文件保存到的路径。在这种情况下,我们将文件保存在 `$outputPath` 指定的位置。 当运行该脚本时,PowerShell使用指定的 URL 从远程服务器下载文件,并将其保存到本地计算机的指定路径。 通过使用 PowerShell 的 `Invoke-WebRequest` cmdlet,我们可以轻松下载文件并从远程服务器获取所需的资源。当然,我们可以根据需要进行进一步的自定义和处理,以适应特定的下载需求。 ### 回答3: PowerShell是一种跨平台的任务自动化和配置管理框架,它也能够通过脚本来下载文件。 要使用PowerShell下载文件,可以使用以下步骤: 1. 打开PowerShell控制台:在Windows系统,可以按下Win + X键,并选择“命令提示符(管理员)”或“Windows PowerShell(管理员)”。 2. 使用以下命令在PowerShell创建一个新的网络下载客户端对象: ```powershell $webClient = New-Object System.Net.WebClient ``` 3. 指定要下载文件的URL地址,并将其分配给一个变量: ```powershell $url = "http://example.com/file.zip" ``` 这里的URL应该是你想要下载文件的具体网址。 4. 指定要将文件保存到的本地目录,并将其分配给一个变量: ```powershell $localPath = "C:\download\file.zip" ``` 这里的路径应该是你想要将文件保存到的本地目录的具体路径。 5. 使用以下命令下载文件: ```powershell $webClient.DownloadFile($url, $localPath) ``` 这将从指定的URL下载文件,并将其保存到指定的本地路径。 通过执行以上步骤,PowerShell可以下载指定的文件,并将其保存到指定的本地目录。需要注意的是,你需要具有访问下载文件的权限,并且确保指定的URL和本地路径是有效的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值