Windows tips‎ > ‎Power Shell‎ > ‎

FTP自動化Power Shell版

.batで作ったやつ(http://www.ixam.net/windows-tips/batch-file/ftp-zi-dong-hua)のPowerShell版です。

肝はここの、ヒアストリング(シェルスクリプトなどで言うヒアドキュメントをPowerShellではヒアストリングと言うそうです。)のつかい方。

$FTP_Cmd_String=@"
open $IP_Address
$User_ID
$User_Password
lcd $Local_Path
$FTP_Transfer_Mode
cd $Remote_Path
$FTP_Action_String
bye
"@

あと、ここの「-encoding ASCII」ですかね。
echo $FTP_Cmd_String | Out-File -encoding ASCII -filepath Tmp_Ftp_Cmd.txt

どうもPowerShellで
echo hogehoge > hoge.txtなどとやると、Unicodeでテキストが生成されるようで、ftp -s:filenameで正しく解釈してもらえませんので、ASCIIを指定してやる必要があるようです。

・・・ちょっと不便ですね。

あとは、switchのつかい方が若干参考に成るかも。
switch ($FTP_Action_Flag)
{
"PUT" {$FTP_Action_String = "put $File_Name"}
"GET" {$FTP_Action_String = "get $File_Name"}
"VIEW" {$FTP_Action_String = "get $File_Name"}
default {echo '[error]FTP Action Flag Error. Parameter Is Not "PUT" or "GET" or "VIEW".'; exit}
}

[ftp_Capsule.ps1]

param($IP_Address, $User_ID, $User_Password, $FTP_Action_Flag, $Local_Path, $Remote_Path, $File_Name, $FTP_Transfer_Mode)

# Parameter Count
$Parameter_count = 0
if ($IP_Address -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
if ($User_ID -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
if ($User_Password -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
if ($FTP_Action_Flag -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
if ($Local_Path -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
if ($Remote_Path -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
if ($File_Name -ne $null)
{
$Parameter_count = $Parameter_count + 1
}
# Help
if ($Parameter_count -eq 0)
{
echo '[info]Parameter List : $IP_Address, $User_ID, $User_Password, $FTP_Action_Flag, $Local_Path, $Remote_Path, $File_Name, $FTP_Transfer_Mode'
echo '[info]$IP_Address = IP or Host Name'
echo '[info]$FTP_Action_Flag = PUT/GET/VIEW'
echo '[info]$FTP_Transfer_Mode = bin/ascii (Option:Default=bin)'
echo '[info]ex .\ftp_Capsule.ps1 192.168.1.1 userid password GET C:\ /etc hoge.txt bin'
exit
}
# error Can Not Read Mandatory Parameter
if ($Parameter_count -lt 7)
{
echo '[error]Can Not Read Mandatory Parameter : $IP_Address, $User_ID, $User_Password, $FTP_Action_Flag, $Local_Path, $Remote_Path, $File_Name'
exit
}

# Parameter Check Action Flag
$FTP_Action_String = ""
switch ($FTP_Action_Flag)
{
"PUT" {$FTP_Action_String = "put $File_Name"}
"GET" {$FTP_Action_String = "get $File_Name"}
"VIEW" {$FTP_Action_String = "get $File_Name"}
default {echo '[error]FTP Action Flag Error. Parameter Is Not "PUT" or "GET" or "VIEW".'; exit}
}
# Parameter Check Transfer Mode
switch ($FTP_Transfer_Mode)
{
"bin" {$FTP_Transfer_Mode = $FTP_Transfer_Mode}
"ascii" {$FTP_Transfer_Mode = $FTP_Transfer_Mode}
"" {$FTP_Transfer_Mode = "bin"; echo '[info]Default Transfer Mode is bin'}
default {echo '[error]FTP Transfer Mode Error. Parameter Is Not "bin" or "ascii" or "".'; exit}
}

# Out Put FTP Command File
$FTP_Cmd_String=@"
open $IP_Address
$User_ID
$User_Password
lcd $Local_Path
$FTP_Transfer_Mode
cd $Remote_Path
$FTP_Action_String
bye
"@
echo $FTP_Cmd_String | Out-File -encoding ASCII -filepath Tmp_Ftp_Cmd.txt

# FTP Action
echo '[info]Start FTP Procedure.'
ftp -s:Tmp_Ftp_Cmd.txt
del Tmp_Ftp_Cmd.txt

if ($FTP_Action_Flag -eq "VIEW")
{
cat $File_Name
del $File_Name
}

# End
echo '[info]Finish.'