5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

★WSHでCGI★JScriptVBScript

1 :nobodyさん:03/08/01 22:37 ID:???
【このスレの概要】
・Windows Script Host (=WSH)をCGI利用する
・JScript、又はVBScriptをCGIスクリプトとする
・自PCをサーバー稼動させる事を前提とする
・原則、Windows以外はフリーで入手できるアプリ、ツールの利用

【対象環境】
・Windows95以上及び、WSH5.6以上のインストール済み
・Webサーバーソフトにはフリー配布のAN HTTPDを前提とする
※作者:中田 昭雄氏 配布元:ttp://www.st.rim.or.jp/~nakata/
なお、このスレでの内容を直接、中田氏サイトへ質問するのはやめて頂きたい。

【お約束】
・試行は自PCで自己責任で行う
・商用実利用は前提としていない、本スレは、プログラム技術的知識、お遊び、趣味の範囲であることを理解する

2 :nobodyさん:03/08/01 22:38 ID:???
【予備知識:WSHスクリプト記述ファイル】
(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)は単体での実行も可能である。

3 :nobodyさん:03/08/01 22:39 ID:???
【予備知識:AN HTTPD CGI動作設定】
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ファイルを『一般パスでも実行する』にもチェックしておくこと。

4 :nobodyさん:03/08/01 22:39 ID:???
【動作確認】
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 も試してみよう。

5 :nobodyさん:03/08/01 22:40 ID:???
【ファイル操作について】
実際の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利用の際の現実の問題点は後々説明する。

6 :nobodyさん:03/08/01 22:48 ID:???
【最新WSHの入手】
WSH5.6は以下のURLでDL入手できる

ttp://www.microsoft.com/japan/developer/scripting/default.htm

WSH、FSO、JScript、VBScript等が1つになったリファレンスドキュメントも入手できる。


7 :nobodyさん:03/08/01 23:00 ID:Fe/gJesT
アニメと女子校生の無修正!
無料画像でも十分ボッキもの!
一見の価値あり!!
http://www.pinkfriend.com/


8 :nobodyさん:03/08/01 23:51 ID:???
【スレのローカルルール】
本7の進入に関し、これを禁止します

9 :山崎 渉:03/08/02 02:20 ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

10 :nobodyさん:03/08/02 05:22 ID:???
age
1必死だなw

11 :nobodyさん:03/08/03 00:04 ID:BzLT+GQp
【WSHのCGI利用基本:WScriptオブジェクト】
スクリプトがWSHで実行される時、WSHはその提供するオブジェクトモデルのルートオブジェクトであるWScrptオブジェクトを宣言、作成不要で提供する。
以下にCGIで利用する際で特に使用すると思われる、WScriptオブジェクト自体の機能の一部を示しておく。
《プロパティ》
StdIn;標準入力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
StdOut;標準出力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
《メソッド》
CreateObject;COMオブジェクト(dll、ActiveXコンポーネントなどが提供するオブジェクト)の作成、JSのnew ActiveXObject、VBSのCreateObjectでも代用可能
Quit;スクリプトを終了する ※特に明示的に終了させたい場合使う
Sleep;一定時間スクリプト実行を待機し再開する

12 :nobodyさん:03/08/03 00:37 ID:98pa6a9y
今日までがんばったご褒美サイト!
http://homepage3.nifty.com/coco-nut/

13 :nobodyさん:03/08/03 02:04 ID:t0wVY8lW
1はNT系2000、XP環境がないので是非、協力者を求む

14 :nobodyさん:03/08/03 09:25 ID:???
>>13
なめてんのか?

後、転載元のサイトに謝っとけよ。

15 :nobodyさん:03/08/03 15:16 ID:???
まぁだから、どこか抜けてるのが
ちゃんねるだってことでw



16 :nobodyさん:03/08/03 15:17 ID:kjY1EbCv
【WSHのCGI利用基本:標準入力ストリーム WScript.StdIn】
参照 >>11
標準入力ストリームにはWScript.StdInで参照できる
CGI動作中には、ブラウザからのPOSTメソッドで送信されたユーザーデータを取得することができる。
以下にCGIで特に使用するメンバーのみ示す。他はマニュアル参照。
《プロパティ》
 AtEndOfLine;現在の読み出し位置が行末ならtrue。
 AtEndOfStream;現在の読み出し位置が終端ならtrue ※MSのWSH5.6リファレンスにはミスで記載がない。
《メソッド》
 ReadAll;全て読み出す
 ReadLine;1行分のテキストを読み出す。※読み出したテキストには改行文字は含まない
※なお、ファイルストリームと違い明示的にCloseする必要はない。

17 :nobodyさん:03/08/03 15:17 ID:kjY1EbCv
【WSHのCGI利用基本:標準出力ストリーム WScript.StdOut】
参照 >>11
標準出力ストリームにはWScript.StdOutで参照できる
クライアントブラウザへのレス、データの送信に使用するのは言うまでもない。
以下にCGIで特に使用するメンバーのみ示す。他はマニュアル参照。
《メソッド》
 Write(strText);引数文字列strTextを書き出す。
 WriteLine([strText]);引数文字列strTextを改行付きで(つまり1行として)書き出す。引数を省略した場合、空白行となる。
※なお、ファイルストリームと違い明示的にCloseする必要はない。
※改行文字はその実行環境に依存する。WindowsなのでCR+LFである。
・JScriptの場合;\r\n
・VBScriptの場合;vbCrLf、又はvbNewLine(考えないでいいのでお薦め)の組み込み定数を使用すると便利

18 :nobodyさん:03/08/06 02:08 ID:m1U3eQA/
【WSHのCGI利用基本:環境変数の取得 WshShellオブジェクト】
クライアントブラウザからのアクセスによる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")

19 :nobodyさん:03/08/06 02:08 ID:m1U3eQA/
【WSHのCGI利用基本:環境変数の取得 Webサーバーによる設定値】
参照 >>
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仕様などの一般マニュアルを参照。

20 :nobodyさん:03/08/06 02:22 ID:???
あ、ごめん
19は 18参照
まぁ順に読んでね♪
【チョット休憩:ジエンF&Q】
『WinではASPが主流だろうに、WSHでCGIを行うメリットは?』
・特にないwむしろ不利が多いww
・強いて言えば、ASPでも同じだが、JS、VBSはDHTMLで慣れ親しんでいる人が多いだろう。
・LINUX系のようなあくまでフリー環境志向の場合では、ということだ。古いWin9x系サーバーで遊ぶにはいいだろうw


21 :nobodyさん:03/08/06 06:40 ID:caVQuJh5
【WSHのCGI利用基本:WScriptオブジェクト】
スクリプトがWSHで実行される時、WSHはその提供するオブジェクトモデルのルートオブジェクトであるWScrptオブジェクトを宣言、作成不要で提供する。
以下にCGIで利用する際で特に使用すると思われる、WScriptオブジェクト自体の機能の一部を示しておく。
《プロパティ》
StdIn;標準入力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
StdOut;標準出力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す
《メソッド》
CreateObject;COMオブジェクト(dll、ActiveXコンポーネントなどが提供するオブジェクト)の作成、JSのnew ActiveXObject、VBSのCreateObjectでも代用可能
Quit;スクリプトを終了する ※特に明示的に終了させたい場合使う
Sleep;一定時間スクリプト実行を待機し再開する


22 :nobodyさん:03/08/07 00:16 ID:Tpb+8opT
【サンプルコードについて】
次回から実際のサンプルコードを示していく。
・CGIスクリプトはJScript、またはVBScriptを使用するが、双方版のコードを示すとは限らない。面倒だからだw
・エラー処理はしていない。サンプルなので必ずしも実用とは言えないものもあることは承知。
・プログラムコードとして、清書するつもりはない。コードの美しさより動作パフォーマンスを優先することが多い。
・スクリプトのコード記述には、メモ帳でもいいが、できればそれなりのテキストエディタを使用したい。せめて全角半角空白、改行文字の表示ができるものがいい。
※1はVisualStudio6Pro開発環境はやりにくいのでw
フリー配布テキストエディタとして
TeraPad:作者 寺尾 進 氏 ttp://www2s.biglobe.ne.jp/~t-susumu/toclip/
を1つ推奨しておく

23 :nobodyさん:03/08/07 00:18 ID:???
【JScriptサンプル01:簡易アクセスログ】※以下のコードをメモ帳にでもコピーして拡張子.jsでWebサーバーに置くこと。
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") ;}


24 :nobodyさん:03/08/07 00:19 ID:???
【JScriptサンプル01:簡易アクセスログの解説(1)】
画像タグなどでCGIを呼び出し、アクセス者のIP、アクセス時刻をファイルに記録するだけである。
自PCでWebサーバー稼動させていれば、Webサーバー自体にアクセスログを取る機能があるので、このコードの実用性は低い。
HTMLページ中で<IMG src="このスクリプトファイルURL" width=0 height=0>で呼び出すのが定石。もちろんテストとして直接URLから呼んでも構わない。
このサンプルコードの場合、まずアクセス者のIPをファイルに追記してから、直接ダミー画像データを出力するのではなく、sample01.jpgというJPEG画像にリダイレクトしている。(この画像URLは自分の環境で調整すること、又はなくてもいいが…)
実は、現バージョンのWSH5.6、及びFSOでは画像などのバイナリファイルの入出力がサポートされていない。(単にディスク上でのコピー、削除は可能。)
何かいいアイディアをある方はレスを^^


25 :nobodyさん:03/08/07 00:23 ID:???
【JScriptサンプル01:簡易アクセスログの解説(2)】
コード参照 >>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の場合、ファイル名で覗かれるので別フォルダに作成してフォルダアクセス制限せよ。


26 :nobodyさん:03/08/08 01:27 ID:???
【ジエンF&Q】
『WSHでCGIの問題点とは?』
・FSO自体にはファイルの排他ロックが用意されていない、対策としていわゆる、ロックを示すディレクトリをフラグにする方法があるが、苦肉の策である。
Win32APIにはプロセスレベルでのロックができる関数があることはある。が公式のコンポーネント化されたものはない。
旧VisualBasicは排他ロックできるステートメントがあることはあるのだが、これをActiveXコンポーネント化して使用するのもチョットw
・現状ではバイナリデータの入出力は扱えない。したいなら外部コンポーネントで拡張しないとだめだ。
・JScriptでは文字コードにUnicodeをサポートする。Shift-JIS等への変換は単体ではできない。
 ※VBSは双方変換が可能である

27 :nobodyさん:03/08/08 22:06 ID:EIK+Pm9d
 

28 :nobodyさん:03/08/08 22:07 ID:EIK+Pm9d
>>26
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_createfile.htm

29 :nobodyさん:03/08/13 23:40 ID:q7lOxmnU
AGE

30 :nobodyさん:03/08/14 00:06 ID:???
JScript.NETはナシ?

31 :山崎 渉:03/08/15 22:33 ID:???
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

32 ::03/08/28 01:06 ID:???
すまんね
サンプル面倒でw
チャットはまともなもんやると長くなるしなぁw
>>28
多分FSOはMSがバージョンアップするかわからんな
スクリプトで利用可能のdllでもベクターで公開望むw
>>30
.NETはコンパイラを使うしWSHとは共存できるが別物なので別スレ、このスレはWSHスクリプトベースの旧テクでできる範囲を今更模索するw



33 : :03/09/18 18:07 ID:???
わたしはWindows Server 2003とASPとASP.NETとSQL Serverを使っているので快適だ。ハハハー
もちろん光!

34 :nobodyさん:03/12/17 00:39 ID:???
今更レスしてもなんだけど
>>30
JScript.NETでCGI作って見ました。
でもこのスレの趣旨には合わないよね。

35 :nobodyさん:04/01/25 01:36 ID:???
hellow vbscriptができません。
どうして?

36 :nobodyさん:04/01/25 01:52 ID:???
w が・・・・。
逝きます。

37 :nobodyさん:04/01/26 11:42 ID:???
WScript.StdOut.WriteLine "Content-type: text/html; charset=shift_jis"
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>"


38 :nobodyさん:04/01/30 11:44 ID:b4IBORXj
ここの>>1の頑張りはすごいな。感動した。

39 :nobodyさん:04/01/30 16:11 ID:???
>>38>>1の自作自演ですた


40 :nobodyさん:04/01/31 10:26 ID:???
COM書けるkら事実上できない事って無いんだけどな・・・。

41 :nobodyさん:04/02/21 21:55 ID:???
【結論】

ASP+IISでいいじゃん。両方OSネイティブだし。
何で機能の劣るソフトを使わなきゃいけないの?

42 :nobodyさん:04/02/21 22:12 ID:???
>>41
すべてに関して果てなマーク

43 :nobodyさん:04/02/22 10:16 ID:???
>>42
どのへんが?

44 :nobodyさん:04/04/22 08:35 ID:???
保守

45 :nobodyさん:04/07/20 10:44 ID:???
>>1
すみません、F&Qって何の略ですか?

46 :nobodyさん:04/12/27 22:17:04 ID:MJXdJeak
Option Explicit

Private 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)

47 :nobodyさん:04/12/27 22:17:50 ID:MJXdJeak

'IEのオブジェクト作成
Set mObjIE = CreateObject("InternetExplorer.Application")

OpenIE(strUrl)
DoIE(strMes)
EatCookie(strRep)
CloseIE

'IEのオブジェクトをNothing
Set mObjIE = Nothing

End Sub

48 :nobodyさん:04/12/27 22:19:11 ID:MJXdJeak

Private Function ReadFile(strPath)
On Error Resume Next

Dim strMes
Dim FSO
Dim f
Dim fStream

'オブジェクト作成
Set FSO = CreateObject("Scripting.FileSystemObject")
'ストリームオブジェクト作成
Set fStream = FSO.OpenTextFile(strPath)
'文字列取得
strMes = fStream.ReadAll()

ReadFile = strMes

End Function

49 :nobodyさん:04/12/27 22:19:45 ID:MJXdJeak

Private Function OpenIE(u)
On Error Resume Next

mObjIE.Height = 50
mObjIE.Width = 100
mObjIE.Visible = True
mObjIE.Navigate u

Do Until mObjIE.Busy = False
WScript.Sleep 2000
Loop

End Function

50 :名無し募集中。。。:05/01/12 01:45:43 ID:pbwyz1nG
これって、Windows系レンタルサーバとかでも使えるのかな?

51 :nobodyさん:05/02/24 10:23:26 ID:???
某スレでCGI作ることになった。
俺はCGI初挑戦。
JavaScriptが比較的得意なので、WSHで行くことにした。
何かあったら、書かせてもらう。


52 :51:05/02/25 17:24:10 ID:???
とりあえず、必要な処理をPerlのソース見ながら移植してたんだが、
JavaScriptだけだと、Requestのdecode出来ない事に気づいた。
内部でVBscript呼んで済ませるかな。


53 :51:05/03/04 14:40:55 ID:???
ネットで、VBScriptでのURLdecode処理見つけて済ました。
VBScript URL decodeでググルと3番目くらいに出た掲示板から。



21 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)