# 自動化サンプル2 : powershell + ssh
# タスクの設定: プログラム/スクリプト
# %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
# 引数の追加(オプション)
# -ExecutionPolicy RemoteSigned -File c:\tmp\test_task2.ps1
# コマンドパスに空白がある場合は先頭に & をつける &"パ ス"
## 設定 ssh
$remote_user="ユーザー名"
$remote_host="ホスト名"
## mysql
$mysql_user="DBユーザー名"
$mysql_pass="DBパスワード"
$mysql_server_hostname="127.0.0.1" # 同一サーバーなら通常 127.0.0.1、違う場合はDBのホスト名
$mysql_server_port="3306" # 通常 3306
$mysql_local_port="3307" # ローカル 任意のポート番号
$mysql_exe="C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe"
$mysqladmin_exe="C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqladmin.exe"
# コマンド引数へ渡すとき 1次元変数は 1個で処理されてしまうので配列にいれる
$mysql_common_args_array=@("-P","$mysql_local_port")
if ($mysql_user -ne "") { $mysql_common_args_array += @("-u", "$mysql_user") }
if ($mysql_pass -ne "") { $mysql_common_args_array += @("-p", "$mysql_pass") }
## my_cmd
$mysql_test_sql="`"INSERT INTO table_date VALUES(CURRENT_TIMESTAMP);`""
$my_cmd="$mysql_exe"
$my_cmd_args="-s $mysql_common_args_array -D test -e $mysql_test_sql"
# [String]::Join(" ",$mysql_common_args_array) をしなくても勝手に連結されるみたい
$ssh="ssh"
$ssh_args="-L ${mysql_local_port}:${mysql_server_hostname}:${mysql_server_port} ${remote_user}@${remote_host} -N"
try {
# プロセスを実行+未待機
$process = Start-Process "$ssh" -ArgumentList "$ssh_args" -PassThru
# [Console]::WriteLine("{0}", "$ssh $ssh_args")
# powershellのsshは遅い
# 指定秒数待機する
timeout 8
$connected=$FALSE
# 接続できているか確認する(2秒x10回試行する)
for ($i=0; $i -lt 10; $i++) {
&"$mysqladmin_exe" ping $mysql_common_args_array
if ($?) {
$connected=$TRUE
break
}
timeout 2
}
# 接続できていればコマンドを実行する
if ($connected) {
# プロセスを実行+待機
## ここで何かする
Start-Process "$my_cmd" -ArgumentList "$my_cmd_args" -Wait
}
} finally {
# 起動したSSHを強制的にシャットダウン
if ($process.SI -ne $NULL -Or $process.ProcessName -ne $NULL) {
[Console]::WriteLine("Stop {0}", $process.ProcessName)
Stop-Process -InputObject $process
}
# 保護しているが万が一残ってしまって
# 生き残りをすべて抹消するには手動で以下のコマンド
# Stop-Process -name SSH
}
##
# テスト用のテーブルを作成
# CREATE TABLE table_date (`create_at` datetime NOT NULL);
##
# テスト用のテーブルを表示
# SELECT * FROM table_date;
##
# テスト用のテーブルをクリア
# DELETE FROM table_date;
##
|