FTPサーバーからテキストデータを取得するという作業があります。
以前はコマンドプロンプトのバッチファイルで行っておりました。
以下の欠点がありました。
##コマンドプロンプトのFTP送信の欠点
- 相対パスでは動かずフォルダを動かすだけで動かなくなる
- ソースが非常に読みにくい
ナウでヤングなWindowsユーザーであれば、
コマンドプロンプトは窓から投げ捨ててPowerShellを使うべきでしょう。
##PowershellでFTP
Powershellで作ってみました。
スクリプトファイルのパスを取得するようになっているので、
どの場所に置いても動き出します。
FTPでデータを取得
$user ='username'
$password = 'password'
$url = 'ftp://serveripaddress'
# WebClientを生成
# FTP設定
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential($user,$password)
$wc.BaseAddress = $url
# スクリプトファイルのパスを取得
$mypath=Split-Path ( & { $myInvocation.ScriptName } ) -parent
# ファイルをダウンロード
## %2f を付けると / (root) からのデータ取得になる。
## .DownloadFile(ダウンロード元ファイル名,ダウンロード先ファイル名)
$wc.DownloadFile("%2f/tmp/filename",$mypath+"\filename.txt")
# 終了
$wc.Dispose()
WindowsXPを管理する時代が長かったので、
System.Net.WebClientを直接呼び出しています。
PowerShell v3.0以降が動く環境であれば、
Invoke-WebRequestでもいいかもしれません。
###Invoke-WebRequestでFTP
Invoke-WebRequestでFTPからダウンロードも作ってみました。
Invoke-WebRequestはダウンロードはできてもアップロードはできませんので、あしからず。
- PowerShell v3.0 以降
InvokeWebRequestでFTP
$user ='username'
$password = 'password'
$url = 'ftp://serveripaddress'
# FTP認証 Nework.CredentialではなくPSCredentialを使用
$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($user,$str)
# スクリプトファイルのパスを取得
$mypath=Split-Path ( & { $myInvocation.ScriptName } ) -parent
# データのダウンロード
## %2f を付けると / (root) からのデータ取得になる。
Invoke-WebRequest -Uri $url"$2f/tmp/filename.txt" -OutFile $mypath"\filename.txt" -Credential $cred
##参考文献
相対パスと絶対パスのところを参照
FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする