PowerShell FTP客户端上传下载模块的编写

来源:互联网 发布:阿里云企业邮箱登陆 编辑:程序博客网 时间:2024/06/10 00:38

前一阵子,一直研究用PowerShell脚本编写FTP客户端程序,这样的好处是编写改写程序都方便,省去了每次编译的麻烦。我是在前辈们的基础上改进了一下,网上找的大部分都不能上传下载大于两兆的文件,在费了半天劲的狂改下终于可以上传下载大文件了,其实原理很简单,就是采用了基于缓冲区的流式传送文件方式,但是PowerShell怪异的语法让人着实恶心了一番,乍看起来像PHP,但却真实的运行在.Net框架上,而且所用的类库全是.Net框架里的,真不知道为什么微软在开发它的时候不用C#语法,难道开发它的负责人是写PHP的出身,好了,言归正传。

1.PowerShell第一次使用前的准备工作

1.1 打开powershell方法:
在开始种搜索”power shell”:输入powershell,打开以下路径:C:\Windows\system32\WindowsPowerShell\v1.0
有两个文件:powershell.exe和powershell_ise.exe 随意单击打开一个即可
1.2 解除Powershell中禁止执行脚本:
PS C:\Windows\system32>get-ExecutionPolicy
PS C:\Windows\system32> set-ExecutionPolicy RemoteSigned
Unrestricted:权限最高,可以不受限制执行任何脚本。
Default:为Powershell默认的策略:Restricted,不允许任何脚本执行。
AllSigned:所有脚本都必须经过签名才能在运行。
RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。

2.PowerShell FTP客户端上传模块脚本

#上传文件function UploadFile($Username,$Password,$RemoteFile,$LocalFile){    if($RemoteFile -eq $null){         REM "RemoteFile is null"        return     }    if($LocalFile -eq $null){         REM "LocalFile is null"        return     }    $FTPRequest = [System.Net.FtpWebRequest]::Create($RemoteFile)    $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile    $FTPRequest.Credentials = new-object System.Net.NetworkCredential($Username, $Password)    $FTPRequest.UseBinary = $true    $FTPRequest.UsePassive = $true    $FTPRequest.KeepAlive = $false    $FTPRequest.Timeout = 300000    $FTPRequest.ReadWriteTimeout = 1000000    $FTPRequest.Proxy = $null    $File = [IO.File]::OpenRead( (Convert-Path $LocalFile) )    $ResponseStream = $FTPRequest.GetRequestStream()    [Byte[]]$Buffer = New-Object Byte[] 1024    $ReadedData = 0    $AllReadedData = 0    $TotalData = (Get-Item $LocalFile).Length    Do {         $ReadedData = $File.Read($Buffer, 0, $Buffer.Length)         $AllReadedData += $ReadedData         $ResponseStream.Write($Buffer, 0, $ReadedData);       } While($ReadedData -gt 0)      $File.Close()    $ResponseStream.Close()    $ResponseStream.Dispose()}

3.PowerShell FTP客户端下载模块脚本

#下载文件function DownloadFile($Username,$Password,$RemoteFile,$LocalFile){    try    {        $ErrorActionPreference="Stop";        if($RemoteFile -eq $null){             REM "RemoteFile is null"            return         }        if($LocalFile -eq $null){             REM "LocalFile is null"            return         }        $FTPRequest = [System.Net.FtpWebRequest]::Create($RemoteFile)        $FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)         $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile         $FTPRequest.UseBinary = $true        $FTPRequest.KeepAlive = $false        # 发送一个ftp请求        $FTPResponse = $FTPRequest.GetResponse()         # 从服务器响应中获取一个下载流        $ResponseStream = $FTPResponse.GetResponseStream()         # 在本地系统上创建一个目标文件和一个下载缓冲区        $LocalFileFile = New-Object IO.FileStream ($LocalFile,[IO.FileMode]::Create)         [byte[]]$ReadBuffer = New-Object byte[] 1024         if($ResponseStream -eq $null){            return        }        #循环执行下载        do {             $ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)             $LocalFileFile.Write($ReadBuffer,0,$ReadLength)           }         while ($ReadLength -ne 0)    }    catch    {        REM("Exception Msg: $_")    }}

基本就完成了,真实可用的模块哦,其实我是参考的外国大牛:Michal Gajda的PowerShell FTP Client Module的程序改的,有兴趣的同学可以看看,
链接是:https://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb

0 0
原创粉丝点击