バッチからPowerShellの呼び出し方
powershell (コマンドまたはps1ファイル)
で実行できます。
が、PowerShellの実行ポリシー設定を有効化しないと呼び出せないので以下の書き方になりました。
powershell -ExecutionPolicy RemoteSigned (ps1ファイルを指定)
(2017/3/10変更)1行での書き方教えていただきました!
おしまい
ここから先は、どういうことをしようとしてバッチにスクリプトを埋めたか
試行錯誤したことを書いてみました。
PowerShellを呼び出そうと思った理由
バッチでPowerShellスクリプトを呼び出そうと思った経緯は、どっちかの実装だけでは
できないなにかをしたかったからです。
$ なにか = "アプリケーションのリモートインストールとエラー通知"
なにかをしようとバッチを書いた結果
アプリケーションをリモートからインストールをしようとして
最初に書いたバッチがこんな感じでした。
SET APP_NAME=(アプリのフォルダ名)
rem インストールフォルダのマウント
net use W: /delete
net use W: (フォルダパス)
rem インストールフォルダの移動
cd /d W:\%APP_NAME%
rem インストールの実行
(インストールを実行するコマンド記載)
rem インストールフォルダのアンマウント
net use W: /delete
exit
インストールはできるが、インストールの失敗に気が付けず色々困りました。
と、いうことで成功/失敗メール通知の機能追加を検討しました。
バッチでメール通知を実装
バッチではメール通知機能実装ができないことだけは把握できました。
cscript うにゃにゃっ
ていう内容ばかり
うにゃうにゃ
の中身はVBだったり、JavaScriptだったり人それぞれでした。
PowerShell・・・
PowerShellですべて書き直す?
MaLiとある資産管理ツールを通してリモートインストールする想定でしたが
そのツールがps1ファイルを呼び出してくれず諦めました。
メール通知部分だけPowerShellで実装
送信メールはこんな感じで、成功用と失敗用の両方用意しました。
# メールの設定内容
$EmailFrom = (送信元)
$EmailTo = (送信先)
$PCName = hostname
$Subject = (メールの件名)
$SMTPServer = (SMTPサーバー)
$Port = "25"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer,$Port)
$SMTPClient.EnableSsl = $false
# メールの本文
[string]$body = @()
$body += "成功しました。`n`n"
$body += ""
# メールの送信
Send-MailMessage -To $EmailTo -From $EmailFrom -SmtpServer $SMTPServer -Subject $Subject -Body $body -Encoding UTF8
なにかをしようとしてバッチを書き直した結果
SET APP_NAME=(アプリのフォルダ名)
rem インストールフォルダのマウント
net use W: /delete
net use W: (フォルダパス)
rem インストールフォルダの移動
cd /d W:\%APP_NAME%
rem インストールの実行
(インストールを実行するコマンド記載)
@if ERRORLEVEL 1 goto NG
@if ERRORLEVEL 0 goto OK
:NG
rem インストール失敗通知
powershell -ExecutionPolicy RemoteSigned W:\SendMailError.ps1
rem インストールフォルダのアンマウント
net use W: /delete
rem バッチファイルの削除
cd /d %~dp0
del /f "%~dp0%~nx0"
goto end
:OK
rem インストール成功通知
powershell -ExecutionPolicy RemoteSigned W:\SendMailSuccess.ps1
rem インストールフォルダのアンマウント
net use W: /delete
rem バッチファイルの削除
cd /d %~dp0
del /f "%~dp0%~nx0"
goto end
end:
rem 終了
exit
エラー処理はもちろん、バッチの自殺コマンドも一緒に追加。
もっとより良い実装の仕方はあるかもですが、なにかが実現できたので一旦はよしとしました。
これを機に散らかっているバッチ達をPowerShellに移植しようと思いましたが、
めんどくさいハードル高いのでバッチにPowerShell埋め込んで少しずつ浸食させます。
参考文献