PowerShell上传文件到ftp将上传文件两次

时间:2014-04-16 17:00:54

标签: powershell ftp sftp

更新:

$ftprespsonse = [System.Net.FtpWebResponse]$ftp.GetResponse()

在以下代码中创建一个空文件(具有相同名称但大小为0的文件),这会导致我原始问题的重复。我的问题是为什么GetRepsonse创建该空文件?我现在的猜测是[System.Net.FtpWebRequest] :: Create和GetResponse会弄乱东西。

$username="user"
$password="pw"
$ftp = [System.Net.FtpWebRequest]::Create("ftp://xxx.xxx.xxx:{port}/file.txt")
$ftp = [System.Net.FtpWebRequest]$ftp
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.Credentials = new-object System.Net.NetworkCredential($username,$password)
$ftp.UseBinary = $true
$ftp.UsePassive = $true
$ftp.EnableSsl = $true
$ftp.KeepAlive = $false
$ftprespsonse = [System.Net.FtpWebResponse]$ftp.GetResponse()
$content = [System.IO.File]::ReadAllBytes("c:\file.txt")
$ftp.ContentLength = $content.Length
try
{
    $rs = $ftp.GetRequestStream()
    $rs.Write($content, 0, $content.Length)
    'File Uploaded.'
    Write-Host 'Status code: ' + $ftprespsonse.StatusCode
    Write-Host 'Status descriptionL: ' + $ftprespsonse.StatusDescription
    $ftprespsonse.close()
    $ftp.Abort()
    $rs.Close()
    $rs.Dispose()
}
catch [System.Exception]
{
    'Upload failed.'
    $ftprespsonse = [System.Net.FtpWebResponse]$ftp.GetResponse()
    Write-Host 'Status code: ' + $ftprespsonse.StatusCode
    Write-Host 'Status descriptionL: ' + $ftprespsonse.StatusDescription
    $ftprespsonse.close()
    $ftp.Abort()
}

通过运行此脚本,我可以看到以下输出:

File Uploaded.
Status code:  + ClosingData
Status descriptionL:  + 226- Transfer complete - acknowledgment message is pending.
226- Transfer complete - acknowledgment message is pending.
226 Transfer complete (Batch Number = 30009).

转到远程文件夹,我可以看到创建了两个文件,文件名相同,但其中一个文件大小为0,另一个文件大小为570kb(这是正确的)。

知道发生了什么事吗?

2 个答案:

答案 0 :(得分:1)

使用Powershell FTP模块(http://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb),您将回避必须实施自己的FTP客户端,并可能避免您的好奇问题。

答案 1 :(得分:0)

结果是

的顺序
$ftp = [System.Net.FtpWebRequest]::Create($fileRemotePath)

和     $ ftprespsonse = [System.Net.FtpWebResponse] $ ftp.GetResponse()

和     $ rs = $ ftp.GetRequestStream()

弄乱了东西。通过逐行运行代码,我发现在$ ftp.GetResponse()的第一次出现时创建了空文件,之后,在$ ftp.GetRequestStream()

行创建了完整文件。

因此,我会将第一个GetResponse()移到GetRequestStream()之后