使用PowerShell動態建立C#物件進行FTPS檔案上傳

使用PowerShell動態建立C#物件進行FTPS檔案上傳

早先在 PowerShell 以 Posh-SSH 模組開發了 SFTP 站台的檔案上傳腳本。需求又新增 FTPS 站台的檔案上傳支援。找了一下 PowerShell Gallery 比較多人使用的是 PSFTP 模組,測試了一下,發現大部分都是支援 FTP 與 SFTP,沒有直接支援 FTPS 的。沒有,那我們就直接在 PowerShell 裡刻一個吧。

C# 透過 FTPS 上傳檔案

我們找到一個官方的.NET FTP上傳檔案範例程式碼。我們查詢文件後得知,它是可以支援 FTPS 的(呼,放心了),進行一些組態與改寫讓它能支援 FTPS 協定:

public class FTPS
{
 public static string Upload(string ftpaddr, string filepath)
 {
  string ftppath = string.Format("ftp://{0}", ftpaddr);
  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftppath);
  request.Credentials = new NetworkCredential("username", "password");
  request.Method = WebRequestMethods.Ftp.UploadFile;
  // support FTPS
  request.EnableSsl = true;
  request.UseBinary = true;
  request.KeepAlive = true;
  request.UsePassive = true;
  byte[] fileContents;
  using (StreamReader sourceStream = new StreamReader(filepath))
  {
   fileContents = System.Text.Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
  }
  request.ContentLength = fileContents.Length;
  using (Stream requestStream = request.GetRequestStream())
  {
   requestStream.Write(fileContents, 0, fileContents.Length);
  }
  using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
  {
   string status = string.Format("Upload File Complete, status {0}", response.StatusDescription);
   return status;
  }
 }
}

測試過程發現有幾個地方要注意:

  • ftppath 是要含檔案名稱的完整路徑。
    • 例如:ftp://example.com/upload/testfile.zip,一開始測試只有傳 ftp://example.com/upload 結果回報說上傳有問題。
  • 不要含太新的 C# 語法。
    • 例如,一開始我很習慣用 $"Upload File Complete, status {response.StatusDescription}" 來進行字串輸出,結果就是得到一大串錯誤紅字。

PowerShell 大腸包 .NET Framework 小腸

流程會指定一個目錄,它會例出此目錄下所有 *.zip 檔案(多檔案上傳),然後我們在 PowerShell 裡用 Add-Type 動態建立的 .NET 物件([NetTool.FTPS]::Upload),之後就可以在 PowerShell 腳本中去呼叫來進行 FTPS 的上傳檔案作業。

人客呀!PowerShell + .NET Framework 這大腸包小腸會不會太香太強了點!

參考資料: https://blog.poychang.net/using-csharp-code-in-powershell-scripts/

因為我是寫 .NET 的,所以看 C# 程式碼會比較直接。還有一種直接 PowerShell 裡操作 .NET 物件的方式。
例如: https://gist.github.com/pbrumblay/6551936#file-ftpsupload-ps1 也可以學習參考看看。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。