☆WSHでCGI★JScriptVBScriptat PHP
☆WSHでCGI★JScriptVBScript - 暇つぶし2ch1:nobodyさん
03/08/01 22:37 .net
【このスレの概要】
・Windows Script Host (=WSH)をCGI利用する
・JScript、又はVBScriptをCGIスクリプトとする
・自PCをサーバー稼動させる事を前提とする
・原則、Windows以外はフリーで入手できるアプリ、ツールの利用

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

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

2:nobodyさん
03/08/01 22:38 .net
【予備知識: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 .net
【予備知識:AN HTTPD CGI動作設定】
1)メニューの【オプション】→【一般】を選択
『ドキュメントルート』には、公開するトップフォルダのパスを指定。
C:\やC:\WINDOWSなどを指定しては絶対にイケナイ!包含されるファイルフォルダは原則公開されてしまうからだ。httpd.exeと同じフォルダにでも専用フォルダを作るといいだろう。
また、この指定トップフォルダはブラウザからは”URLリンク(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 .net
【動作確認】
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を打ち込んでみよう。環境変数が一覧表示されるはずだ。例 URLリンク(127.0.0.1)
URLリンク(127.0.0.1) も試してみよう。

5:nobodyさん
03/08/01 22:40 .net
【ファイル操作について】
実際の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 .net
【最新WSHの入手】
WSH5.6は以下のURLでDL入手できる

URLリンク(www.microsoft.com)

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


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


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

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

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

11:nobodyさん
03/08/03 00:04 BzLT+GQp.net
【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 98pa6a9y.net
今日までがんばったご褒美サイト!
URLリンク(homepage3.nifty.com)

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

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

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

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



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


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

23:nobodyさん
03/08/07 00:18 .net
【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: URLリンク(127.0.0.1)") ;}


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

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

28:nobodyさん
03/08/08 22:07 EIK+Pm9d.net
>>26
URLリンク(www.microsoft.com)

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

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

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

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



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

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

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

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

37:nobodyさん
04/01/26 11:42 .net
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 b4IBORXj.net
ここの>>1の頑張りはすごいな。感動した。

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


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

41:nobodyさん
04/02/21 21:55 .net
【結論】

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

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

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

44:nobodyさん
04/04/22 08:35 .net
保守

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

46:nobodyさん
04/12/27 22:17:04 MJXdJeak.net
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 MJXdJeak.net

'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 MJXdJeak.net

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 MJXdJeak.net

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 pbwyz1nG.net
これって、Windows系レンタルサーバとかでも使えるのかな?

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


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


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



54:1
05/04/12 17:15:02 .net
かなりおひさしぶりです。懲りずに続けます。
>46-49
InternetExplorerオブジェクトですね
今さっと見ただけなので何に使うかあとで確認します。
>53
日本語デコードができないと困りますよね。ASPの組み込みオブジェクトはASP
動作でないと使えませんのでここでは当然自分でやらねばなりません。
とりあえす、1が自作したものも上げておきます。動けばいいで作成したのでバグありと前提で。
IE6、N6で昔確認しました。


55:1
05/04/12 17:41:14 .net
Option Explicit

'●エンコード文字列分解の正規表現
Private ObjRgExDecode

Set ObjRgExDecode=New RegExp
With ObjRgExDecode
.Global=true
.Pattern="%[0-9A-F][0-9A-F]|."
.IgnoreCase=true
End With


56:1
05/04/12 17:43:48 .net

'●シフトJISデコード sc;エンコード文字列
Public Function PF_Decode(ByVal sc)
Dim ms,d0,d1,d2,d3,d,s
On Error Resume Next
sc=replace(sc,"+"," ",1,-1,1)
Set ms=ObjRgExDecode.Execute(sc)
d0=""


57:1
05/04/12 17:45:51 .net
For Each d1 in ms
d2=split(d1,"%")

if d0="" then '1バイト目か?
if d2(0)="" then 'エンコード文字だったら
d3=clng("&H" & d2(1))
if (d3>=&H81 and d3<=&H9f) or (d3>=&He0 and d3<=&Hef) then '2バイト文字の1バイト目なら
d0=d2(1)
d=""
else
d0=""
d=chr("&H" & d2(1))
End if
Else
d0=""
d=d2(0)
End if


58:1
05/04/12 17:46:42 .net
Else '日本語2バイト目だったら
if d2(0)="" then 'エンコード文字だったら
d=chr("&H" & d0 & d2(1))
d0=""
else '通常文字だったら
d=chr("&H" & d0 & hex( asc(d2(0)) ) )
d0=""
end if
End if
s=s & d
next
if err.number>0 then
PF_Decode=""
Else
PF_Decode=CStr(s)
End if

End Function


59:1
05/04/12 18:02:26 .net
>>55-58
これらは連続しています。
1つのVBSファイルにコピーしてください。
ファイル名はなんでもいいです。support01.vbsとでもしておきます。
wsfファイルでライブラリインクルードするとJScriptでも使えます。
VBSのPF_Decode関数はエラーなら空文字列を返します。
以下、CGI実行.wsfファイルソースの例。
なお、</SCRIPT> は省略して <SCRIPT ~ />という書き方はしゃれてますw
<job>
<SCRIPT language="vbs" src="./support01.vbs" />
<SCRIPT language="JScript">
//例 var sText=PF_Decode(デコードしたい文字列);
</SCRIPT>
</job>


60:nobodyさん
05/04/12 18:07:49 w/mYA2Io.net
なにこの気持ち悪いオナヌースレ

61:1
05/04/12 23:59:48 .net
デコードVBS関数その2です。こちらのがいいかも。なお、Windows環境を前提。自分は >>1 でもあるように不特定へのインターネット上公開を前提としてませんのであしらかず。
以下、連続します。同じように1つのファイルにコピーして下さい。

'●正規表現を定義

Private ObjRgExDecode
Set ObjRgExDecode=New RegExp
With ObjRgExDecode
.Global=true
.IgnoreCase=true
.Pattern ="(?:%[0-9a-f][0-9a-f])|."
End With


62:61の続き
05/04/13 00:04:06 .net
'●WinIEからのシフトJISデコード関数 sc;エンコード文字列
Public Function PF_Decode(ByVal sc)
Dim ms,d0,d1,d,s

On Error Resume Next

Set ms=ObjRgExDecode.Execute (sc)

For each d in ms

if d0>"" then 'trueなら2バイト文字の2バイト目を調べる
if left(d,1)="%" then 'エンコード文字
s=s & Chr(Clng(d0 & replace(d,"%",vbnullstring)))
d0=""
Else '2バイト目のはず
s=s & Chr(CLng(d0 & "00") + AscB(d))
d0=""
End if
Else '1バイト目又は通常文字を調べる
if Left(d,1)="%" then 'エンコード文字
d0=replace(d,"%","&H")
d1=Clng(d0)
if (&H81<=d1 and d1<=&H9f) or (&He0<=d1 and d1<=&Hfc) then '2バイト文字の1バイト目
else '1バイト文字エンコード
d0=""
s= s & Chr(d1)
End if


63:62の続き
05/04/13 00:05:49 .net
Else '通常文字とみなす
if d="+" then
s=s & " "
else
s=s & d
end if
End if
End if

next

PF_Decode=s

End Function


64:1
05/04/13 00:28:04 .net
>>61-63
は連続していますので、コピーして1つの.vbsファイルにして下さい。
ファイル名はとりあえず、support02.vbsとでもしておきます。
使用法は同じです。PF_Decode関数の引数にエンコード文字列を与えて呼べば、デコードされた文字列が返ります。
JScript,VBSの正規表現はPerlのものに比べると機能が貧弱です。
従ってもっと単純な方法(正規表現を使わず順に1文字づつフラグなどを使い調べていくとか)のほうが速いかも知れません。
面倒ですよねぇ(笑)


65:nobodyさん
05/04/13 02:27:56 .net
【ちょっと一息。】
WSHに限りませんが、オブジェクト操作においての注意点を少しあげておきます。
JScriptではオブジェクトメソッドとしての実行呼び出しには引数がなくても()を付けます。
例えば >>11 のQuitメソッド や >>16 のReadAllメソッドで言えば、
WScript.Quit();
var sText=WScript.StdIn.ReadAll();
のようにします。
VBSでは引数のない場合の空カッコは通常わざわざ書く必要がありません。
使うならCallステートメント形式にします。

VBSとJScriptを両方使っているとJScriptで()を忘れることがあるかも知れません。という事でした。


66:nobodyさん
05/04/15 00:55:25 .net
【AN HTTPD ワンポイント】
>>3のように
実際に.wsf .vbs .js の拡張子ファイルをCGIスクリプトとして登録すると、
DHTMLとしてのクライアント実行させたい.vbsと.jsファイルも設置してしまうと
クライアントがファイル要求した段階で当然サーバー上でWSHでCGI実行される事になる。
これはセキュリティ上留意して欲しい。
これを避けたい場合は、
・クライアントスクリプトはスクリプトファイルを使わずHTMLで混在記述する。
・CGIスクリプトファイルのほうを別の独自の拡張子にする。スクリプト実行のWScript.exeの指定さえ合っていればOKである。

また、これは基本だがCGI実行許可フォルダを限定する場合、許可していないフォルダに置いてしまうと当然、スクリプトファイルはCGI実行されずDLされ中身を見られてしまう。


67:nobodyさん
05/04/15 01:42:25 iiba0wU4.net
>>66補足
.vbsと.jsファイルを独自拡張子にしてCGI実行する場合、
例えば、Test.vbsファイルをTest.vbcgiという独自拡張子に変えて使いたい場合、
AN HTTPDには VBScriptエンジンで実行させたい拡張子をまとめて、
実行ファイルには
WScript //E:vbscript
のように指定して登録して欲しい。
※WScript.exenのパスが通っているだろうからこれでOK。
//E:実行させたい指定スクリプトエンジン名 のオプション指定を忘れないように。





68:nobodyさん
05/04/15 01:46:07 .net
>>67訂正w
誤り箇所
※WScript.exenのパスが
訂正後→
※WScript.exeへのパスが

下書きなんかないし、ダラダラ書きで、ageちゃってるし
だって眠いんだもんw

69:nobodyさん
05/04/15 17:02:04 .net
【VBScriptサンプル02 その1 HTMLフォーム】
HTMLフォームからの受信データを処理するサンプル。sample02.htmで設置。

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=x-sjis">
<TITLE></TITLE>
</HEAD>
<BODY>
<FORM action="./sample02.wsf" method="post" name="form1" taerget="_blank">
テキスト1<BR>
<INPUT name="txt1"><BR>
テキスト2<BR>
<TEXTAREA name="txt2" wrap=off></TEXTAREA><BR>
<INPUT type="submit" value="Submit" name="submit1">
</FORM>
</BODY>
</HTML>

70:nobodyさん
05/04/15 17:06:31 .net
【VBScriptサンプル02 その2 CGIスクリプトWSFファイル】
以下をその1のsample02.htmと同じ、sample02.wsfで設置、なおコードを見ても分かるように、>>61-63のsupport02.vbsファイルも設置。

<JOB>
<SCRIPT language=vbs src="support02.vbs" />
<SCRIPT language=vbs>
Option Explicit
Private ObjWshShell,ColWshEnv
Private d,d0,d1,d2
Set ObjWshShell=WScript.CreateObject("WScript.Shell")
Set ColWshEnv=ObjWshShell.Environment("Process")
Select Case ColWshEnv("REQUEST_METHOD") 'フォーム送信データを取得
Case "POST"
d=WScript.StdIn.ReadAll '実際にはサイズチェックを事前にすべき。
Case "GET"
d=ColWshEnv("QUERY_STRING")
End Select
With WScript.StdOut
.WriteLine "Content-type: text/html" & vbCRLF & vbCRLF & "<HTML><HEAD><TITLE>サンプル02</TITLE></HEAD><BODY noWrap>"
.WriteLine "生データ<BR>" & d & "<BR>取得データ<BR>"
d0=Split(d,"&",-1,1) 'POST生データを"name=data"単位で分離
For Each d1 in d0
d2=Split(d1,"=",2,1) ' "name=data"をnameとdataに要素数2の配列に分離格納
.WriteLine d2(0) & "=" & PF_Decode(d2(1)) & "<BR>"
Next
.WriteLine "完了</BODY>"
End With
</SCRIPT>
</JOB>

71:nobodyさん
05/04/15 17:07:23 .net
【VBScriptサンプル02 その2 CGIスクリプトWSFファイル】
以下をその1のsample02.htmと同じ、sample02.wsfで設置、なおコードを見ても分かるように、>>61-63のsupport02.vbsファイルも設置。

<JOB>
<SCRIPT language=vbs src="support02.vbs" />
<SCRIPT language=vbs>
Option Explicit
Private ObjWshShell,ColWshEnv
Private d,d0,d1,d2
Set ObjWshShell=WScript.CreateObject("WScript.Shell")
Set ColWshEnv=ObjWshShell.Environment("Process")
Select Case ColWshEnv("REQUEST_METHOD") 'フォーム送信データを取得
Case "POST"
d=WScript.StdIn.ReadAll '実際にはサイズチェックを事前にすべき。
Case "GET"
d=ColWshEnv("QUERY_STRING")
End Select
With WScript.StdOut
.WriteLine "Content-type: text/html" & vbCRLF & vbCRLF & "<HTML><HEAD><TITLE>サンプル02</TITLE></HEAD><BODY noWrap>"
.WriteLine "生データ<BR>" & d & "<BR>取得データ<BR>"
d0=Split(d,"&",-1,1) 'POST生データを"name=data"単位で分離
For Each d1 in d0
d2=Split(d1,"=",2,1) ' "name=data"をnameとdataに要素数2の配列に分離格納
.WriteLine d2(0) & "=" & PF_Decode(d2(1)) & "<BR>"
Next
.WriteLine "完了</BODY>"
End With
</SCRIPT>
</JOB>

72:nobodyさん
05/04/15 17:21:38 .net
【VBScriptサンプル02 解説1】
>>70-71 重複失礼。どちらも同じ内容なの。

>>69 訂正。
<FORM action="./sample02.wsf" method="post" name="form1" taerget="_blank">
の taerget="_blank" の taerget は誤り。
targetに直してw
 

73:nobodyさん
05/04/15 17:34:37 .net
【VBScriptサンプル02 解説2】
このサンプル02は
sample02.htm >>69
sample02.wsf >>70 ※71は70と同じものなので無視。
support02.vbs >>61-63
の3つのファイルを同じフォルダに設置してください。
sample02.htmを表示して送信して下さい。フォームからのデータ取得のサンプルです。
あくまでサンプルですので、エラー処理はしていませんし、実用コードではありません。
POST、GETに対応していますが、POSTデータの場合は実際はただReadAllで読み込むの注意です。
POSTの場合、サイズが巨大なものが有り得ますので、事前サイズチェックはしましょう。

74:nobodyさん
05/07/18 02:41:24 MLViLjPO.net
ホス

75:nobodyさん
05/07/20 01:42:56 P18HiGG/.net
ホシュホシュ

76:1
05/07/24 16:43:18 .net
保守されていたので、ネタを何か(w

>>45
俺もわかんない(w 初めてWebサイトみたときの記憶で、質問をジエンするときに使う感じでうろ覚え(w
FAQに似てると思うけど(w

>>50
WSHは使わせないというか、最初から危なくて業務用Winサーバーに入れとかないでしょ。
ここはプライベートというか、あくまで遊びだから。

>>60
みんなももっとネタ出してよ。

【ついでに】
・WSH関係あさればたまに目にすると思うけど。バイナリーのファイル入出力はADO2.8がインストされてればADODB.Streamでできるんだけどさ。
CGI実行時に標準入出力を読み書きする解決にはならないよん。
>>55-58 >>61-63は Shift-JISデコード関数をVBSで書いてるけどVBSエンジンだけインクルードしてChrやAsc関数をJScropt関数で作ったほうが速いいかなぁ?
作ってみるわ。誰かもやってよ(w

77:1
05/07/24 16:51:21 .net
>>76 思いつき書き込みしかしないから(w、またやってしまった
【訂正】
 【ついでに】
 >ChrやAsc関数をJScropt関数で作ったほうが速いいかなぁ?
 JScropt→JScript

書き方が悪くて意味が伝わりませんね?
Chr関数自体をJScriptで作るのではなく、
JScript中でVBSのChr関数を呼び出して、JScript製のデコード関数を作ると言う意味です。
JScriptのほうが正規表現やユーザー関数の拡張性が高いからね、VBSより効率的にかけるかな。
あとでやっておきます。いつかね(w


78:nobodyさん
05/07/24 17:04:20 .net
自age (w

みんなAN HTTPDめんどいのかなぁ

79:nobodyさん
05/09/06 02:04:33 .net
つーか、デコードするCOMオブジェクトないの?
IEは公開してないのか?


80:nobodyさん
06/05/22 08:58:11 .net
ほす

81:nobodyさん
06/07/08 09:15:04 .net
このスレの内容にばちこーん興味を持ったので保守

82:nobodyさん
06/08/24 12:18:03 UeLY+x3U.net
藁をもつかむ気持ちでお願いします。
vbsからexcelのマクロを起動する方法ってどうするのでしょうか?
エクセルマクロを使用するためにtest.wsfからvbs.vbsを呼んでいます。
下記のソースでtest.xlsに埋め込まれているMacro1というマクロを呼び出そうと
しましたが「オブジェクトでサーポートされていないプロパティです」
というエラーが出てしまいます。


------------------------------------test.wsf記述
<job id="ExcelJob">
<reference guid="00020813-0000-0000-C000-000000000046"></reference>
<script language="VBScript" src="./vbs.vbs"></script>
<script language="VBScript">
Call prcMain
</script>
</job>

------------------------------------vbs.vbs記述
Sub prcMain()
Set Excel = CreateObject("Excel.Application")
Excel.Workbooks.Open("c:\test.xls")
Set xlSheet = Excel.Worksheets(1)
Excel.Visible = True
Set objSelection = Excel.Workbooks(1).Worksheets(1).Macro1
End Sub


83:82
06/08/24 12:48:36 .net
すいません板違いでした。Web製作板へ行ってきます。

84:nobodyさん
06/08/24 18:56:31 .net
>>82-83
Web製作ではなく↓に誘導しておきます。
WSH(・∀・)スレッド!
スレリンク(tech板)l50

85:nobodyさん
06/09/27 19:51:41 .net
いろいろなサイトを閲覧して、ローカルPCに溜まったCookieファイルを、VBScriptで定期的に自動消去する処理は、どうすれば良いでしょうか?
URLリンク(www.happy2-island.com)
ファイルの削除を参考にしてみましたが、Cookieファイルの指定がうまくできませんでした。


86:nobodyさん
06/09/28 00:09:34 .net
>>85
IEのCOM使ったほうがいいぞ

あと↓で聞いたほうがいい

お前ら、wsh使ってますか? part6
スレリンク(win板)

87:nobodyさん
06/09/28 00:44:11 23IKIm9v.net
>>86
どうもありがとう。


88:nobodyさん
07/07/04 14:20:44 .net
何にせよ、ありがとうと言いたい

89:nobodyさん
07/09/06 00:53:56 lxdRIcpr.net
WSH初心者ですが少し教えてください
特定のソフトを起動するためのVBSの書式を教えてください
ちなみにバッチファイルでは起動しないソフトもあったのでこちらが良いと言われました
ソフトは壷です
"C:\Program Files\2chtubo\2chtubo.exe"
通常ならこのようなバッチファイルで起動するはずなんですが
なぜか起動しませんでした
なのでVBSでやってみたいです

90:nobodyさん
07/09/06 09:46:52 .net
>WSH初心者ですが少し教えてください
初心者だから??なに?

>特定のソフトを起動するためのVBSの書式を教えてください
ええと、、、ググリましたか?

>ちなみにバッチファイルでは起動しないソフトもあったのでこちらが良いと言われました
どちらさまに言われましたか?

>なぜか起動しませんでした。なのでVBSでやってみたいです
やりたいなら調べろよ

91:nobodyさん
07/09/06 18:20:14 .net
>>89
Wscript.Run "C:\Program Files\2chtubo\2chtubo.exe"

92:nobodyさん
08/03/10 10:17:26 nD3TpBhG.net
ローカルで定型処理に VBScript を使っているのですが,
デバッガとしてフリーで使えるものって何かありませんでしょうか?
たとえばどれかの Express Edition とか.

職場では Visual Studio 2005 Professional Edition を使って
いるのですが,自宅でも作業がしたくって.

93:nobodyさん
08/03/12 22:41:47 .net
URLリンク(www.microsoft.com)
をインストールして、cscript.exeやwscript.exeに//Dオプションを付けて
スクリプトを実行すればデバッガが使用可能になりますよ

94:nobodyさん
08/05/25 01:09:26 uDPNiz6J.net

JavaScript でJISエンコードが可能な、escape() 関数ライブラリ

URLリンク(nurucom-archives.hp.infoseek.co.jp)

但しサーバー運用に向いているかは未確認w
(負荷とか)

95:電脳プリオン
11/12/17 20:01:41.87 .net ?2BP(1960)

  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ ←>>9
 (_フ彡        /

96:nobodyさん
13/07/30 NY:AN:NY.AN FAIklnka.net
>大阪府三島郡島本町の小学校や中学校は、暴力イジメ学校や。
島本町の学校でいじめ・暴力・脅迫・恐喝などを受け続けて、心も身体も壊されて廃人同様になってしもうた僕が言うんやから、
まちがいないで。精神病院へ行っても、ちっとも良うならへん。教師も校長も、暴力やいじめがあっても見て見ぬフリ。
そればかりか、イジメに加担する教師もおった。 誰かがイジメを苦にして自殺しても、「本校にイジメは
なかった」と言うて逃げるんやろうなあ。
島本町の学校の関係者は、僕を捜し出して口封じをするな

>島本町って町は、暴力といじめの町なんだな

>「口封じ」なんかしません。どうぞ、気が済むまでお書き込み下さい。

島本町は日本の恥!島本町は日本の迷惑!

97:nobodyさん
14/02/13 19:01:25.12 wYrEGcCV.net
an Httpdとjscriptでcgiするのは簡単でいいね

98:nobodyさん
17/01/28 01:45:45.31 .net
Jscriptで天気予報を取得したいのですが、JSONの取り扱いで躓いています。
具体的にはJSON.parseなどメソッドが使えません。
英語版のMSDNにはあるのですが日本語版では見当たらず・・・
URLリンク(msdn.microsoft.com)(v=vs.84).aspx
マイナーすぎるのかもしれませんが分かる方いましたらヒントでも頂けると助かります。

99:nobodyさん
17/01/30 01:14:41.51 .net
「wsh jscript json」で検索して

100:nobodyさん
17/12/30 13:12:06.97 YhlYw6jg.net
誰でも簡単にネットで稼げる方法など
参考までに、
⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。
グーグル検索⇒『半藤のブブイウイウレレ』
Q5NODT0RAA


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch