none
powershell内でのvbscript実行と処理結果について RRS feed

  • 質問

  • お世話になります。

    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内での記述方法をお教えいただけないでしょうか。

    よろしくお願いいたします。

    2016年9月8日 22:55

すべての返信

  • doortodoor さま よろしく。

    ご質問の趣旨から脱線しますが、 メッセージボックスを出すなら、単に以下のコードで OK です。

    [System.Windows.Forms.MessageBox]::Show("We have message lines." , "Title")

    この辺りは如何でしょうか?。

    https://gallery.technet.microsoft.com/scriptcenter/Run-legacy-VBScripts-from-5c5e40da



    2016年9月9日 0:21
  • 実行環境はどんな感じですか?
    ScriptControlはx64で使用できませんので。
    この場合は、New-Object でもエラーが出ているはずですけど・・・。

    あとは、以下を実行した時に Language プロパティは表示されますか?無いからエラーになっているはずですけど・・・。

    $sc = New-Object -comObject MSScriptControl.ScriptControl
    $sc | Get-Member

    2016年9月9日 0:41
  • チャブーンです。

    実際にどのようなことをされたいのがわからないので微妙ですが、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


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。



    2016年9月9日 2:01
  • チャブーンです。

    ちょっとソースを修正してみました。あまり変わり映えはしませんが。

    $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は使用できそうですが、具体的にどんなことをされたいのか聞かないと、これ以上はよくわからない気もします。

    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2016年9月9日 10:39
  • 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 "キャンセルをクリックした"
    }

    2016年9月9日 22:39
    モデレータ