★WSHでCGI★JScriptVBScript
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/08/01 22:37ID:???・Windows Script Host (=WSH)をCGI利用する
・JScript、又はVBScriptをCGIスクリプトとする
・自PCをサーバー稼動させる事を前提とする
・原則、Windows以外はフリーで入手できるアプリ、ツールの利用
【対象環境】
・Windows95以上及び、WSH5.6以上のインストール済み
・Webサーバーソフトにはフリー配布のAN HTTPDを前提とする
※作者:中田 昭雄氏 配布元:ttp://www.st.rim.or.jp/~nakata/
なお、このスレでの内容を直接、中田氏サイトへ質問するのはやめて頂きたい。
【お約束】
・試行は自PCで自己責任で行う
・商用実利用は前提としていない、本スレは、プログラム技術的知識、お遊び、趣味の範囲であることを理解する
0002nobodyさん
03/08/01 22:38ID:???(1)Windows Script Hostファイル;拡張子.wsf
※.wshもあるが、形式が古いので使用しない
(2)JScriptファイル;拡張子.js
(3)VBScriptファイル;拡張子.vbs
(2),(3)はブラウザ動作のクライアントサイドスクリプトでも使用することがあるので説明は省力する。
(1)はXMLタグ記述で動作指定が可能となる
例として単純な.wsfファイルを示す
<job>
<script language=vbs src="./test.vbs" />
<script language=jscript>
// JScriptの実際のコード
</script>
</job>
上記の例では実行された際、別ファイルのtest.vbsを読み込む事になる。.jsや.vbsファイルは単一のスクリプトモジュールだが、.wsfファイルではこれらをライブラリとしてインクルードできる。Perlのrequireと同等の機能である
もちろん(2),(3)は単体での実行も可能である。
0003nobodyさん
03/08/01 22:39ID:???1)メニューの【オプション】→【一般】を選択
『ドキュメントルート』には、公開するトップフォルダのパスを指定。
C:\やC:\WINDOWSなどを指定しては絶対にイケナイ!包含されるファイルフォルダは原則公開されてしまうからだ。httpd.exeと同じフォルダにでも専用フォルダを作るといいだろう。
また、この指定トップフォルダはブラウザからは”http://127.0.0.1/”のURLとなるのは言うまでもない。
2)【一般】タブにて『CGIを実行する』にチェックを確認。
拡張子.wsf,.js,.vbsをCGI実行ファイルとして追加で登録する、この3つのスクリプトファイルは同じWScript.exe(WSH本体)で実行されるので,(カンマ)で区切ってこのように1度に3つ登録する
なお、Win9x系ではWScript.exeのパスはC:\WINDOWS\WScript.exeである。
WScript.exeのインストールパスを正確に指定する。
とりあえず、動作確認のためにはCGIファイルを『一般パスでも実行する』にもチェックしておくこと。
0004nobodyさん
03/08/01 22:39ID:???CGI動作確認のために以下のVBScriptでの単純CGIスクリプトを示しておく。とりあえず、ファイル名test01.vbsで配置しておくものとする。
Option Explicit
Private ObjWshShell,ObjWshEnv,ColWshEnv
Set ObjWshShell=WScript.CreateObject("WScript.Shell")
Set ColWshEnv=ObjWshShell.Environment ("Process") 'プロセス環境変数コレクションの取得
With WScript.StdOut
.WriteLine "Content-type: text/html" & vbNewLine
.WriteLine "<HTML><HEAD><TITLE>テスト01</TITLE></HEAD>"
.WriteLine "<BODY>"
For Each ObjWshEnv in ColWshEnv
.WriteLine ObjWshEnv & "<BR>"
next
.WriteLine "</BODY></HTML>"
End With
ファイルが置けたら、実際にブラウザにURLを打ち込んでみよう。環境変数が一覧表示されるはずだ。例 http://127.0.0.1/test01.vbs
http://127.0.0.1/test01.vbs?test=12345 も試してみよう。
0005nobodyさん
03/08/01 22:40ID:???実際のCGI動作にはファイル操作も必要となる。、
Perlと違い、JScript,VBScriptは元々、ブラウザクライアントサイドスクリプトとして開発されているので、ファイル操作を含めOS動作やメモリアクセスに関わるような機能は単体には実装されていない。
ファイル操作にはActiveXコンポーネントを利用する。
MSとしてはスクリプトからでも利用できるFileSystemObject (=FSO)が用意されている。
・JScriptの場合
var fso = new ActiveXObject("Scripting.FileSystemObject");
・VBScriptの場合
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
※FSOはScrrun.dllが提供するランタイムライブラリのオブジェクトである。WSH5.6以上やVB6.0系のアプリをインストールした事があればインストールされているはず。
なお、FSOについてはCGI利用の際の現実の問題点は後々説明する。
0006nobodyさん
03/08/01 22:48ID:???WSH5.6は以下のURLでDL入手できる
ttp://www.microsoft.com/japan/developer/scripting/default.htm
WSH、FSO、JScript、VBScript等が1つになったリファレンスドキュメントも入手できる。
0007nobodyさん
03/08/01 23:00ID:Fe/gJesT無料画像でも十分ボッキもの!
一見の価値あり!!
http://www.pinkfriend.com/
0008nobodyさん
03/08/01 23:51ID:???本7の進入に関し、これを禁止します
0009山崎 渉
03/08/02 02:20ID:???( ^^ )< ぬるぽ(^^)
0010nobodyさん
03/08/02 05:22ID:???1必死だなw
0011nobodyさん
03/08/03 00:04ID:BzLT+GQpスクリプトがWSHで実行される時、WSHはその提供するオブジェクトモデルのルートオブジェクトであるWScrptオブジェクトを宣言、作成不要で提供する。
以下にCGIで利用する際で特に使用すると思われる、WScriptオブジェクト自体の機能の一部を示しておく。
《プロパティ》
StdIn;標準入力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
StdOut;標準出力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
《メソッド》
CreateObject;COMオブジェクト(dll、ActiveXコンポーネントなどが提供するオブジェクト)の作成、JSのnew ActiveXObject、VBSのCreateObjectでも代用可能
Quit;スクリプトを終了する ※特に明示的に終了させたい場合使う
Sleep;一定時間スクリプト実行を待機し再開する
0012nobodyさん
03/08/03 00:37ID:98pa6a9yhttp://homepage3.nifty.com/coco-nut/
0013nobodyさん
03/08/03 02:04ID:t0wVY8lW0015nobodyさん
03/08/03 15:16ID:???ちゃんねるだってことでw
0016nobodyさん
03/08/03 15:17ID:kjY1EbCv参照 >>11
標準入力ストリームにはWScript.StdInで参照できる
CGI動作中には、ブラウザからのPOSTメソッドで送信されたユーザーデータを取得することができる。
以下にCGIで特に使用するメンバーのみ示す。他はマニュアル参照。
《プロパティ》
AtEndOfLine;現在の読み出し位置が行末ならtrue。
AtEndOfStream;現在の読み出し位置が終端ならtrue ※MSのWSH5.6リファレンスにはミスで記載がない。
《メソッド》
ReadAll;全て読み出す
ReadLine;1行分のテキストを読み出す。※読み出したテキストには改行文字は含まない
※なお、ファイルストリームと違い明示的にCloseする必要はない。
0017nobodyさん
03/08/03 15:17ID:kjY1EbCv参照 >>11
標準出力ストリームにはWScript.StdOutで参照できる
クライアントブラウザへのレス、データの送信に使用するのは言うまでもない。
以下にCGIで特に使用するメンバーのみ示す。他はマニュアル参照。
《メソッド》
Write(strText);引数文字列strTextを書き出す。
WriteLine([strText]);引数文字列strTextを改行付きで(つまり1行として)書き出す。引数を省略した場合、空白行となる。
※なお、ファイルストリームと違い明示的にCloseする必要はない。
※改行文字はその実行環境に依存する。WindowsなのでCR+LFである。
・JScriptの場合;\r\n
・VBScriptの場合;vbCrLf、又はvbNewLine(考えないでいいのでお薦め)の組み込み定数を使用すると便利
0018nobodyさん
03/08/06 02:08ID:m1U3eQA/クライアントブラウザからのアクセスによるWebサーバーのCGI動作で設定されるプロセス環境変数を取得する
WSHのWshShellオブジェクトのEnvironmentプロパティの環境変数のコレクション(WshEnvironmentオブジェクト)から参照できる。
・JSの場合
var WshShell = WScript.CreateObject("WScript.Shell");
var ColWshEnv = WshShell.Environment("Process");
・VBSの場合
Set WshShell = WScript.CreateObject("WScript.Shell")
Set ColWshEnv = WshShell.Environment("Process")
※上記の例の変数ColWshEnvは環境変数コレクション(それがWshEnvironmentオブジェクト)を参照している点に注意。
例として環境変数名REMOTE_ADDR(アクセス者のIP)を参照するには
ColWshEnv("REMOTE_ADDR") 又は、ColWshEnv.item("REMOTE_ADDR")
0019nobodyさん
03/08/06 02:08ID:m1U3eQA/参照 >>
WSH特有でなくCGI仕様の一般的な事だが
CGI実行時、特に参照するだろう環境変数の一部を示す。
REQUEST_METHOD;クライアントからの要求命令(GET,POST等)
REMOTE_ADDR;クライアントのIPアドレス
QUERY_STRING;クライアントのGETメソッドから受信したユーザーデータ
CONTENT_LENGTH;クライアントのPOSTメソッドから受信したユーザーデータのバイトサイズ
REMOTE_HOST;クライアントのホスト名(IPを表す名前)※Webサーバーの設定でホスト名の取得が可能なら格納される。
※ここで言うクライアントとはサーバーにアクセス要求するものを言う。
※OS設定に関わるものはWSHリファレンスで。
※Webサーバーによる設定はHTTPでのサーバー規格、CGI仕様などの一般マニュアルを参照。
0020nobodyさん
03/08/06 02:22ID:???19は 18参照
まぁ順に読んでね♪
【チョット休憩:ジエンF&Q】
『WinではASPが主流だろうに、WSHでCGIを行うメリットは?』
・特にないwむしろ不利が多いww
・強いて言えば、ASPでも同じだが、JS、VBSはDHTMLで慣れ親しんでいる人が多いだろう。
・LINUX系のようなあくまでフリー環境志向の場合では、ということだ。古いWin9x系サーバーで遊ぶにはいいだろうw
0021nobodyさん
03/08/06 06:40ID:caVQuJh5スクリプトがWSHで実行される時、WSHはその提供するオブジェクトモデルのルートオブジェクトであるWScrptオブジェクトを宣言、作成不要で提供する。
以下にCGIで利用する際で特に使用すると思われる、WScriptオブジェクト自体の機能の一部を示しておく。
《プロパティ》
StdIn;標準入力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
StdOut;標準出力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
《メソッド》
CreateObject;COMオブジェクト(dll、ActiveXコンポーネントなどが提供するオブジェクト)の作成、JSのnew ActiveXObject、VBSのCreateObjectでも代用可能
Quit;スクリプトを終了する ※特に明示的に終了させたい場合使う
Sleep;一定時間スクリプト実行を待機し再開する
0022nobodyさん
03/08/07 00:16ID:Tpb+8opT次回から実際のサンプルコードを示していく。
・CGIスクリプトはJScript、またはVBScriptを使用するが、双方版のコードを示すとは限らない。面倒だからだw
・エラー処理はしていない。サンプルなので必ずしも実用とは言えないものもあることは承知。
・プログラムコードとして、清書するつもりはない。コードの美しさより動作パフォーマンスを優先することが多い。
・スクリプトのコード記述には、メモ帳でもいいが、できればそれなりのテキストエディタを使用したい。せめて全角半角空白、改行文字の表示ができるものがいい。
※1はVisualStudio6Pro開発環境はやりにくいのでw
フリー配布テキストエディタとして
TeraPad:作者 寺尾 進 氏 ttp://www2s.biglobe.ne.jp/~t-susumu/toclip/
を1つ推奨しておく
0023nobodyさん
03/08/07 00:18ID:???var ObjDate=new Date()
with (ObjDate) {
var AcsLogFileName=getFullYear() + "_" + (getMonth()+1) + "_" + getDate() + ".log";}
var ObjWshShell = WScript.CreateObject("WScript.Shell");
var ColWshEnv=ObjWshShell.Environment("Process")
var ObjFSO=new ActiveXObject("Scripting.FileSystemObject");
var ObjTS=ObjFSO.OpenTextFile("./" + AcsLogFileName,8,true);
ObjTS.WriteLine(ColWshEnv("REMOTE_ADDR") + "<>" + ObjDate.toString());
ObjTS.Close();
with (WScript.StdOut) {
WriteLine("Location: http://127.0.0.1/wsh/js/sample01.jpg\r\n") ;}
0024nobodyさん
03/08/07 00:19ID:???画像タグなどでCGIを呼び出し、アクセス者のIP、アクセス時刻をファイルに記録するだけである。
自PCでWebサーバー稼動させていれば、Webサーバー自体にアクセスログを取る機能があるので、このコードの実用性は低い。
HTMLページ中で<IMG src="このスクリプトファイルURL" width=0 height=0>で呼び出すのが定石。もちろんテストとして直接URLから呼んでも構わない。
このサンプルコードの場合、まずアクセス者のIPをファイルに追記してから、直接ダミー画像データを出力するのではなく、sample01.jpgというJPEG画像にリダイレクトしている。(この画像URLは自分の環境で調整すること、又はなくてもいいが…)
実は、現バージョンのWSH5.6、及びFSOでは画像などのバイナリファイルの入出力がサポートされていない。(単にディスク上でのコピー、削除は可能。)
何かいいアイディアをある方はレスを^^
0025nobodyさん
03/08/07 00:23ID:???コード参照 >>23 ※以下の行数はコード内のもの。
9行目;ここのOpenTextFileメソッドはファイルをTextStreamオブジェクトとして追記モード(=8)で開いてそのオブジェクト参照を返している。3番目の引数はtrueを指定すると指定ファイルがない場合新規作成されて開く。
ファイルは開いて必要な作業が終わったらCloseするを忘れない。
10行目:ここはファイル出力。WriteLineメソッドは改行つきで書き込む。
14行目:ここでCGI出力。ファイル出力と同様にWriteLineメソッドは先に解説した通り、改行つきで書き込む。つまり、WriteLine(text + "\r\n") はtextを1行で書き、さらに空行も書き込んでいるということ。
補足:
(1)この作成されるアクセスログファイルは日付けをファイル名としているので1日単位でログファイルを作成することになる。
(2)アクセスログファイルはこの実行コードと同じフォルダ内に作成される、Win9x上のAN HTTPDの場合、ファイル名で覗かれるので別フォルダに作成してフォルダアクセス制限せよ。
0026nobodyさん
03/08/08 01:27ID:???『WSHでCGIの問題点とは?』
・FSO自体にはファイルの排他ロックが用意されていない、対策としていわゆる、ロックを示すディレクトリをフラグにする方法があるが、苦肉の策である。
Win32APIにはプロセスレベルでのロックができる関数があることはある。が公式のコンポーネント化されたものはない。
旧VisualBasicは排他ロックできるステートメントがあることはあるのだが、これをActiveXコンポーネント化して使用するのもチョットw
・現状ではバイナリデータの入出力は扱えない。したいなら外部コンポーネントで拡張しないとだめだ。
・JScriptでは文字コードにUnicodeをサポートする。Shift-JIS等への変換は単体ではできない。
※VBSは双方変換が可能である
0027nobodyさん
03/08/08 22:06ID:EIK+Pm9d0028nobodyさん
03/08/08 22:07ID:EIK+Pm9dhttp://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createfile.htm
0029nobodyさん
03/08/13 23:40ID:q7lOxmnU0030nobodyさん
03/08/14 00:06ID:???0031山崎 渉
03/08/15 22:33ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
00321
03/08/28 01:06ID:???サンプル面倒でw
チャットはまともなもんやると長くなるしなぁw
>>28
多分FSOはMSがバージョンアップするかわからんな
スクリプトで利用可能のdllでもベクターで公開望むw
>>30
.NETはコンパイラを使うしWSHとは共存できるが別物なので別スレ、このスレはWSHスクリプトベースの旧テクでできる範囲を今更模索するw
0035nobodyさん
04/01/25 01:36ID:???どうして?
0036nobodyさん
04/01/25 01:52ID:???逝きます。
0037nobodyさん
04/01/26 11:42ID:???WScript.StdOut.WriteLine
WScript.StdOut.WriteLine "<html>"
WScript.StdOut.WriteLine "<head>"
WScript.StdOut.WriteLine "<title>hello</title>"
WScript.StdOut.WriteLine "</head>"
WScript.StdOut.WriteLine "<body>"
WScript.StdOut.WriteLine "<p>hello, vbscript</p>"
WScript.StdOut.WriteLine "</body>"
WScript.StdOut.WriteLine "</html>"
0038nobodyさん
04/01/30 11:44ID:b4IBORXj0040nobodyさん
04/01/31 10:26ID:???0041nobodyさん
04/02/21 21:55ID:???ASP+IISでいいじゃん。両方OSネイティブだし。
何で機能の劣るソフトを使わなきゃいけないの?
0044nobodyさん
04/04/22 08:35ID:???0046nobodyさん
04/12/27 22:17:04ID:MJXdJeakPrivate mObjIE
Main
Public Sub Main()
On Error Resume Next
Dim strUrl, strMes, strRep
Dim objArgs
Dim i
Set objArgs = WScript.Arguments
strUrl = objArgs(0)
strMes = objArgs(1)
strRep = objArgs(2)
'ファイル読み取り
strMes = ReadFile(strMes)
■ このスレッドは過去ログ倉庫に格納されています