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番目くらいに出た掲示板から。



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


55 :1:2005/04/12(火) 17:41:14 ID:???
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:2005/04/12(火) 17:43:48 ID:???

'●シフト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:2005/04/12(火) 17:45:51 ID:???
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:2005/04/12(火) 17:46:42 ID:???
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:2005/04/12(火) 18:02:26 ID:???
>>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さん:2005/04/12(火) 18:07:49 ID:w/mYA2Io
なにこの気持ち悪いオナヌースレ

61 :1:2005/04/12(火) 23:59:48 ID:???
デコード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の続き:2005/04/13(水) 00:04:06 ID:???
'●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の続き:2005/04/13(水) 00:05:49 ID:???
Else '通常文字とみなす
if d="+" then
s=s & " "
else
s=s & d
end if
End if
End if

next

PF_Decode=s

End Function


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


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

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


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

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


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





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

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

69 :nobodyさん:2005/04/15(金) 17:02:04 ID:???
【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さん:2005/04/15(金) 17:06:31 ID:???
【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さん:2005/04/15(金) 17:07:23 ID:???
【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さん:2005/04/15(金) 17:21:38 ID:???
【VBScriptサンプル02 解説1】
>>70-71 重複失礼。どちらも同じ内容なの。

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

73 :nobodyさん:2005/04/15(金) 17:34:37 ID:???
【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さん:2005/07/18(月) 02:41:24 ID:MLViLjPO
ホス

75 :nobodyさん:2005/07/20(水) 01:42:56 ID:P18HiGG/
ホシュホシュ

76 :1:2005/07/24(日) 16:43:18 ID:???
保守されていたので、ネタを何か(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:2005/07/24(日) 16:51:21 ID:???
>>76 思いつき書き込みしかしないから(w、またやってしまった
【訂正】
 【ついでに】
 >ChrやAsc関数をJScropt関数で作ったほうが速いいかなぁ?
 JScropt→JScript

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


78 :nobodyさん:2005/07/24(日) 17:04:20 ID:???
自age (w

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

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


80 :nobodyさん:2006/05/22(月) 08:58:11 ID:???
ほす

81 :nobodyさん:2006/07/08(土) 09:15:04 ID:???
このスレの内容にばちこーん興味を持ったので保守

82 :nobodyさん:2006/08/24(木) 12:18:03 ID:UeLY+x3U
藁をもつかむ気持ちでお願いします。
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:2006/08/24(木) 12:48:36 ID:???
すいません板違いでした。Web製作板へ行ってきます。

84 :nobodyさん:2006/08/24(木) 18:56:31 ID:???
>>82-83
Web製作ではなく↓に誘導しておきます。
WSH(・∀・)スレッド!
http://pc8.2ch.net/test/read.cgi/tech/1055075469/l50

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


86 :nobodyさん:2006/09/28(木) 00:09:34 ID:???
>>85
IEのCOM使ったほうがいいぞ

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

お前ら、wsh使ってますか? part6
http://pc8.2ch.net/test/read.cgi/win/1155040873/

87 :nobodyさん:2006/09/28(木) 00:44:11 ID:23IKIm9v
>>86
どうもありがとう。


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

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

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