質問者
powershell内でのvbscript実行と処理結果について

質問
-
お世話になります。
powershell内で自作vbsを実行し、処理結果で判断する文を作りたいのですが、
実行時の記述方法から難儀しております。
ネットにあった以下の方法から調べておりますが、実行しても
「このオブジェクトにプロパティ 'Language' が見つかりません。プロパティが存在し、設定可能であることを確認してください。
発生場所 C:\powershell\test.ps1:7 文字:1+ $sc.Language = 'VBScript'」と出力されてしまいます。
-試したスクリプト---------------------------------------------------
$source = '
Function ShowMsg(ByVal msg)
MsgBox(msg)
End Function
'
$sc = New-Object -comObject MSScriptControl.ScriptControl
$sc.Language = 'VBScript'
$sc.AddCode($source)
$sc.CodeObject----------------------------------------------------------------
上記エラーの理由と、vbscrit実行時のpwoershell内での記述方法をお教えいただけないでしょうか。
よろしくお願いいたします。
すべての返信
-
doortodoor さま よろしく。
ご質問の趣旨から脱線しますが、 メッセージボックスを出すなら、単に以下のコードで OK です。
[System.Windows.Forms.MessageBox]::Show("We have message lines." , "Title")
この辺りは如何でしょうか?。
https://gallery.technet.microsoft.com/scriptcenter/Run-legacy-VBScripts-from-5c5e40da
- 編集済み ShiroYuki_Mot 2016年9月9日 0:39
-
チャブーンです。
実際にどのようなことをされたいのがわからないので微妙ですが、LazyDoggさんのコメントどおりMSScriptControl.ScriptControlはx86(32bit)でしか実行できません。したがって前提として"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"をまず実行し、したのコードを使うと最初の動作はするように思います。
$sc = New-Object -comObject MSScriptControl.ScriptControl $sc.Language = 'VBScript' $sc.ExecuteStatement('msg = "これはテストです。"') $sc.Eval('msgbox(msg)')
追記:元ネタは以下のコンテンツでしょうか?そういうことでしたら、単に32bit版PowerShell(C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe)を実行し、そのうえで指示通りにおこなえばちゃんと動作しますよ。
http://www.atmarkit.co.jp/fwin2k/win2ktips/992callwsh/callwsh.html
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
- 編集済み チャブーンMVP 2016年9月9日 2:20
- 回答の候補に設定 牟田口大介Moderator 2016年9月15日 0:43
-
チャブーンです。
ちょっとソースを修正してみました。あまり変わり映えはしませんが。
$source = ' Function ShowMsg(msg) MsgBox(msg) End Function ' $sc = New-Object -comObject MSScriptControl.ScriptControl $sc.Language = 'VBScript' $sc.AddCode($source) $sc.ExecuteStatement('msg = "これはテストです。"') $sc.Eval("ShowMsg(msg)")
ひとまずこれで、FunctionとしてのVBScriptは使用できそうですが、具体的にどんなことをされたいのか聞かないと、これ以上はよくわからない気もします。フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
- 回答の候補に設定 牟田口大介Moderator 2016年9月15日 0:43
-
32bitのPowerShellでしか実行できない部分だけを32bit版に任せるというアプローチもおすすめです。
これだと、逆に64bitでしか動かないコードと同一スクリプト内で共存可能です。
$ret = C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -Command { $source = ' Function ShowMsg(msg) ShowMsg = MsgBox(msg, 1) End Function ' $sc = New-Object -comObject MSScriptControl.ScriptControl $sc.Language = 'VBScript' $sc.AddCode($source) $sc.ExecuteStatement('msg = "これはテストです。"') $sc.Eval("ShowMsg(msg)") } if($ret -eq 1) { Write-Host "OKをクリックした" } elseif($ret -eq 2) { Write-Host "キャンセルをクリックした" }