こんにちはますのです。
社内SEをやっていると、ユーザには画面非表示で実行させたい処理とかよくありますよね。
いきなり黒い画面が表示されたら、そりゃユーザもびっくりですよ。問い合わせ待ったなしです。それを抑えるための周知なんてめんどくさいのです。どうせ見てないでしょうし。
ということで、みんなが幸せになれる方法は無いかと模索したのです。
目次
事例:PowerShellで作ったスクリプトを全ユーザに配布したい
事の発端から経緯でいうとこの流れでした。
- プログラムアンインストールのプログラムをベンダーに依頼
- PowerShellで記載されたものが提供される
- PowerShellってオプション指定しないと実行できないじゃん!頑張る!
- batファイル噛まして実行可能だが、サイレントで実行できないじゃん!頑張る!
- VBS経由でやればサイレント実行できるようになるで!
PowerShellでサイレント実行出来るようなコマンドあればよかったのにと…。
調べても調べても「VBSなら出来るで!」っていう内容しか出てこなかったのです。もし出来る方法知ってる人いたら教えてほしいと切に願っております。
調べても調べても「VBSなら出来るで!」っていう内容しか出てこなかったのです。もし出来る方法知ってる人いたら教えてほしいと切に願っております。
はい。わたしの知識ではこの方法でやることが最短ルートであると悟りました。
VBSを実行してVBS経由でPowerShellを実行する
サイレント実行をするVBSを作成する
今回はこちらのブログさんを参考に組み込んでいきました。
PowerShell スクリプトファイルを配布しろ!#3
元となるVBSはサイレント実行ではなく、PowerShellをVBSで実行する方法なので少々アレンジです。
フォルダ構成
c:\testにこんな感じで格納しています。
- c:\\test\test.vbs:ユーザが実行するファイル
- c:\test\Script\PS-test.ps1:実際に実行したいスクリプト
PS C:\Users\masno> dir -r c:\test
ディレクトリ: C:\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020/08/16 14:45 Script
-a---- 2020/08/16 14:44 0 test.vbs
ディレクトリ: C:\test\Script
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020/08/16 14:45 0 PS-test.ps1
VBSテンプレート
'====================================
' ps1の起動用スクリプト
'====================================
Option Explicit
'FSOオブジェクト、Shellオブジェクト
Dim objFSO
Dim objWshShell
'VBSパス、VBS格納フォルダ、PS1パス
Dim strVBSPath
Dim strVBSFolder
Dim strPS1Path
'オブジェクト参照
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
'VBSパス、VBS格納フォルダ、PS1パス
strVBSPath = Wscript.ScriptFullName
strVBSFolder = objFSO.GetFile(StrVBSPath).ParentFolder
strPS1Path = strVBSFolder & "\Script\PS-test.ps1"
'PS1起動オプション
Const OPT = "Powershell -ExecutionPolicy Unrestricted -NoExit "
'PS1起動
objWshShell.Run OPT & strPS1Path,0,false
'オブジェクト解放
Set objFSO = Nothing
Set objWshShell = Nothing
'終了
Wscript.Quit
参考サイトから変更した点
‘PS1起動オプション
Const OPT = “Powershell -ExecutionPolicy Unrestricted -NoExit ”
PowerShell起動時のオプションを変更しています。「Bypass」は全てにスクリプト対してブロックも警告もしない一番緩い条件となります。
一応は全許可はやめておこうかしらという感じで変更しました。Unrestricted:すべての構成ファイルを読み込み、すべてのスクリプトを実行します。インターネットからダウンロードされた署名されていないスクリプトを実行する場合、スクリプトを実行する前に確認を求められます。
一応は全許可はやめておこうかしらという感じで変更しました。Unrestricted:すべての構成ファイルを読み込み、すべてのスクリプトを実行します。インターネットからダウンロードされた署名されていないスクリプトを実行する場合、スクリプトを実行する前に確認を求められます。
PowerShell:ExecutionPolicyのオプション一覧
‘PS1起動
objWshShell.Run OPT & strPS1Path,0,false
objWshShell.Run OPT & strPS1Path,0,false
objWshShell.Runの書き方でウィンドウ表示有無がありましたので追加しました。
ただこのオプション無視されるケースもあるみたいで注意が必要な様子。3,000台に展開しましたが特段問題無かったので検証でうまくいけばまぁ大丈夫でしょう。【文法】
objWshShell.Run(“実行ファイル”,ウィンドウ表示有無,処理待ちの有無)
・ウィンドウ表示有無:「0」(表示させない)、「1」(表示させる)
・処理待ちの有無:「0」「False」(処理待ちをさせない)、「1」「True」(処理待ちをさせる)
ただこのオプション無視されるケースもあるみたいで注意が必要な様子。3,000台に展開しましたが特段問題無かったので検証でうまくいけばまぁ大丈夫でしょう。【文法】
objWshShell.Run(“実行ファイル”,ウィンドウ表示有無,処理待ちの有無)
・ウィンドウ表示有無:「0」(表示させない)、「1」(表示させる)
・処理待ちの有無:「0」「False」(処理待ちをさせない)、「1」「True」(処理待ちをさせる)
初めてVBSを使ってみたので、文法とか分けわからん状態でした。
変数の宣言やら何やら分からない状態で使っているのでもう少し勉強しようと思いました。
変数の宣言やら何やら分からない状態で使っているのでもう少し勉強しようと思いました。
何かしら使う機会がありそうなのでメモとして残しますが、PowerShell単体でサイレント実行出来るようなものがあれば、そっちを使っていきたいと思った次第です。