更新:
$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(这是正确的)。
知道发生了什么事吗?
答案 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()之后