適材適所

PowerShellやVBAなどプログラミング系の話多めで

【PowerShell】スクリプト内でFTPコマンドを使いたいよーってときに読む記事その1

スクリプト内でFTPコマンドを使いたいときは、ちょっと面倒。

いちいちテキストにコマンドを書き出さないといけない。

そんないちいち書き出すの面倒だけど、FTPコマンドをスクリプト内で使いたい!!

というとき用に関数を書き残しておきます。

なんで今時FTPコマンド?

枯れっ枯れの技術であるFTP。

外部とのやり取りには使いたくないですが、

組織内のネットワークではバリバリ現役です。

当初はPowerShellらしく、

System.Net.WebClientを使ってやろうと思ったんです!!

でも他のシステムからアップロードされたファイルをGetしようとしたときに

キャッシュの問題なのか、うまくGetできなかったんです。

色々調べたんですが回避できず。

というわけで仕方なしにFTPコマンドを使うことになりました。

(確かGetのときだったような・・・lsのときだったかな?前のことなのであやふや)

PowerShellのスクリプトの中でFTPコマンドを使ってGetする関数

 
function Invoke-FtpGet([string]$hostname,[string]$user,[string]$password,[string]$inputPath,[string]$outPath)
{
    $ftpCmd = "
        open $hostname
        $user
        $password
        get <<in>> <<out>>
        Quit"
    $ftpFilePath=New-TemporaryFile
    $ftpCmd.Replace('<<in>>',$inputPath).Replace('<<out>>',$outPath)|Out-File -Encoding default -FilePath  $ftpFilePath
    ftp -s:$ftpFilePath
    Remove-Item -Path $ftpFilePath
}

$ftpCmd変数の中にベタのFTPコマンドを用意して、

その内容をテキストファイルをテンポラリーファイルに書き出して、

それを読み込んでGetしてます。

それだけ。

改めて言葉に起こすと、めちゃめちゃ単純だな・・・

終わりに

本当はSystem.Net.WebClientを使いたかったんですがね。。。

小一時間ハマった結果、諦めましたよ。

これとは別にlsコマンド用の関数も作ったので

機会があればまた書きたいと思います。