배치에서 PowerShell 스크립트를 호출하고 싶습니다.

배치에서 PowerShell을 호출하는 방법


powershell (コマンドまたはps1ファイル) 에서 실행할 수 있습니다.
하지만 PowerShell의 실행 정책 설정을 활성화하지 않으면 호출 할 수 없으므로 다음과 같이 작성되었습니다.
powershell -ExecutionPolicy RemoteSigned (ps1ファイルを指定)

(2017/3/10 변경) 한 줄로 쓰는 법 가르쳐 주셨습니다!

오시마

여기서부터는 무엇을 하려고 배치에 스크립트를 채웠는지
시행착오한 것을 써 보았습니다.

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

설치는 할 수 있지만 설치 실패를 깨닫지 못하고 여러가지 곤란했습니다.
라고 하는 것으로 성공/실패 메일 통지의 기능 추가를 검토했습니다.

일괄 처리로 이메일 알림 구현



빙글빙글 보았다


배치에서는 메일 통지 기능 구현을 할 수 없는 것만은 파악할 수 있었습니다.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 묻어 조금씩 침식시킵니다.

참고문헌

좋은 웹페이지 즐겨찾기