🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

2回答

4630閲覧

Windows10のブラウザからPerlのCgi経由でVbscriptが起動できない。

AyanoTokuyama

総合スコア11

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2019/10/01 09:18

編集2019/10/01 09:23

前提・実現したいこと

Windows7で動いていた以下プログラムをWindows10上で動作させたいです。
どなたかお解りになる方、ご教示頂きたいです。よろしくお願いいたします。

IE11のグループウェアのプラグインで、PerlのCgiからVbscriptを実行して
Excelをダウンロードする。
(VbsからExcelVBAを呼び出し、パラメータCSVに罫線等加工して出力)

Perl5(変更なし)
Excel 97 ⇒ Excel 2019
IE11(変更なし、但しブラウザは変更可能)

発生している問題・エラーメッセージ

Vbscriptが実行されず、待機中のまま応答が帰らない。

localhostの待機中...

該当のソースコード

Perl

1if ($#key_list > -1){ 2 &make_file; ←ここでcsvファイルを作成して出力しているが、問題なく出力される。 3 &download_x; 4} 5 6sub download_x { 7 system("XXX.vbs $tempname"); ←makeファイルで作成したcsvを$tempnameにパラメータとして渡す 8 my $filename = "$tempname.xls"; 9 print qq|Content-type: application/vnd.ms-excel\n|; 10 print qq|Content-Disposition: attachment; filename="$filename"\n\n|; 11 open FILE,"$filename"; 12 while(<FILE>){ 13 print; 14 } 15 close FILE; 16}

試したこと

######1.サブルーチン内の指定を変更。

Perl

1(変更前) 2sub download_x { 3 system("XXX.vbs $tempname"); 4 my $filename = "$tempname.xls"; 5 print "Content-Type: application/download\n"; 6 print "Content-Disposition: attachment; filename=\"$filename\"\n\n"; 7 open (FILE, "< $filename"); 8 binmode FILE; 9 binmode STDOUT; 10 print while (<FILE>); 11 close(FILE); 12}

######2.vbsの内容を単純なものに修正。

Vbscript

1#XXX.vbsの内容 2MsgBox "今日の昼食は外食でもいいですか?"

######3.vbsの呼び出し文を修正。

perl

1system "XXX.vbs"; 2exec "XXX.vbs"; 3'XXX.vbs';

######4.IE11の設定を追加

  • 信頼済みサイトに追加
  • 互換表示設定の追加

######5.ドキュメントモードの追加

<meta http-equiv="X-UA-Compatible" content="IE=11">

補足情報(FW/ツールのバージョンなど)

特になし。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/01 14:54

構成が少々不確かなのですが、CGIと言うことは以前に動いていたと言うWindows 7環境では、例えばWindows 7上のIISでPerl5 のCGIが動き、同じマシン上のVBSのプログラムを動かし、同じマシン上のExcel97を動かしていた、ということでしょうか?(一台で完結していますか?) あるいは別のサーバーマシン上で動いていて、クライアントPCがWindows7+Excel97+IE11、と言う意味でしょうか。IE11のグループウェアのプラグイン、と言うのはいわゆるActiveXではありませんか? Windows 7 ではぎりぎり動いていたとか。(Excel97時代のグループウェアなら有り得るっぽい)
AyanoTokuyama

2019/10/02 01:33

Win7上のApacheで一台完結で問題なく動くことを確認しています。 cgi、vbs、Excel97ファイルともに同フォルダ内に存在しています。 グループウェア自体がApacheTomcatなので、上記の構成のようです。
dodox86

2019/10/02 01:40

apacheはWindowsサービスで動作させていますか。単なるアプリとして動作させる場合と、Windowsサービスとして常駐させる形態のいずれかがあるはずです。
dodox86

2019/10/02 01:46

harrekさんの回答の検証を先に済ませると、良いと思います。
AyanoTokuyama

2019/10/02 07:08

起動時にサービスを自動起動するような設定になっていると思います。 harrekさんの検証で、一歩前進はしました。 後は、当初の質問とは異なりますが、csvの内容をExcelとして出力する部分がまだうまく動作してくれません。
Zuishin

2019/10/02 09:58 編集

補修に時間がかかりそうなら、このレガシーなシステムのメンテナンスをやめて ClosedXML を使って作り直した方が良さそうな気がします。IE はこれから本格的に動かなくなりますよ。それもある日突然に。もうこれを使うなという周知は終わってますから、何があろうと自己責任になります。 https://www.google.com/amp/s/m.huffingtonpost.jp/amp/2019/02/10/microsoft-ie-stop_a_23665793/ これは最終警告と受け取ることができます。
AyanoTokuyama

2019/10/02 23:58

ありがとうございます。 来年度予算をとってリプレイス予定なのですが、その前にWin7終焉対応に追われている次第です。 リンクして頂いた記事改めて熟読したいと思います。 ClosedXMLも検討したいと思います。
Zuishin

2019/10/03 00:22 編集

https://pc.watch.impress.co.jp/docs/news/1210529.html Windows7 は 2023 年まで猶予があります。二度手間のような気がしますが、誰もそれを指摘できる人がいないなら仕方ありませんね。IE はとっくに終わってるわけですけど。
AyanoTokuyama

2019/10/03 00:48

有償である上、本件とは話がずれるので もうしばらく粘ってみます。 何か標題に関連する知見をお持ちでしたら、ご教示願います。
Zuishin

2019/10/03 05:10

これじゃないかなというのはありますが、サポートする意味を見いだせないのでパスします。
AyanoTokuyama

2019/10/03 06:54

そうですか。わかりました。 時間や予算等の制約の中での作業を行っております故、ある程度はご理解ください。 何の報酬も提供できませんので、ここまでありがとうございました。
Zuishin

2019/10/03 06:56

理解も何も、私にとってはどうでもいいことで、単なる親切心からの提案です。なんだかこの頃業者扱いする人が増えてきましたね。
guest

回答2

0

ベストアンサー

色々疑わしいところがありますので回答しますが、これで解決できるとは限らないので、参考程度のものです。

こちらで Windows 10 + apache24 + perl5 + VBスクリプト(*.vba)でCGIを試したところでは、VBスクリプトは動きました。もちろん質問者さんと環境の細かい部分で色々違うでしょうが、「VBスクリプトが動かない」のではなく、「VBスクリプトは動いているんだけど、所定の結果を出力できていない」のではないかと考えています。

試されたことで、「2.vbsの内容を単純なものに修正。MsgBox "今日の昼食は外食でもいいですか?"」がありましたが、Windowsサービス下で動作しているapacheのCGIですと、普通はデスクトップ画面が使えません。ですので、メッセージボックスが出るものの受け取れない入力を待ったままになっていたのではないでしょうか。(つまり、VBスクリプト自体は動作している)

VBスクリプトの実行はperl5スクリプト中でsystem("XXX.vbs $tempname");としているので、もしこのXXX.vbsの中でエラーが起きてエラーのメッセージがポップアップしていたとしたら、そこで停まります。apacheでCGIの実行にタイムアウトを設けていなかった場合は「Vbscriptが実行されず、待機中のまま応答が帰らない。」状態に見えるはずです。

まず、VBスクリプト自体は確実に実行されているか再度確認してください。例えば以下のような、確実にファイルを出力するだけのもので。
これで、とにかくVBスクリプトのエンジンは動作しているか否かはっきりするはずです。

VBScript

1Option Explicit 2 3Dim fs 4Set fs = WScript.CreateObject("Scripting.FileSystemObject") 5 6' 絶対に保存できるディレクトリを指定すること 7Dim file 8Set file = fs.OpenTextFile("C:\TEMP\OUT.txt", 8, True) 9file.WriteLine("TEST: " & Time) 10

ファイルが出力されていない、つまりVBスクリプトが実行されていないのであれば、*.vbs ファイルが拡張子で関連付けされていない可能性があります。
本来assoc コマンドや ftypeコマンドで確認できますが、コマンドプロンプト上で実行してもapache+CGI実行時の環境とは違うので、やや不安です。
(Windowsサービスのアカウントで動作しているはず)

*.vbsファイルをダブルクリックしたときは、関連付けによりWScript.exe と言うWindows Scripting Hostエンジンが使われます。これだともしVBスクリプトの中でエラーが起きると、エラーメッセージがポップアップしてしまいます。CGIからでは問題あるはずで、そんな場合はコマンドライン版の CScript.exe を代わりに使用します。これを使えばエラーが起きてもポップアップせず、標準出力に出ます。

C:\Windows\System32\CScript.exeがそれです。"/B"オプションを指定してください。実行したいVBスクリプトファイルが C:\apache\cgi-bin\hoge.vbs なら、
コマンドプロンプト上での指定は以下のようになるので、

CMD

1C> C:\Windows\System32\CScript.exe C:\apache\cgi-bin\hoge.vbs

CGIのPerl5コードの呼び出し部分は以下のようになるでしょう。

Perl5

1system('C:\Windows\System32\CScript.exe /B C:\apache\cgi-bin\hoge.vbs'); 2exit 0;

これでとにもかくにもVBスクリプトが実行されたら、Excel2019を操作するVBスクリプトに差し替えて試してください。なんかここでエラーが起きる気がします。
ExcelはじめOffice製品はクライアント製品であり、ユーザーアカウントごとのフォルダーやファイル、プロファイルが必要になることがあると思います。
Windowsサービスで動作しているときのapache2は通常のユーザーではないので、Officeに関連するプロファイル情報を持っていないかもしれません。ここでエラーが起きているのであるとすると、既存のWindows 7ではOKで、新しく導入したWindows 10 + Excel2019ではNG、と言う事象に合致します。

が、それはこの回答とはまた別に解決する問題になりますので、述べません。(私が解決し得る分野の問題かも分かりません)

あと、CGI実行時のエラーは逐一、apache2のエラーログに出力されます。それらを確認すると大きなヒントになるはずです。WindowsサービスのアカウントでCGIを実行しないよう、CGI用に別のユーザーアカウントの指定などがされているかもしれないので、その辺の差異も注意してみてください。

投稿2019/10/04 09:19

編集2019/10/04 09:34
dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AyanoTokuyama

2019/10/04 09:27

dodox86さん、すみません、丁寧かつ分かりやすすぎる説明ありがとうございます。 涙出そうですが、とりあえず試します。 また結果報告させて頂きます。
dodox86

2019/10/04 09:41

回答中の CScript.exeのPATHが間違っていたので、回答の正確さを期すために修正しました。ご注意ください。尚、当方が勝手にやっているので、結果のご報告は特に急ぎません。(まぁ、当たり前ですけど) メモ: CScript.exe のPATHは、以下。 %SystemRoot%\System32\CScript.exe (環境変数) C:\Windows\System32\CScript.exe C>ftype | findstr "VB" VBEFile="%SystemRoot%\System32\WScript.exe" "%1" %* VBSFile="%SystemRoot%\System32\WScript.exe" "%1" %*
AyanoTokuyama

2019/10/04 10:14 編集

配慮までいただき、本当にありがとうございます。 教えていただいた内容で、OUT.txtファイルは出力されるものの エラーログに [End of script output before headers]が出力されしまいます。 指定コード: system("C:\Windows\System32\cscript.exe /B C:\httpd\Apache24\htdocs\xxx.vbs"); exit 0; また、無知ですみませんが出力したcsvをさらにパラメータとしてさらに引き渡すことは可能なのでしょうか。 system("C:\Windows\System32\cscript.exe /B XX.vbs [csv名指定?]")
dodox86

2019/10/04 10:18

VBスクリプトは動いてそうですね。 > End of script output before headersが出力されしまいます。 これはHTTPレスポンスを返すにあたってCGIに不備があることを示している程度のことですので、重大な問題ではありません。 CGIスクリプトで、 print("Content-Type: text/plain\r\n\r\n"); system(なんちゃら) print("done"); とすると、ブラウザに"done"と表示されませんでしょうか。 > system("C:\Windows\System32\cscript.exe /B XX.vbs [csv名指定?]" でいけると思います。コマンドプロンプト上でそう指定して実行して動くなら、それでOKです。
dodox86

2019/10/04 10:34 編集

system(なんちゃら) の末尾にセミコロン抜けてました。適当に直してください。 print("Content-Type: text/plain\r\n\r\n"); print("TEST!\n"); print("...done.\n"); exit 0; などとすれば、 TEST! ...done. とブラウザにプレーンテキストで表示されるわけです。CGIのメリットで、この出力をうまく使えばVBスクリプトの実行結果もブラウザで確認できます。
AyanoTokuyama

2019/10/07 08:53

ありがとうございます。 scriptは呼べたみたいです。ExcelのOpenで失敗しているというところまではわかりましたが本件とはそれてしまうのでいったんBAつけさせていただきます。
dodox86

2019/10/07 09:11 編集

その後が気になっていましたが、進んでよかったです。 > ExcelのOpenで失敗している やはりそこらあたりで問題が出ましたか。VBスクリプトの改修で案外すぐ改修できるのかもしれないし、どうしてもWindowsサービス下/CGI内で対処できないような場合は、一般ユーザーで動作する常駐プログラムと通信してそちらに処理を依頼するような方法もあるので、解決できない問題ではないと思います。たぶん。
AyanoTokuyama

2019/10/07 09:21

ご心配おかけしました。 スクリプトとは本日半日にらめっこしましたが、ダメでした。 画面の内容がcgiに出力されて、vbaで罫線加工しているものは適応されているので後はcsvへの加工にスライドさせるだけなのですが、費やした時間を考えると残念でなりません。
guest

0

  • Webサーバーのログにエラーが出ていないかを見てみる
  • system文の中のvbsファイルをフルパスで指定してみる
  • download_x関数を以下のようにしてみてテストページが表示されるか確認する。

perl

1sub download_x { 2 print qq|Content-type: text/plain\n\ntest.|; 3}

あたりが思いつきますがどうでしょうか。

投稿2019/10/01 16:59

harrek

総合スコア123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AyanoTokuyama

2019/10/02 01:34

ありがとうございます。 試してみて、また投稿します。
AyanoTokuyama

2019/10/02 06:44 編集

1.Webサーバのログ⇒エラーなし。ステータス200番台 2.system分フルパス⇒ダウンロードが開始できるようになりました!ありがとうございます。 ですが、system行のcsv名のパラメータがうまく引き渡らないのか 画面に表示されている内容がExcelとして出力されてしまいます。 形式も異なるようで、Excel起動時Excel形式ではないとエラーが表示され、cssの読み込みの選択画面が表示されてしまいます。 3.download_xを修正したら、画面に表示されるhtmlのソースコードが表示されます。
AyanoTokuyama

2019/10/02 09:36

勘違いがあり、2はvbsを経由せずにダウンロードが実行されたことにより 画面の内容がExcelに出力された様子でした。 やはり、vbsは実行できていないようです。
dodox86

2019/10/03 00:58

横からすみません。 > やはり、vbsは実行できていないようです。 > 1.Webサーバのログ⇒エラーなし。ステータス200番台 ですが、apacheのアクセスログではなく、エラーログには何か報告はありませんか。 また、VBScriptの実行したはずの頃に、Windowsのイベントログに何か報告が出ていたりしませんか。 Windowsサービスの中で、*.VBSに関連付けて起動できたっけか?と疑問に思いました。 Windows 7のときは動作したということで、そのときは起動できたのでしょう。 cscript.exe VBScriptファイル名 のように指定するとどうですか。(cscript.exeの使い方は別途調べてください) CGIと言うことは標準入出力をソケットに繋ぎ変えるサーバーの処理があります。 apacheのバージョンが古く、Windowsサービスの処理部分にWindows 10では対応しきれていないかも、などの懸念もあります。
AyanoTokuyama

2019/10/03 01:54

失礼いたしました。 エラーログ確認しましたが、エラーをはいているもののバイナリ?のようなコードの羅列で解読できませんでした。 [cgi:error] [pid 6000:tid 1068] [client ::1:50309] AH01215: '[vbsフルパス指定].vbs' \x82\xcd\x81A\x93\xe0\x95\x94\x83R\x83}\x83\x93\x83h\x82\xdc\x82\xbd\x82\xcd\x8aO\x95\x94\x83R\x83}\x83\x93\x83h\x81A\r: [フルパス].cgi, referer: http://localhost/[cgiファイル].cgi systemでの呼び出しをcscriptにしてみましたが変わらずです。 指定方法自体が誤ってますか?
dodox86

2019/10/03 02:17 編集

"\x82\xcd\x81A\x93\xe0\x95\x94\x83R\x83}\x83\x93\x83h\x82\xdc\x82\xbd\x82\xcd\x8aO\x95\x94\x83R\x83}\x83\x93\x83h\x81A\r" の部分はシフトJISの文字列をエスケープしたもののようです。これは、以下のようにデコードできます。(最後の改行\rを除く) "[cgi:error] [pid 6000:tid 1068] [client ::1:50309] AH01215: '[vbsフルパス指定].vbs' "は、内部コマンドまたは外部コマンド、: [フルパス].cgi, referer: http://localhost/[cgiファイル].cgi" vbsファイル自体をコマンド(≒実行ファイル)と勘違いしているように見えるエラー内容です。 > systemでの呼び出しをcscriptにしてみましたが変わらずです。 > 指定方法自体が誤ってますか? 具体的に、どう指定しましたか? Perl5 のsystem関数に適合した形にしないとダメです。「cscript.exeを使ってみてください」と書いた意図は、「*.vbs」でいきなり起動しても、拡張子vbsが関連付けされていないと起動しないはずだから、Windows Scripting Hostのコマンドライン版であるcscript.exe を使って明示的にVBScriptファイル名を指定して起動してみよう。」です。
AyanoTokuyama

2019/10/03 04:41

エラーの文字化けの内容、こちらでも確認しました。丁寧にありがとうございます。 >具体的に、どう指定しましたか? system("cscript.exe [フルパス].vbs"); で実行した際のエラーが上記になります。 >vbsファイル自体をコマンド(≒実行ファイル)と勘違いしているように見えるエラー内容です。 勘違いを解消するすべが思い浮かびません。 3.に記入した、いくつか記述方法を試しましたが、InternalserverErrorとなり解消できません。
harrek

2019/10/03 21:48

* コマンドラインからvbsを起動して正しく実行されるでしょうか? * vbsのフルパスにエスケープが必要な文字(スペースや\など)は含まれていませんか?
AyanoTokuyama

2019/10/04 01:58

ありがとうございます。 >* コマンドラインからvbsを起動して正しく実行されるでしょうか? コマンドラインからは問題なく実行可能です。 >* vbsのフルパスにエスケープが必要な文字(スペースや\など)は含まれていませんか? ⇒¥は\にしましたが、だめでした。 スクリプトの問題というよりはIE⇒cgi⇒vbs実行の問題と解釈しています。 いろいろ助言頂きありがとうございます。 IE11の設定も見直してみていますが、改善できない状況です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問