★WSHでCGI★JScriptVBScript
■ このスレッドは過去ログ倉庫に格納されています
【このスレの概要】 ・Windows Script Host (=WSH)をCGI利用する ・JScript、又はVBScriptをCGIスクリプトとする ・自PCをサーバー稼動させる事を前提とする ・原則、Windows以外はフリーで入手できるアプリ、ツールの利用 【対象環境】 ・Windows95以上及び、WSH5.6以上のインストール済み ・Webサーバーソフトにはフリー配布のAN HTTPDを前提とする ※作者:中田 昭雄氏 配布元:ttp://www.st.rim.or.jp/~nakata/ なお、このスレでの内容を直接、中田氏サイトへ質問するのはやめて頂きたい。 【お約束】 ・試行は自PCで自己責任で行う ・商用実利用は前提としていない、本スレは、プログラム技術的知識、お遊び、趣味の範囲であることを理解する 【予備知識: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)は単体での実行も可能である。 【予備知識: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ファイルを『一般パスでも実行する』にもチェックしておくこと。 【動作確認】 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 も試してみよう。 【ファイル操作について】 実際の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利用の際の現実の問題点は後々説明する。 【最新WSHの入手】 WSH5.6は以下のURLでDL入手できる ttp://www.microsoft.com/japan/developer/scripting/default.htm WSH、FSO、JScript、VBScript等が1つになったリファレンスドキュメントも入手できる。 アニメと女子校生の無修正! 無料画像でも十分ボッキもの! 一見の価値あり!! http://www.pinkfriend.com/ 【スレのローカルルール】 本7の進入に関し、これを禁止します 【WSHのCGI利用基本:WScriptオブジェクト】 スクリプトがWSHで実行される時、WSHはその提供するオブジェクトモデルのルートオブジェクトであるWScrptオブジェクトを宣言、作成不要で提供する。 以下にCGIで利用する際で特に使用すると思われる、WScriptオブジェクト自体の機能の一部を示しておく。 《プロパティ》 StdIn;標準入力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す StdOut;標準出力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す 《メソッド》 CreateObject;COMオブジェクト(dll、ActiveXコンポーネントなどが提供するオブジェクト)の作成、JSのnew ActiveXObject、VBSのCreateObjectでも代用可能 Quit;スクリプトを終了する ※特に明示的に終了させたい場合使う Sleep;一定時間スクリプト実行を待機し再開する 1はNT系2000、XP環境がないので是非、協力者を求む >>13 なめてんのか? 後、転載元のサイトに謝っとけよ。 まぁだから、どこか抜けてるのが ちゃんねるだってことでw 【WSHのCGI利用基本:標準入力ストリーム WScript.StdIn】 参照 >>11 標準入力ストリームにはWScript.StdInで参照できる CGI動作中には、ブラウザからのPOSTメソッドで送信されたユーザーデータを取得することができる。 以下にCGIで特に使用するメンバーのみ示す。他はマニュアル参照。 《プロパティ》 AtEndOfLine;現在の読み出し位置が行末ならtrue。 AtEndOfStream;現在の読み出し位置が終端ならtrue ※MSのWSH5.6リファレンスにはミスで記載がない。 《メソッド》 ReadAll;全て読み出す ReadLine;1行分のテキストを読み出す。※読み出したテキストには改行文字は含まない ※なお、ファイルストリームと違い明示的にCloseする必要はない。 【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(考えないでいいのでお薦め)の組み込み定数を使用すると便利 【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") 【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仕様などの一般マニュアルを参照。 あ、ごめん 19は 18参照 まぁ順に読んでね♪ 【チョット休憩:ジエンF&Q】 『WinではASPが主流だろうに、WSHでCGIを行うメリットは?』 ・特にないwむしろ不利が多いww ・強いて言えば、ASPでも同じだが、JS、VBSはDHTMLで慣れ親しんでいる人が多いだろう。 ・LINUX系のようなあくまでフリー環境志向の場合では、ということだ。古いWin9x系サーバーで遊ぶにはいいだろうw 【WSHのCGI利用基本:WScriptオブジェクト】 スクリプトがWSHで実行される時、WSHはその提供するオブジェクトモデルのルートオブジェクトであるWScrptオブジェクトを宣言、作成不要で提供する。 以下にCGIで利用する際で特に使用すると思われる、WScriptオブジェクト自体の機能の一部を示しておく。 《プロパティ》 StdIn;標準入力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す StdOut;標準出力ストリームオブジェクトの参照、※このオブジェクトのメンバーは別に示す 《メソッド》 CreateObject;COMオブジェクト(dll、ActiveXコンポーネントなどが提供するオブジェクト)の作成、JSのnew ActiveXObject、VBSのCreateObjectでも代用可能 Quit;スクリプトを終了する ※特に明示的に終了させたい場合使う Sleep;一定時間スクリプト実行を待機し再開する 【サンプルコードについて】 次回から実際のサンプルコードを示していく。 ・CGIスクリプトはJScript、またはVBScriptを使用するが、双方版のコードを示すとは限らない。面倒だからだw ・エラー処理はしていない。サンプルなので必ずしも実用とは言えないものもあることは承知。 ・プログラムコードとして、清書するつもりはない。コードの美しさより動作パフォーマンスを優先することが多い。 ・スクリプトのコード記述には、メモ帳でもいいが、できればそれなりのテキストエディタを使用したい。せめて全角半角空白、改行文字の表示ができるものがいい。 ※1はVisualStudio6Pro開発環境はやりにくいのでw フリー配布テキストエディタとして TeraPad:作者 寺尾 進 氏 ttp://www2s.biglobe.ne.jp/~t-susumu/toclip/ を1つ推奨しておく 【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") ;} 【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では画像などのバイナリファイルの入出力がサポートされていない。(単にディスク上でのコピー、削除は可能。) 何かいいアイディアをある方はレスを^^ 【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の場合、ファイル名で覗かれるので別フォルダに作成してフォルダアクセス制限せよ。 【ジエンF&Q】 『WSHでCGIの問題点とは?』 ・FSO自体にはファイルの排他ロックが用意されていない、対策としていわゆる、ロックを示すディレクトリをフラグにする方法があるが、苦肉の策である。 Win32APIにはプロセスレベルでのロックができる関数があることはある。が公式のコンポーネント化されたものはない。 旧VisualBasicは排他ロックできるステートメントがあることはあるのだが、これをActiveXコンポーネント化して使用するのもチョットw ・現状ではバイナリデータの入出力は扱えない。したいなら外部コンポーネントで拡張しないとだめだ。 ・JScriptでは文字コードにUnicodeをサポートする。Shift-JIS等への変換は単体ではできない。 ※VBSは双方変換が可能である (⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン すまんね サンプル面倒でw チャットはまともなもんやると長くなるしなぁw >>28 多分FSOはMSがバージョンアップするかわからんな スクリプトで利用可能のdllでもベクターで公開望むw >>30 .NETはコンパイラを使うしWSHとは共存できるが別物なので別スレ、このスレはWSHスクリプトベースの旧テクでできる範囲を今更模索するw わたしはWindows Server 2003とASPとASP.NETとSQL Serverを使っているので快適だ。ハハハー もちろん光! 今更レスしてもなんだけど >>30 JScript.NETでCGI作って見ました。 でもこのスレの趣旨には合わないよね。 hellow vbscriptができません。 どうして? 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>" COM書けるkら事実上できない事って無いんだけどな・・・。 【結論】 ASP+IISでいいじゃん。両方OSネイティブだし。 何で機能の劣るソフトを使わなきゃいけないの? 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) 'IEのオブジェクト作成 Set mObjIE = CreateObject("InternetExplorer.Application") OpenIE(strUrl) DoIE(strMes) EatCookie(strRep) CloseIE 'IEのオブジェクトをNothing Set mObjIE = Nothing End Sub 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 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 これって、Windows系レンタルサーバとかでも使えるのかな? 某スレでCGI作ることになった。 俺はCGI初挑戦。 JavaScriptが比較的得意なので、WSHで行くことにした。 何かあったら、書かせてもらう。 とりあえず、必要な処理をPerlのソース見ながら移植してたんだが、 JavaScriptだけだと、Requestのdecode出来ない事に気づいた。 内部でVBscript呼んで済ませるかな。 ネットで、VBScriptでのURLdecode処理見つけて済ました。 VBScript URL decodeでググルと3番目くらいに出た掲示板から。 かなりおひさしぶりです。懲りずに続けます。 >46-49 InternetExplorerオブジェクトですね 今さっと見ただけなので何に使うかあとで確認します。 >53 日本語デコードができないと困りますよね。ASPの組み込みオブジェクトはASP 動作でないと使えませんのでここでは当然自分でやらねばなりません。 とりあえす、1が自作したものも上げておきます。動けばいいで作成したのでバグありと前提で。 IE6、N6で昔確認しました。 Option Explicit '●エンコード文字列分解の正規表現 Private ObjRgExDecode Set ObjRgExDecode=New RegExp With ObjRgExDecode .Global=true .Pattern="%[0-9A-F][0-9A-F]|." .IgnoreCase=true End With '●シフト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="" 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 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 >>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> デコード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 '●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 Else '通常文字とみなす if d="+" then s=s & " " else s=s & d end if End if End if next PF_Decode=s End Function >>61-63 は連続していますので、コピーして1つの.vbsファイルにして下さい。 ファイル名はとりあえず、support02.vbsとでもしておきます。 使用法は同じです。PF_Decode関数の引数にエンコード文字列を与えて呼べば、デコードされた文字列が返ります。 JScript,VBSの正規表現はPerlのものに比べると機能が貧弱です。 従ってもっと単純な方法(正規表現を使わず順に1文字づつフラグなどを使い調べていくとか)のほうが速いかも知れません。 面倒ですよねぇ(笑) 【ちょっと一息。】 WSHに限りませんが、オブジェクト操作においての注意点を少しあげておきます。 JScriptではオブジェクトメソッドとしての実行呼び出しには引数がなくても()を付けます。 例えば >>11 のQuitメソッド や >>16 のReadAllメソッドで言えば、 WScript.Quit(); var sText=WScript.StdIn.ReadAll(); のようにします。 VBSでは引数のない場合の空カッコは通常わざわざ書く必要がありません。 使うならCallステートメント形式にします。 VBSとJScriptを両方使っているとJScriptで()を忘れることがあるかも知れません。という事でした。 【AN HTTPD ワンポイント】 >>3 のように 実際に.wsf .vbs .js の拡張子ファイルをCGIスクリプトとして登録すると、 DHTMLとしてのクライアント実行させたい.vbsと.jsファイルも設置してしまうと クライアントがファイル要求した段階で当然サーバー上でWSHでCGI実行される事になる。 これはセキュリティ上留意して欲しい。 これを避けたい場合は、 ・クライアントスクリプトはスクリプトファイルを使わずHTMLで混在記述する。 ・CGIスクリプトファイルのほうを別の独自の拡張子にする。スクリプト実行のWScript.exeの指定さえ合っていればOKである。 また、これは基本だがCGI実行許可フォルダを限定する場合、許可していないフォルダに置いてしまうと当然、スクリプトファイルはCGI実行されずDLされ中身を見られてしまう。 >>66 補足 .vbsと.jsファイルを独自拡張子にしてCGI実行する場合、 例えば、Test.vbsファイルをTest.vbcgiという独自拡張子に変えて使いたい場合、 AN HTTPDには VBScriptエンジンで実行させたい拡張子をまとめて、 実行ファイルには WScript //E:vbscript のように指定して登録して欲しい。 ※WScript.exenのパスが通っているだろうからこれでOK。 //E:実行させたい指定スクリプトエンジン名 のオプション指定を忘れないように。 >>67 訂正w 誤り箇所 ※WScript.exenのパスが 訂正後→ ※WScript.exeへのパスが 下書きなんかないし、ダラダラ書きで、ageちゃってるし だって眠いんだもんw 【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> 【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> 【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> 【VBScriptサンプル02 解説1】 >>70-71 重複失礼。どちらも同じ内容なの。 >>69 訂正。 <FORM action="./sample02.wsf" method="post" name="form1" taerget="_blank"> の taerget="_blank" の taerget は誤り。 targetに直してw 【VBScriptサンプル02 解説2】 このサンプル02は sample02.htm >>69 sample02.wsf >>70 ※71は70と同じものなので無視。 support02.vbs >>61-63 の3つのファイルを同じフォルダに設置してください。 sample02.htmを表示して送信して下さい。フォームからのデータ取得のサンプルです。 あくまでサンプルですので、エラー処理はしていませんし、実用コードではありません。 POST、GETに対応していますが、POSTデータの場合は実際はただReadAllで読み込むの注意です。 POSTの場合、サイズが巨大なものが有り得ますので、事前サイズチェックはしましょう。 保守されていたので、ネタを何か(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 >>76 思いつき書き込みしかしないから(w、またやってしまった 【訂正】 【ついでに】 >ChrやAsc関数をJScropt関数で作ったほうが速いいかなぁ? JScropt→JScript 書き方が悪くて意味が伝わりませんね? Chr関数自体をJScriptで作るのではなく、 JScript中でVBSのChr関数を呼び出して、JScript製のデコード関数を作ると言う意味です。 JScriptのほうが正規表現やユーザー関数の拡張性が高いからね、VBSより効率的にかけるかな。 あとでやっておきます。いつかね(w 自age (w みんなAN HTTPDめんどいのかなぁ つーか、デコードするCOMオブジェクトないの? IEは公開してないのか? 藁をもつかむ気持ちでお願いします。 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 すいません板違いでした。Web製作板へ行ってきます。 いろいろなサイトを閲覧して、ローカルPCに溜まったCookieファイルを、VBScriptで定期的に自動消去する処理は、どうすれば良いでしょうか? ttp://www.happy2-island.com/vbs/cafe02/capter00210.shtml ファイルの削除を参考にしてみましたが、Cookieファイルの指定がうまくできませんでした。 WSH初心者ですが少し教えてください 特定のソフトを起動するためのVBSの書式を教えてください ちなみにバッチファイルでは起動しないソフトもあったのでこちらが良いと言われました ソフトは壷です "C:\Program Files\2chtubo\2chtubo.exe" 通常ならこのようなバッチファイルで起動するはずなんですが なぜか起動しませんでした なのでVBSでやってみたいです >WSH初心者ですが少し教えてください 初心者だから??なに? >特定のソフトを起動するためのVBSの書式を教えてください ええと、、、ググリましたか? >ちなみにバッチファイルでは起動しないソフトもあったのでこちらが良いと言われました どちらさまに言われましたか? >なぜか起動しませんでした。なのでVBSでやってみたいです やりたいなら調べろよ >>89 Wscript.Run "C:\Program Files\2chtubo\2chtubo.exe" ローカルで定型処理に VBScript を使っているのですが, デバッガとしてフリーで使えるものって何かありませんでしょうか? たとえばどれかの Express Edition とか. 職場では Visual Studio 2005 Professional Edition を使って いるのですが,自宅でも作業がしたくって. ttp://www.microsoft.com/downloads/details.aspx?FamilyID=e606e71f-ba7f-471e-a57d-f2216d81ec3d&DisplayLang=ja をインストールして、cscript.exeやwscript.exeに//Dオプションを付けて スクリプトを実行すればデバッガが使用可能になりますよ JavaScript でJISエンコードが可能な、escape() 関数ライブラリ ttp://nurucom-archives.hp.infoseek.co.jp/digital/ 但しサーバー運用に向いているかは未確認w (負荷とか) ( ・∀・) | | ガッ と ) | | Y /ノ 人 / ) < >__Λ∩ _/し' //. V`Д´)/ ←>>9 (_フ彡 / >大阪府三島郡島本町の小学校や中学校は、暴力イジメ学校や。 島本町の学校でいじめ・暴力・脅迫・恐喝などを受け続けて、心も身体も壊されて廃人同様になってしもうた僕が言うんやから、 まちがいないで。精神病院へ行っても、ちっとも良うならへん。教師も校長も、暴力やいじめがあっても見て見ぬフリ。 そればかりか、イジメに加担する教師もおった。 誰かがイジメを苦にして自殺しても、「本校にイジメは なかった」と言うて逃げるんやろうなあ。 島本町の学校の関係者は、僕を捜し出して口封じをするな >島本町って町は、暴力といじめの町なんだな >「口封じ」なんかしません。どうぞ、気が済むまでお書き込み下さい。 島本町は日本の恥!島本町は日本の迷惑! an Httpdとjscriptでcgiするのは簡単でいいね Jscriptで天気予報を取得したいのですが、JSONの取り扱いで躓いています。 具体的にはJSON.parseなどメソッドが使えません。 英語版のMSDNにはあるのですが日本語版では見当たらず・・・ https://msdn.microsoft.com/en-us/library/cc836466 (v=vs.84).aspx マイナーすぎるのかもしれませんが分かる方いましたらヒントでも頂けると助かります。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる