LoginSignup
4
9

More than 5 years have passed since last update.

バッチからPowerShellスクリプトを呼び出したい

Last updated at Posted at 2017-03-10

バッチからPowerShellの呼び出し方

powershell (コマンドまたはps1ファイル)で実行できます。
が、PowerShellの実行ポリシー設定を有効化しないと呼び出せないので以下の書き方になりました。

powershell -ExecutionPolicy RemoteSigned (ps1ファイルを指定)

(2017/3/10変更)1行での書き方教えていただきました!

おしまい

ここから先は、どういうことをしようとしてバッチにスクリプトを埋めたか
試行錯誤したことを書いてみました。

PowerShellを呼び出そうと思った理由

バッチでPowerShellスクリプトを呼び出そうと思った経緯は、どっちかの実装だけでは
できないなにかをしたかったからです。

$ なにか = "アプリケーションのリモートインストールとエラー通知"

なにかをしようとバッチを書いた結果

アプリケーションをリモートからインストールをしようとして
最初に書いたバッチがこんな感じでした。

AppInstall.bat
SET APP_NAME=(アプリのフォルダ名)

rem インストールフォルダのマウント
net use W: /delete
net use W: (フォルダパス)

rem インストールフォルダの移動
cd /d W:\%APP_NAME%

rem インストールの実行
(インストールを実行するコマンド記載)

rem インストールフォルダのアンマウント
net use W: /delete

exit

インストールはできるが、インストールの失敗に気が付けず色々困りました。
と、いうことで成功/失敗メール通知の機能追加を検討しました。

バッチでメール通知を実装

ぐぐってみた
image

バッチではメール通知機能実装ができないことだけは把握できました。
cscript うにゃにゃっていう内容ばかり
うにゃうにゃの中身はVBだったり、JavaScriptだったり人それぞれでした。

PowerShell・・・

PowerShellですべて書き直す?

MaLiとある資産管理ツールを通してリモートインストールする想定でしたが
そのツールがps1ファイルを呼び出してくれず諦めました。

メール通知部分だけPowerShellで実装

送信メールはこんな感じで、成功用と失敗用の両方用意しました。

SendMail.ps1
# メールの設定内容
$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

なにかをしようとしてバッチを書き直した結果

AppInstall2.bat
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埋め込んで少しずつ浸食させます。

参考文献

4
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
9