★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で自己責任で行う ・商用実利用は前提としていない、本スレは、プログラム技術的知識、お遊び、趣味の範囲であることを理解する 某スレで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 マイナーすぎるのかもしれませんが分かる方いましたらヒントでも頂けると助かります。 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 Q5NODT0RAA ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる