Excel VBAから引数を渡す.ps1スクリプトを呼び出してExcelマクロで全体の処理をハンドリングするための材料調査。
という事でそこそこ簡単に実現できそうだ。
調べた内容は次の二点。
やりたい事①:VBAからのPS1スクリプト呼び出し。
やりたい事②:PS1スクリプトで引数を受けるお作法
やりたい事①:VBAからのPS1スクリプト呼び出し。
↓こちらの方の関数が恐らく完成形。
https://pmp-style.hatenablog.com/entry/VBA_call_PowerShell
Function RunPowerShell(intWindowStyle As Long, bWaitOnReturn As Boolean, psFilePath As String, ParamArray args()) Dim cmdline As String cmdline = Chr(34) & "powershell" & Chr(34) & " -ExecutionPolicy RemoteSigned -File " & Chr(34) & psFilePath & Chr(34) Dim arg As Variant For Each arg In args cmdline = cmdline & " " & Chr(34) & arg & Chr(34) Next Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") Dim ret As Variant ret = objWSH.Run(cmdline, intWindowStyle, bWaitOnReturn) RunPowerShell = ret End Function
すばらしい。
呼び出しはこんな感じ。
RunPowerShell(0, True, "C:\example.ps1", "param1")
第一引数のintWindowStyleを1にするとウィンドウ表示(その他の値はリンク先参照)。
第二引数のbWaitOnReturnをFalseにすると非同期(ps1スクリプトの終了を待たない)Trueだと待つ。
第三引数は実行するファイルのフルパス。
第四引数以降は実行するスクリプトに与える引数を列挙。
という感じでVBAから.ps1が呼び出せる。
マジで素晴らしい。
【後日追記】・・・と思っていたが実際に使用してみるとうまく行かないケースがあったので別途記事執筆。
やりたい事②:PS1スクリプトで引数を受けるお作法
C:¥example.ps1 に次の2行だけ記述して保存。
Write-Host $Args[0] Write-Host $Args[1]
PS C:\> .\example.ps1 "abc" "def" abc def PS C:\>
という感じで、とりあえず使う事は可能。
といっても、名前のない$Args[x]ではなかなかスクリプトの中で値として使うのは気持ち悪い。
代入文を書いておいても良いが名前で宣言も可能な模様。
C:¥example.ps1 を次のように変更。
Param( [String]$StringParam, [Int]$IntParam ) Write-Host $StringParam Write-Host $IntParam
この場合の与え方と結果は次の通り。
PS C:\> .\example.ps1 -StringParam "abc" -IntParam 1 abc 1 PS C:\>
という事で大体仕組みは分かった。
これらを組み合わせればExcel VBAからパラメータ付きの.ps1スクリプトを呼び出して結果のファイルを使ってみたいな処理が実現できそうである。
0 件のコメント:
コメントを投稿