>管理人むたぐち さん 2004年 11月 11日 21時 44分 04秒
>> 掲示板への書込ボタンを押すと下記エラーが発生。
>こちらでも再現しました。
>Googleの検索フォームを挿入したのがまずかったようです。
>とりあえず検索フォームを外してみたところ、正常動作するようになったみたいです。
この件ですが、いつまでも、とりあえず、のまんまはよくないです。:-<
|function set_cgi_vars() { // CGI変数のセット
| var form = right.document.forms[0];
| form.name.value = ini.name;
| form.email.value = ini.email;
なので、単純に、検索フォームを書き込みフォームの後に持って行けばよいと思います。
あるいは、別ページにして、リンクするとか。
取り敢えず、切り抜いてローカルにて使わせて頂きます。
――――――――――――――――――――――――――――――――――――――
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
<title>WSH Lab. 掲示板 検索</title>
</head>
<body bgcolor="#DEDBF7" text="#00006F">
<h1 align="left"><font color="#0000A0" size="5">WSH Lab.掲示板 検索</font></h1>
<hr>
<form action="http://www.google.com/search" method="GET" name="f">
Googleサイト内検索: <input type="hidden" name="hl" value="ja">
<input type="hidden" name="lr" value="lang_ja">
<input type="hidden" name="ie" value="Shift_JIS">
<input type="hidden" name="num" value="20">
<input type="text" value="" size="50" name="q">
<input type="hidden" name="q" value="site:roy.hi-ho.ne.jp">
<input type="submit" class="Btn" name="submit" value="検索">
</form>
<hr>
</body>
</html>
――――――――――――――――――――――――――――――――――――――
showModalDialogやshowModelessDialogのwindowも、HTAのwindowと同様に、
外部から捕捉できません。HTAの場合は、まだ、右クリックが利くケースも
ありますが、Dialogの場合は手も足も出ません。
唯一つ、^p(印刷)は利くようです。
前に、Norton AntiVirusがMSHTML.DLLを使っていると書いたことがあります。
試しに、スキャンの進行状況の画面で^pすると、こちらも利きました。
Generic / Text Onlyに出せば、スキャン結果をテキストに取り出せます。
フッターを見ると、
res://C:\PROGRA~1\NORTON~1\NAVComUI.DLL/QuickSummar...
もし、IEのデフォルトprint templateの設定が、レジストリとかで、
変更できるのであれば、DOMにアクセスして、HTML形式で取り出せるのですが、
どうなんでしょう?
最後の行、
objRegistry.SetBinaryValue HKEY_CURRENT_USER,strPath,"TestValue",uBinary
の間違いです。不必要な括弧がくっついてました。
失礼しました。
To: いおお さん
> この「長さ0のバイナリ」値をRegWriteメソッドで書くにはどうしたらよいのでしょうか?
WshShell.RegWriteでは無理そうなので、WMIを使ってみてはいかがでしょうか。
HKEY_CURRENT_USER\testに「TestValue」という名前の、長さ0のバイナリ値を作成する例です。
Const HKEY_CURRENT_USER = &H80000001
Set objRegistry = GetObject("Winmgmts:root\default:StdRegProv")
strPath = "test"
uBinary = Array()
objRegistry.CreateKey HKEY_CURRENT_USER,strPath
objRegistry.SetBinaryValue(HKEY_CURRENT_USER,strPath,"TestValue",uBinary
To: AKA さん
> ダブルクォーテーションがないと
> C:\Program Files\a
> と書いた場合、
> "C:\Program.exe"にパラメータ"Files\a"を渡すのか、
> "C:\Program Files"フォルダの"a.exe"を実行するのか
> まるっきり区別できないことになりますね。
なるほど、言われてみれば仰るとおりです。
謎でも何でもなく、当たり前の仕様だったわけですね。
当該の記述を訂正しておきました。ありがとうございます。
> ここで質問をして、おそらく、つまらないという理由で完全無視されたAKAです。
ここはMicrosoftの公式サポートサイトではないので、すべての質問に
回答が得られるとは限りません。
その点はご了承ください。
AKA さんの記事を拝見しましたが、AKA さんは (こちらのコミュニティーの誰かに) 無視されたと感じられたんですね。確かに近くの掲示板の投函をレスポンスはないようですね。
ここで質問をして、おそらく、つまらないという理由で完全無視されたAKAです。
(2004年 12月 05日 04時 39分 36秒)
ここの主催者、誰でしたっけ、裸の王様さんですか?
その王様さんのページ、妙なことが書いてありますな〜
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/technic.htm
--------------------------------------------------------
アプリケーションの起動
スクリプトからアプリケーションを起動するには、次のようにWshShellオブジェクトのRunメソッドを使用します。オプションも普通に指定できます。(ただしVBSで特別な意味を持つ記号を使うときは注意しましょう)
(中略)
ただし、いずれの場合もスペースが含まれたLFN(ロングファイルネーム)は使えません(ファイルがない、というエラーになる)。どうしてもLFNを使いたい場合は、次のようにします。RunメソッドがLFNを完全にサポートしなかった理由はいまだ謎。
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files\Internet Explorer\IEXPLORE.EXE"""
'ダブルクォーテーションでくくる。一つ目の「"」は文字列を表し、次の「""」は文字列中では「"」と置き換えられる。
'したがって、DOSプロンプトとかでLFNを実行するとき「"」でくくるのと原理は同じ。
--------------------------------------------------------
まあ、ちょっとあり得ない記述としか言えないですね〜
まず当たり前の話として、
ダブルクォーテーションがないと
C:\Program Files\a
と書いた場合、
"C:\Program.exe"にパラメータ"Files\a"を渡すのか、
"C:\Program Files"フォルダの"a.exe"を実行するのか
まるっきり区別できないことになりますね。
Windowsの一部のアプリケーションでは、互換性のない変なコマンド行解釈が存在していて、例えば、単一のファイル名のみを引数にとるようなものは、スペースが間に入る名前が""で括ってなくても、結果的には同じですから、パス名として認識しているものもあります。
しかし、これは決して良いことではなく、むしろバグの部類に入ります。
UNIXやDOSのコマンドラインでは、元々パラメータにはファイル名がくるとは限らず、スペースを含む文字列を渡すことは当然でしたから、""はずっと普通に使用されてきました。
Cで、main()に引き数を渡す内部関数(__setargv()とか)はたいていこの処理を備えており(本来は必須)、プログラマが特に意識しなくても、""で括ったものは(間にスペースがあっても)一つのargvとしてセットされます。
まあ私はここ10年殆どBIOSコードしかいじってなかったからWindows(特にOOP)はさっぱりわからない愚か者ですが、もっと優しくしてくれたらよかったのにな〜と思いましたね。
Windows Script HostnのRegWriteメソッドにて
REG_BINARY値を書き込もうとしています。
レジストリエディタを使用し、新規−バイナリ等で作成した場合
データは(長さ0のバイナリ)になります。
この「長さ0のバイナリ」値をRegWriteメソッドで書くにはどうしたらよいのでしょうか?
宜しくお願いします。
>ばんのしゃーによかばんた さん 2005年 04月 20日 16時 35分 52秒
印刷の待ち合わせ方法は、VBScriptでは、
> ie.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER,PRINT_DONTBOTHERUSER+PRINT_WAITFORCOMPLETION
が効きました。
昔の記事にある方法、
ie.ReadyState<>4
や
ie.Document.body.onafterprint
は、さっぱり、効きませんでした。なんで?
また、JScriptで、
> ie.ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER,PRINT_DONTBOTHERUSER+PRINT_WAITFORCOMPLETION);
は、型の問題?で使えません。
第三引数はVARIANT of type VT_I2でないと駄目なようです。
なので、JScriptでは、印刷の待ち合わせは出来ません。
MsgBoxでは、vbCrLfより、vbLfがよいようです。
見た目は変わりませんが、
MsgBoxを^Cして、メモ帳に貼り付け、保存すると、
vbCrLfの場合、改行が潰れました。
vbLfだと、潰れません。
WScript.exe実行のWScript.Echoも同じでした。
CScript.exe実行のWScript.Echoは、
vbCrLf、vbLfのどっちでもCR+LFで同じでした。
WScript.StdOut.Write[Line]は、
vbCrLf、vbLfそれぞれのままでした。
まとめると、
MsgBoxとWScript.Echoは、vbLf
WScript.StdOut.Write[Line]は、vbCrLf
がよいようです。
VBSでプログレスバーを表示させることはできますか?
>G-Luck さん 2005年 02月 28日 12時 06分 36秒
>現在、Excelを二つ起動していて、二番目に起動したExcelを取得したいのですが、その方法はあるでしょうか?
>現在は、GetObject(,"Excel.Application")で取得しているのですが、最初のものしか取得できません。
>環境 WinXP,Excel2003
もし、それぞれのExcel.Applicationで開いているファイル名が分かるのであれば、
以下の要領でExcel.Applicationが取れるようです。
work1.xls、work2.xlsの二つのファイルがあるとして、
――――――――――――――――――――――――――――――――――――――
Path=Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
For k=1 To 2
Set xl=CreateObject("Excel.Application")
xl.Visible=True
xl.WorkBooks.Open(Path&"work"&k&".xls")
Next
For k=1 To 2
Set Book=GetObject(Path&"work"&k&".xls")
Set xl=Book.Application
xl.Caption="GetObject"
For j=1 To xl.WorkBooks.Count
MsgBox xl.WorkBooks.Item(j).Name
Next
xl.Caption=Empty
Next
――――――――――――――――――――――――――――――――――――――
>ばんのしゃーによかばんた さん 2005年 04月 19日 15時 01分 24秒
>IE関係はセキュリティ修正で仕様がよく変転するので、個人用途ならいざ知らず、
>業務用途には、ちょっと考え物です。
とは言うものの、個人用途に限れば、IEで出来るのであれば、やはり便利です。
しかし、
RunDLL32.EXE MSHTML.DLL,PrintHTML
は、自動でスクリプトが無効になりますが、印刷設定ダイアログが出ます。
一方、
ie.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER
はWSHからドライブすると、印刷設定ダイアログは出ないのですが、
セキュリティダイアログが出ます。
両方共、出ない方法があればよいのです。そこで、
HtmPrint.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim ie
Dim url
Const OLECMDID_PRINT=6
Const OLECMDEXECOPT_DONTPROMPTUSER=2
Const PRINT_DONTBOTHERUSER=1
Const PRINT_WAITFORCOMPLETION=2
Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
'ie.Visible=True
For Each url In WScript.Arguments
ie.Navigate2 url
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER,PRINT_DONTBOTHERUSER+PRINT_WAITFORCOMPLETION
Next
ie.Quit
Sub IE_DocumentComplete(pDisp, URL)
ie.Document.designMode="On"
End Sub
――――――――――――――――――――――――――――――――――――――
'ie.Visible=Trueを生かして、
ie.ExecWBとie.Quitをコメントアウトすると、HTMLエディタ?になります。
visioファイルをPDF化する一連の作業をVBSを使用して自動化できないか調査中です。
現在、手作業で、Visioファイルを開いて
印刷を選択しPDFファイルを作成し
変換ファイルと同名.pdfとし保存する。
上記、Visioファイルは、数百あり
フォルダー単位に分かれているので
フォルダー単位で変換が出来れば非常にありがたいのですが
上記のような、ファイル変換スクリプトのサンプルが有る
URLをご教示頂けるとありがたいのですが。宜しくお願いします。
>シロウト さん 2005年 04月 18日 12時 23分 39秒
>WshShell.Run("rundll32.exe c:\WINNT\system\MSHTML.DLL,PrintHTML
""D:\p.html"" ""Canon LASER SHOT LBP-1210""")
>と実行しているんですが、
>どうしても印刷ダイアログが出てきます。
きっとIEのセキュリティ修正、
取り敢えず、無条件にダイアログを出して、穴を塞ぐ。
を繰り返した結果なんでしょう。
普通なら、wShell.SendKeys()すればよいのでしょうが、
ウィンドウを持たない環境では使えません。
なので、
>ばんのしゃーによかばんた さん 2005年 04月 16日 15時 47分 10秒
>ペイント以外の印刷方法は、レジストリのPrintキーを調べれば分かります
に挙げなかったのです。
IE関係はセキュリティ修正で仕様がよく変転するので、個人用途ならいざ知らず、
業務用途には、ちょっと考え物です。
前にも言いましたが、IE(及びその実体のMSHTML.DLL)なんか(おっと失礼)を使わず、
例えば、ほかのブラウザを使う。
netscape.exe /print(%1)
は、ダイアログが出ないみたいです。
ほかにHTMLを喰えそうなアプリを探して使う。などのほうが、よいのでは?
Word
――――――――――――――――――――――――――――――――――――――
Const wdDoNotSaveChanges=0
Const wdOpenFormatWebPages=7
Dim Background:Background=False
Set oWord=CreateObject("Word.Application")
For Each arg In WScript.Arguments
Set oDoc = oWord.documents.Open(arg,,,,,,,,,wdOpenFormatWebPages)
oDoc.PrintOut(Background)
oDoc.Close(wdDoNotSaveChanges)
Next
oWord.Quit
――――――――――――――――――――――――――――――――――――――
Excel
――――――――――――――――――――――――――――――――――――――
Dim SaveChanges
SaveChanges=False
Set xl=CreateObject("Excel.Application")
For Each arg In WScript.Arguments
xl.DisplayAlerts = False
Set wBook = xl.WorkBooks.Open(arg)
xl.DisplayAlerts = True
Set wSheet = wBook.ActiveSheet
wSheet.PrintOut
wBook.Close(SaveChanges)
Next
xl.Quit
――――――――――――――――――――――――――――――――――――――
皆様。
私は今、WSHでHTMLページを印刷するということをやりたいと思っています。
実行コードは
-------
WshShell.Run("rundll32.exe c:\WINNT\system\MSHTML.DLL,PrintHTML
""D:\p.html"" ""Canon LASER SHOT LBP-1210""")
-------
と実行しているんですが、
どうしても印刷ダイアログが出てきます。
間違った指定方法なんでしょうか?
それとも、MSHTML.dllではプリンタ指定出来ないのでしょうか?
皆様、ご教授宜しくお願いします。
ええと、mshtmler.dll では
Microsoft HTML Editing Component's Resource DLL
の中身を見ているのでしょうか、もしそうですと私の知恵では
問題があるとは思えませんです。でも知らないだけかもしれません。
res://IEXPLORE.exe/%2316/1
なんかですと、リモートからwebページを通じて複数の窓を使って
clipboard経由で何か出来てしまうような気もいたしますがはっき
りとわかりません。特定のバージョンであると検知されるやもし
れません。
少なくとも、何か特定のアプリをインストール済みであろうと推理する
ことは可能かも知れません。
Secuniaのリスク評価では 気にしなくて良いほどになるかと思います。
>ばんのしゃーによかばんた さん 2005年 04月 17日 16時 45分 25秒
>>hoshikuzu さん 2005年 04月 03日 23時 40分 04秒
>>●Secunia - Advisories - Microsoft Internet Explorer "sysimage:" Local File Detection Weakness
>>http://secunia.com/advisories/13396/
>>ですのでXPwithSP2ではsysimage://は忌避されているようです。
>
>もし、セキュリティ上、
><img src="res://mshtmler.dll/unknown.gif" onload="alert('img res ok')" onerror="alert('img res ng')" >
>も問題なんでしょうか?
>ばんのしゃーによかばんた さん 2005年 04月 10日 15時 51分 55秒
>HTAのHTMLWindow2オブジェクトを外部(WSH)から参照できるようにする方法。
を更に発展させて、
VBSからIEを使うときの定石、
ie.vbs
――――――――――――――――――――――――――――――――――――――
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
ie.Visible=True
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.document.parentWindow.opener.document.title="change!"
WScript.Echo ie.Document.parentWindow.location
――――――――――――――――――――――――――――――――――――――
に相当する、
VBSからHTAを使うときの新、定石です。
hta.vbs
――――――――――――――――――――――――――――――――――――――
Name=Replace(WScript.ScriptName,".","_")
Set wShell=CreateObject("WScript.Shell")
wShell.Run "MSHTA.EXE ""javascript:void(open(""about:blank"","""&Name&""",""width=100,height=100""));"""
Do While Not wShell.AppActivate("about:blank")
WScript.Sleep 100
Loop
Set Shell=CreateObject("Shell.Application")
Do While IsEmpty(ie)
For Each ie In Shell.Windows
If TypeName(ie.document)="HTMLDocument" Then
If ie.document.parentWindow.name=Name Then
If TypeName(ie.document.parentWindow.opener)="HTMLWindow2" Then
ie.document.parentWindow.opener.document.title="change!"
Exit For
End If
End If
End If
Next
WScript.Sleep 100
Loop
Set hta=ie.document.parentWindow.opener
ie.Quit
WScript.Echo hta.location
――――――――――――――――――――――――――――――――――――――
このあと、セキュリティレベルを気にすることなく、オブジェクトなどを組み込めます。
JP189105 - ユーザーによる操作なしで Windows にプリンタを追加する方法
このrundll32 printui.dll,PrintUIEntryは、なかなか使えそうです。
バッチファイルかショートカットを作っておくとよいのでは。
以下、プリンタ名"Generic / Text Only"のサンプルです。
HelpPrintUI.CMD PrintUI.DLLのヘルプ
rundll32 printui.dll,PrintUIEntry /?
rundll32 printui.dll,PrintUIEntry /Xs /n "Generic / Text Only" ?
TextOnlyInstall.CMD "プリンタの追加"
rundll32 printui.dll,PrintUIEntry /if /f "%windir%\inf\ntprint.inf" /r "file:" /m "Generic / Text Only"
DefaultPrinter.CMD "通常使うプリンタに設定(&F)"
rundll32 printui.dll,PrintUIEntry /y /n "Generic / Text Only"
PrinterProp.CMD "プロパティ(&R)"
START rundll32 printui.dll,PrintUIEntry /p /n "Generic / Text Only"
PrintQueue.CMD "開く(&O)"
START rundll32 printui.dll,PrintUIEntry /o /n "Generic / Text Only"
PausePrint.CMD "一時停止(&A)"
rundll32 printui.dll,PrintUIEntry /Xs /n "Generic / Text Only" status pause
PrinterSetting.CMD "プロパティ(&R)"の中の「印刷設定」
START rundll32 printui.dll,PrintUIEntry /e /n "Generic / Text Only"
PurgePrint.CMD "印刷ドキュメントを削除(&G)"
rundll32 printui.dll,PrintUIEntry /Xs /n "Generic / Text Only" status purge
ResumePrint.CMD "印刷の再開(&G)"
rundll32 printui.dll,PrintUIEntry /Xs /n "Generic / Text Only" status resume
>ばんのしゃーによかばんた さん 2004年 05月 16日 21時 42分 12秒
>MSHTML.DLLを見ていたら、Generic / Text Onlyという文字列がありました。
日本語の設定を忘れていました。
プリンタのプロパティで、
フォントの選択
コードページ
で
Japanese (932)
を選択します。
>IEなどで印刷すれば、レイアウトを保ったテキストが得られます。
>ただ、改行がLFのみなので、そのままNotePadで開くと改行が潰れます。
ここで、以下が役に立ちます。
>ばんのしゃーによかばんた さん 2005年 01月 14日 17時 45分 41秒
>explorer.exe /e,hoge.txt
>explorer.exe hoge.txt
>は、テキストファイルをNotePadでなく、
>それぞれexplorerとieで表示してくれるんですよね。
>表示専用に向いています。
そこで、ファイルをIEで開きます。
IEから「名前を付けて保存」し直すと改行が直ります。
テキストファイルの関連付けにIEを追加しておくとよいでしょう。
HKEY_CLASSES_ROOT\txtfile\shell\View\command\
"C:\Program Files\Internet Explorer\iexplore.exe" "%1"
また、テキストファイルの印刷は通常「メモ帳」を使って行いますが、
「メモ帳」の印刷結果はどうも、好きになれません。
上記のIEから印刷したほうがまだましです。
また、「メモ帳」では、Unicode、UTF-8の変換ができますが、IEでは、
さらに、JIS、EUCの変換が可能です。
こういう書き方が出来るんですね。
MSDNライブラリを検索しましたが、検索では「.」「:」が無視されるので、:-<
サンプルコード内に見掛けたものの、構文の説明が見つかりませんでした。:-<
<html>
<head>
<script>
function window::onload(){
alert(2);
}
function window.onunload(){
alert(4);
}
</script>
</head>
<body onload="vbscript:msgbox(1)" onbeforeunload="javascript:alert(3)" >
</body>
</html>
>hoshikuzu さん 2005年 04月 03日 23時 40分 04秒
>●Secunia - Advisories - Microsoft Internet Explorer "sysimage:" Local File Detection Weakness
>http://secunia.com/advisories/13396/
>ですのでXPwithSP2ではsysimage://は忌避されているようです。
もし、セキュリティ上、
<img src="sysimage://notepad.exe/small" onload="alert('img sysimage ok')" onerror="alert('img sysimage ng')" >
が問題なら、
<img src="res://mshtmler.dll/unknown.gif" onload="alert('img res ok')" onerror="alert('img res ng')" >
も問題なんでしょうか?
AKiOSさんのオリジナル版WSHLAB.HTAと
それをカストマイズした、ばんのしゃーによかばんた版WSHLAB2.HTAとの差分です。
オリジナル版はHTMLの表現様式への依存性が強く、
オリジナルのHTMファイルでないと動かなかったので、それを弱めてます。
ファイル C:WSHLAB.HTA と C:WSHLAB2.HTA を比較しています
***** C:WSHLAB.HTA
578: if (path.match(re_oldkiji) != null) {
579: n = parseInt(RegExp.$1);
580: } else if (path.match(re_newkiji) != null) {
***** C:WSHLAB2.HTA
578: if (path.match(re_oldkiji) != null) {
579: n = parseInt(RegExp.$1,10);
580: } else if (path.match(re_newkiji) != null) {
*****
***** C:WSHLAB.HTA
832: }
833: if (hitlist.length != 50 && !kijifiles[x].is_newkiji) {
834: warning(kijifiles[x].path, kijifiles[x].num);
835: }
836: return true;
***** C:WSHLAB2.HTA
832: }
833: // if (hitlist.length != 50 && !kijifiles[x].is_newkiji) {
834: // warning(kijifiles[x].path, kijifiles[x].num);
835: // }
836: return true;
*****
***** C:WSHLAB.HTA
837: }
838: function warning(fname, num) { // 警告メッセージの表示
839: var n = hitlist.length - 1;
840: var test = (hitlist[n].kiji.search(/\x00/) != -1);
841: var s = '<font color="blue">過去記事リスト['+num+"] <"+fname+">";
842: if (test) {
843: if (hitlist.num == 2 && hitlist.length == 19) {
844: s += " の 741 行目";
845: } else {
846: s += " の "+(50-n)+" 番目の記事";
847: }
848: s += "にある文字コード 0 を取り除いてください。";
849: } else {
850: s += " は正常に読み込めないか、壊れている可能性があります。";
851: }
852: s += '</font>';
853: set_status(s, true);
854: }
855: function disp_result() { // 検索結果の表示
***** C:WSHLAB2.HTA
837: }
838: //function warning(fname, num) { // 警告メッセージの表示
839: // var n = hitlist.length - 1;
840: // var test = (hitlist[n].kiji.search(/\x00/) != -1);
841: // var s = '<font color="blue">過去記事リスト['+num+"] <"+fname+">";
842: // if (test) {
843: // if (hitlist.num == 2 && hitlist.length == 19) {
844: // s += " の 741 行目";
845: // } else {
846: // s += " の "+(50-n)+" 番目の記事";
847: // }
848: // s += "にある文字コード 0 を取り除いてください。";
849: // } else {
850: // s += " は正常に読み込めないか、壊れている可能性があります。";
851: // }
852: // s += '</font>';
853: // set_status(s, true);
854: //}
855: function disp_result() { // 検索結果の表示
*****
***** C:WSHLAB.HTA
912: if (x != -1) {
913: kiji = kiji.substr(x); // 本文を取り出す
914: }
***** C:WSHLAB2.HTA
912: if (x != -1) {
913: // kiji = kiji.substr(x); // 本文を取り出す
914: }
*****
***** C:WSHLAB.HTA
952: fin.Close();
953: var a = new Array();
954: var begin;
955: var end = 0;
956: while (true) {
957: begin = s.indexOf("<STRONG>", end);
958: if (begin == -1) break;
959: end = s.indexOf("<HR>", begin);
960: a[a.length++] = s.substring(begin, end);
961: }
962: return a;
963: }
***** C:WSHLAB2.HTA
952: fin.Close();
953: //s=s.replace(/(<b><)(.*?)(<\/b>)/g,"<STRONG><$2</STRONG>");
954: s=s.replace(/(<.+?>)/g,function(v,p,r){return v.toUpperCase();});
955: //alert(s);
956: // var a = new Array();
957: // var begin;
958: // var end = 0;
959: // while (true) {
960: // begin = s.indexOf("<STRONG>", end);
961: // if (begin == -1) break;
962: // end = s.indexOf("<HR>", begin);
963: // a[a.length++] = s.substring(begin, end);
964: // }
965: // return a;
966: // return s.match(/<STRONG>[^\x00]*?<HR>/img);
967: return s.match(/<!-- \d+ -->[^\x00]*?<HR>/img);
968: }
*****
***** C:WSHLAB.HTA
964: function get_title(s, i) { // 記事よりタイトル(投稿者+日時)を取り出す
965: var name = '<a id="a" onclick="top.a_click('+i+')"'+
966: ' onmouseover="top.a_over(this)"'+
967: ' onmouseout="top.a_out(this)">$1 さん</a>';
968: return s.substring(0, s.indexOf("<BR>"))
969: .replace(/\(<A.*A>\)/, "")
970: .replace(/<STRONG><FONT SIZE="4">(.*)<\/FONT><\/STRONG>.*/, '<td nowrap>'+name+'<td>')
971: .replace(/<I> (\d+)年 (\d+)月 (\d+)日 (\d+)時 (\d+)分 (\d+)秒 <\/I>/, '<td nowrap>$1/$2/$3 $4:$5</td>')
972:
973: }
***** C:WSHLAB2.HTA
969: function get_title(s, i) { // 記事よりタイトル(投稿者+日時)を取り出す
970: // var name = '<a id="a" onclick="top.a_click('+i+')"'+
971: // ' onmouseover="top.a_over(this)"'+
972: // ' onmouseout="top.a_out(this)">$1 さん</a>';
973: // return s.substring(0, s.indexOf("<\/I>")+4)
974: // .replace(/[\r\n]/g, "")
975: // .replace(/\(<A.*A>\)/, "")
976: // .replace(/<STRONG><FONT SIZE=[^>]*>(.*)<\/FONT><\/STRONG>[^<]*/, '<td nowrap>'+name+'<td>')
977: // .replace(/[^>]*<I>\s?(\d+)年\s?(\d+)月\s?(\d+)日\s?(\d+)時\s?(\d+)分\s?(\d+)秒\s?<\/I>/, '<td nowrap>$1
978: $2/$3 $4:$5</td>');
979: s=s.replace(/[\r\n]/g, "");
980: var m=s.match(/<FONT SIZE=[^>]*>(.*)<\/FONT>/i);
981: var name;
982: if (m) name=m[1];
983: var r='<td nowrap>'+ '<a id="a" onclick="top.a_click('+i+')"'+
984: ' onmouseover="top.a_over(this)"'+
985: ' onmouseout="top.a_out(this)">' +name+ 'さん</a>' +
986: '<td>';
987: m=s.match(/<I>\s?(\d+)年\s?(\d+)月\s?(\d+)日\s?(\d+)時\s?(\d+)分\s?(\d+)秒\s?<\/I>/i);
988: if (m) r+='<td nowrap>'+m[1]+'/'+m[2]+'/'+m[3]+' '+m[4]+':'+m[5]+'</td>';
989: return r;
990: }
*****
***** C:WSHLAB.HTA
1058: right.document.writeln('strong#handle { color:', linkcolor, '; cursor:hand; }');
1059: right.document.writeln('.quote { color:', quotecolor, '; }');
***** C:WSHLAB2.HTA
1075: right.document.writeln('strong#handle { color:', linkcolor, '; cursor:hand; }');
1076: right.document.writeln('b#handle { color:', linkcolor, '; cursor:hand; }');
1077: right.document.writeln('.quote { color:', quotecolor, '; }');
*****
***** C:WSHLAB.HTA
1095: '" onmouseout="a_out(this)">';
1096: } else if (s == "<STRONG>") {
1097: s = '<strong id="handle" onclick="prnt.response()" onmouseover="a_over(this,\'レス書き\
1098: )" onmouseout="a_out(this)">';
1099: } else if (s == "<BLOCKQUOTE>") {
***** C:WSHLAB2.HTA
1113: '" onmouseout="a_out(this)">';
1114: } else if (s.match(/^<(STRONG|B)>$/i)) {
1115: s = '<'+RegExp.$1+' id="handle" onclick="prnt.response()" onmouseover="a_over(this,\'レ
1116: X書き\')" onmouseout="a_out(this)">';
1117: } else if (s == "<BLOCKQUOTE>") {
*****
***** C:WSHLAB.HTA
1157: if (/http:\/\/\w+/.test(s)) {
1158: s = s.replace(/(http:\/\/\w+[\w\/\-+.,?#%&@~=;:]+)/g, '<a href="$1">$1</a>');
1159: } else if (/\b\d?\d-\d\d\b/.test(s)) {
***** C:WSHLAB2.HTA
1175: if (/http:\/\/\w+/.test(s)) {
1176: // s = s.replace(/(http:\/\/\w+[\w\/\-+.,?#%&@~=;:]+)/g, '<a href="$1">$1</a>');
1177: } else if (/\b\d?\d-\d\d\b/.test(s)) {
*****
***** C:WSHLAB.HTA
1447: s = s.replace(/[\r\n]/g, "")
1448: .replace(/<!-- <BR> -->/g, "\n")
1449: .replace(/<BR>/g, "\n")
1450: .replace(/<\/?[^<>]*>/g, "")
***** C:WSHLAB2.HTA
1465: s = s.replace(/[\r\n]/g, "")
1466: .replace(/<!-- <BR> -->/g, "\r\n")
1467: .replace(/<BR>/g, "\r\n")
1468: .replace(/<\/?[^<>]*>/g, "")
*****
>ばんのしゃーによかばんた さん 2005年 04月 12日 15時 19分 56秒
>表示中のHTMLソースから、スクリプト類を除去するJScriptです。
>「お気に入り」や「リンク」から実行します。
>scremove.js
昇順ループ内削除の禁忌を忘れて嵌りました。
DeScript.JS
――――――――――――――――――――――――――――――――――――――
var Shell=new ActiveXObject("Shell.Application");
var ie=Shell.Windows().Item();
if(!ie){WScript.Echo("IE Not Found");WScript.Quit();}
if(!ie.Document.parentWindow){
for(var k=0;k<Shell.Windows().Count;k++){
ie=Shell.Windows().Item(k);
if(ie.Document.parentWindow) break;
ie=null;
}
}
if(!ie){WScript.Echo("IE Not Found");WScript.Quit();}
var window=ie.Document.parentWindow;
var ns=0;
for(var k=window.document.scripts.length;k>0;k--){
window.document.scripts(k-1).outerHTML='';
ns++;
}
var no=0;
for(var k=window.document.all.tags('object').length;k>0;k--){
window.document.all.tags('object').item(k-1).outerHTML='';
no++;
}
var ne=0;
for(var k=0;k<window.document.all.length;k++){
for(var prop in window.document.all(k)){
if(prop.substr(0,2)=='on'){
if(window.document.all(k)[prop]){
window.document.all(k).setAttribute(prop,null);
ne++;
}
}
}
}
var outerHTML=window.document.documentElement.outerHTML;
window.document.open();
window.document.write(outerHTML);
window.document.close();
WScript.Echo(ns+" Scripts and "+ne+" Events and "+no+" Objects Removed.");
――――――――――――――――――――――――――――――――――――――
>シロウト さん 2005年 04月 14日 11時 07分 34秒
>>ウィンドウが持てない環境ではExecWBのPrintがなぜか効かないようです。
>>しかも、エラーも上がらない。
>>たぶんセキュリティ修正を繰り回した結果のIEの「障害」だと思います。
タスクスケジューラなどの、そういう環境では、ExplorerやIEを動かしては
いけないのかも。
Explorerは、自分ひとりだとデスクトップシェル(プログラムマネジャ)に
なろうとするみたいです。
>ペイントで印刷すると、めちゃいっぱい用紙を食うのですよ...。
>印刷結果を見てビックリするような細切れ状態です。
>他にも何か良い方法はございませんでしょうか?
もし、それが縮小拡大の問題なら、サイズを縮小してから印刷すればよいのでは?
――――――――――――――――――――――――――――――――――――――
ペイント以外の印刷方法は、レジストリのPrintキーを調べれば分かります。
Office製品があれば、
"C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" /p ファイル
98/MEなら、
KODAKPRV.EXE /p ファイル
2000/XPなら、「Windows画像とFAXビューア」があります。
ただし、これのPrintキーを使うと、印刷ダイアログが出るので、代わりに
PrintToキーを使います。それには以下のようなバッチファイルを作ります。
rundll32.exe shimgvw.dll,ImageView_PrintTo /pt %1 "Canon LASER SHOT LBP-1110"
ここで、%2はプリンタ名。
因みに、「Windows画像とFAXビューア」で表示するには、
rundll32.exe shimgvw.dll,ImageView_Fullscreen %~1
というバッチファイルを使います。
ファイル名を引用符で囲むと駄目なので、ショートカット(.LNK)は駄目です。
>ばんのしゃーによかばんた さん 2005年 04月 11日 15時 17分 46秒
>パイプで思い出しましたが、An HTTPDの件。
>でも、やはり、この実装は筋が悪かったんだと思いますよ。
>本家の実装であれば、こういうトラブルも起きず、筋が良かったと思いますね。
で、筋の良い修正方法ですが、
linuxで、バイナリフォーマットテーブル(?)とかいう、拡張をしているようです。
こちらは、#!だけでなく、'!でも、なんでも関連付けが出来るようです。
An HTTPDもこれを真似ればよいと思います。
>ばんのしゃーによかばんた さん 2005年 04月 13日 15時 52分 24秒
>スクリプトエンコーダのサンプルです。
>Source=sce.EncodeScriptFile(Ext, Source, 0, "VBScript")
第三引数の詳細が分かりません。:-<
SCRENC.EXEのオプションと対応していると思うのですが。。。
完全無料の出会い系サイト
http://maar.s6.x-beat.com/cyberad/siturakuen.php
すみません、下記の投稿の内容ですが解決しました。
ドライブ割当を諦め、UNCでアクセスさせるとうまくいきました。
マウント関連はもっと勉強しないといけません^^;
ありがとうございました。
お世話になります。現在どうしても解せない部分でつまづいております…。
ローカルマシンからリモートマシンの監視を行い、リモート側テキストに落とした監視結果のファイルをローカルマシンにコピーし、ローカル側でそれを開いてダイアログ表示させたいのですが、うまくいきません。
local.vbs
-------------------------------------------------------------
strComputer = "TFS-3002" 'リモートホスト
strScript = "remote.vbs"
set objController = WScript.CreateObject("WshController")
set objRemote = objController.CreateScript(strScript, strComputer)
WScript.Echo "リモートでスクリプトを実行します。"
objRemote.Execute
Do Until objRemote.Status = 2
WScript.Sleep 1000
Loop
WScript.Echo "リモートでの実行は終了しました。"
wscript.sleep 7000
'結果確認
Set objFS = CreateObject("Scripting.FileSystemObject")
Set ts = objFS.OpenTextFile("D:\VBS\kekka.txt", 1, True)
Do While ts.AtEndOfStream = False 'ファイルの終端になってない間ループ
strDATA = ts.ReadLine 'ファイルからデータを一行を読む
Msgbox "strDATA '読み込んだデータを表示
Loop
Msgbox "以上です"
ts.close
--------------------------------------------------------------------
remote.vbs
--------------------------------------------------------------------
'ウィンドウ個数チェック
nProc = 0
sName = "javaw.exe"
For Each Process In GetObject("winmgmts:").InstancesOf ("win32_process")
If LCase(Process.name) = sName then
nProc = nProc + 1
End If
Next
uName = Now & "に確認したTAMアプリケーションのJAVAウィンドウ数は " & nProc & " です"
'結果記入
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("kekka.txt", 2, True)
objFile.WriteLine uName
objFile.Close
'時刻調整
Dim WSHShell
Set WSHShell = CreateObject("Wscript.Shell")
WshShell.Run "cmd.exe /k net time \\192.168.1.33 /set /yes"
'結果記入
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("kekka.txt", 8, True)
objFile.WriteLine "システムクロックを調整しました"
objFile.Close
wscript.sleep 1000
'マウント
Set objNetwork = WScript.CreateObject("WScript.Network")
objNetwork.MapNetworkDrive "Z:", "\\192.168.1.33\vbs"
wscript.sleep 10000
'kekkaコピー
Dim hell
Set hell = CreateObject("Wscript.Shell")
hell.Run "cmd.exe /k copy C:\winnt\system32\kekka.txt Z:\ /y"
wscript.sleep 1000
'アンマウント
Set objNetwork2 = WScript.CreateObject("WScript.Network")
objNetwork2.RemoveNetworkDrive "Z:"
wscript.sleep 100
--------------------------------------------------------------------
リモートマシンで実行することは、プロセス数のカウントと時刻修正です。
上記のスクリプトを流すと、結果ファイル(kekka.txt)のコピーまでは
実行できるのですが、ファイルの中身はブランクなのです("以上です"のダイアログ出現まで実行されます)。
このremote.vbsをリモートホスト上で実行すると問題なく動きます。
また共有フォルダ(\\192.168.1.33\vbs)のマウント/アンマウント部分だけを抜き出し、リモートマシンでremote.vbsを実行すると正常にドライブが割り当てられるのですが、これをローカルマシンで実行(local.vbsを実行)すると反映されないのです。リモートホストのリモート操作させるレジストリ値は有効になっていますし、ローカル/リモートともにadmin権限のある同一ユーザーでログインしているのですが、ローカル側でキックしたスクリプトが正常に動かないようです。結果ファイルには実行結果が反映されるのですが。
長々と申し訳ありません。
何か足りない制御、怪しい箇所はありますでしょうか?
》ばんのしゃーによかばんた さん 2005年 04月 13日 23時 56分 18秒
>>シロウト さん 2005年 04月 13日 11時 31分 55秒
>>ATコマンド指定の実行や、ASP組み込みでブラウザから実行すると
>>なぜか動きません。
>ウィンドウが持てない環境ではExecWBのPrintがなぜか効かないようです。
>しかも、エラーも上がらない。
>たぶんセキュリティ修正を繰り回した結果のIEの「障害」だと思います。
うむむむ...そうですか。
わざわざありがとうございます。
>IEなんか(おっと失礼:-p)を使わず、
>MSPaint.EXE /P ファイル
>で印刷すればよいのでは?
ペイントで印刷すると、めちゃいっぱい用紙を食うのですよ...。
印刷結果を見てビックリするような細切れ状態です。
できればIEで印刷するように、一枚とかにまとめて欲しいんですよねぇ。
さすがにそれは無理な要望なんでしょうかねぇ↓
他にも何か良い方法はございませんでしょうか?
MSWord,MSExcelなどのマクロを駆使してやるとかになっちゃうんでしょうか?
スクリプトエンコーダは文字化けしますね。
タブやDEL(7F)などの制御文字を使うなんて、ちょっと設計扇子が無さ過ぎ。:-<
空白展開された2箇所をタブに戻せば、動きます。
;DMn
iAG;
の後。
>シロウト さん 2005年 04月 13日 11時 31分 55秒
>ATコマンド指定の実行や、ASP組み込みでブラウザから実行すると
>なぜか動きません。
ウィンドウが持てない環境ではExecWBのPrintがなぜか効かないようです。
しかも、エラーも上がらない。
たぶんセキュリティ修正を繰り回した結果のIEの「障害」だと思います。
IEなんか(おっと失礼:-p)を使わず、
MSPaint.EXE /P ファイル
で印刷すればよいのでは?
》魔界の仮面弁士 さん 2005年 04月 13日 15時 00分 31秒
> 1. [ディレクトリ セキュリティ]タブ
> 2. [匿名アクセスおよび認証コントロール]の[編集]
> 3. [匿名アクセス]の項目
>
> ですね。
>
> ATコマンドの方は、サービスの"Task Scheduler"(Schedule)です。
さっそくやってみたんですが、印刷されませんでした。
ここでふと思った事があります。
実は権限がないのは、IEの実行権限なんではと。
といいますのも、コマンドプロンプトから実行すると
IEが立ち上がる→コンテンツが全て表示される→勝手に印刷が始まる→終わり(IE上がりっぱ)
このような順序で処理されています。
ゆえに、下記@Aのどちらかが原因ではないかと思います。
@IEの実行権限がない
Aプリンタの印刷実行権限がない
更に、通常使うプリンタの権限に
SYSTEM、IUSER_name、EVERYONEフルコントロール
を追加して実行しても結果が変わらなかったので
@が原因だと思いました。
長々となりましたがここで質問です。
自分で言っていて分かっていないんですけれども
"@IEの実行権限がない"というような事って実際にあるんでしょうか?
あれ。化けてますね。何故でしょう。
EUC-JPで開いた場合には
<STRONG><FONT SIZE="4">ばんのしゃーによかばんた</FONT></STRONG> さん
となるようですが。
そう言えば、こういうの
>say さん 2004年 11月 14日 23時 09分 48秒
>この話題をよく理解できていませんが VectorにVBSソースにヘッダを
>つけることで拡張子を.COMに変換してインタプリタを見かけ上実行せずに
>直接実行するというのがあります。.COMなので多分ファイルサイズに
>制限があると思いますがコンパイルとか考えるならこの方法が良いかも
もありましたね。
これと、先のスクリプトエンコーダを組み合わせると、
ARGS.VBS
――――――――――――――――――――――――――――――――――――――
Set wShell=CreateObject("WScript.Shell")
rows=Array(wShell.CurrentDirectory&vbCrLf)
For Each arg In WScript.Arguments
ReDim Preserve rows(UBound(rows)+1)
rows(UBound(rows))="'"&arg&"'"
Next
WScript.Echo Join(rows,vbCrLf)
――――――――――――――――――――――――――――――――――――――
をエンコードして、VBS2COMヘッダを先頭に付けて、名前を、
ARGS.EXE or ARGS.COM にしてます。
――――――――――――――――――――――――――――――――――――――
'?7%00%CCPY-@=PZ5+"P5ZJP^-p*P_-`yPW5KGP5I@P,=P_15$@P_,TP^-&!P5U PHHHPPQu
'Nide/com2txt/X40PR553P58APZVX5WtPR-O9P/-ssP5)eP@@RPZX,AP/5oNP5WI'P-"9PS
'?[XP5^?P-UrPRXRNNNNNN'!VBS2COM 1.05 2003-08-01
'!cLbcpPFcqPFcrPFKvHlnK@BK?k@JnP@`|jyt@~fZ@Hd~opFNqSO?L|B~rpFyB@CsigPMnP
'@`|jxfN@Uu{NmzdHoWnP@`Ic`E]@SrknowQt@fNPUuYD]Gb?^Npxl~opEGcmvy@BBpC_JnSz
'pzxGPCjnoxIlXEHD^Nv{zA@HhN`@@r{TGsiHo_b|^KOk|AJ|\m@`@|_g\cb@WGQPDoP{DDt~
'mCmDkMHWHQcmv{oPF|@@Fx@DoMHWHBLlBtSLta@@@@@@@@W@@@@Fp@@@ACStuSTDUCOP=
'! CScript.EXE //E:VBScript.Encode //NoLogo
#@~^9gAAAA==jY~S?4+V^';.+mYnr(Ln^D`JqjmMkwD jtV^Jb@#@&.Khd'z.DmXcAUt+sscZ;DMn Y9bDmYKDH'\(Z.S6#@#@&wWD,3l1tPm.LP&x,jm.raY bMLEs+UOk@#@&~~"+9ks~hDnk+M\+,DKA/vj$W!x[cMWhkb_8#@#@&~~DKhk`iAG; NcDKA/*#xEEJ[C.T[EBr@#@&1nXY@#@&UmMrwDR3m4W~BKkxv.WS/~78/Dd0*@#@&oUwAAA==^#~@
――――――――――――――――――――――――――――――――――――――
16ビットアプリなので、Windowsからはコンソールが開きます。:-p
コンソールから実行するか、
Windowsからなら、CScriptをWScriptに変えて、あと最小化で実行するとか、
してください。
JScriptが好きな人には、JS2COMもあります。
再び投稿させていただきます。
DOSプロンプトからSQL Serverに繋ぎ、osqlでDBの空き容量を取得するクエリーを探したところ、良い方法が思いつかずにネットで検索しました。
すると、あるサイトからVBSで直接取得できる方法を発見し、以下のようにして試したのですが、実行時に"ActiveXコンポーネントはオブジェクトを生成できません"と言われ、うまくいきません。
----------------------------------------------------------
Dim objServer
Dim objDatabase
Dim strFree
Set objServer = CreateObject("SQLOLE.SQLServer")
objServer.Connect "(localhost)", "sa", ""
For Each objDatabase In objServer.Databases
strFree = strFree & objDatabase.Name & " " & objDatabase.SpaceAvailable & "バイト" & vbCrLf
Next
objServer.Disconnect
Set objServer = Nothing
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("kekka.txt", 8, True)
objFile.WriteLine strFree
objFile.Close
-----------------------------------------------------------
どうやら5行目のSet objServer = CreateObject("SQLOLE.SQLServer") で
ひっかかるようなのですが、他に例や情報が見つからず悩んでいます。
※このホストではSQL Server2000が動いています。
当初はconnectからdbのselectまで一連のクエリを記述したsqlをbatファイルに読ませようかと考えたのですが、Enterpriseの仕組みが判らずsizeの取得方法に断念しました。
連投で申し訳ありませんがご回答いただきたく思います。
むたぐち様
早速のご教示ありがとうございます。お蔭様で実装することができました。
成程、プロセスをインスタンス数として扱うみたいですね。
以下のようにして、ファイルに落としました。
nProc = 0
sName = "svchost.exe"
For Each Process In GetObject("winmgmts:").InstancesOf ("win32_process")
If LCase(Process.name) = sName then
nProc = nProc + 1
End If
Next
uName = Now & "に確認したTAMアプリケーションのJAVAウィンドウ数は " & nProc & " です"
'結果記入
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("kekka.txt", 2, True)
objFile.WriteLine uName
objFile.Close
誠にありがとうございました。
》魔界の仮面弁士 さん 2005年 04月 13日 15時 00分 31秒
> 1. [ディレクトリ セキュリティ]タブ
> 2. [匿名アクセスおよび認証コントロール]の[編集]
> 3. [匿名アクセス]の項目
>
> ですね。
>
> ATコマンドの方は、サービスの"Task Scheduler"(Schedule)です。
さっそくやってみたんですが、印刷されませんでした。
ここでふと思った事があります。
実は権限がないのは、IEの実行権限なんではと。
といいますのも、コマンドプロンプトから実行すると
IEが立ち上がる→コンテンツが全て表示される→勝手に印刷が始まる→終わり(IE上がりっぱ)
このような順序で処理されています。
ゆえに、下記@Aのどちらかが原因ではないかと思います。
@IEの実行権限がない
Aプリンタの印刷実行権限がない
更に、通常使うプリンタの権限に
SYSTEM、IUSER_name、EVERYONEフルコントロール
を追加して実行しても結果が変わらなかったので
@が原因だと思いました。
長々となりましたがここで質問です。
自分で言っていて分かっていないんですけれども
"@IEの実行権限がない"というような事って実際にあるんでしょうか?
スクリプトエンコーダのサンプルです。
過去に"SCRENC.EXE"を使った例がありましたが、
"Scripting.Encoder"を使ったものがなかったので。
.VBSファイルをドロップします。
VBS2VBE.VBS
――――――――――――――――――――――――――――――――――――――
Set sce=CreateObject("Scripting.Encoder")
Set fso=CreateObject("Scripting.FileSystemObject")
FileName=WScript.Arguments(0)
Ext=Mid(FileName,InStrRev(FileName,"."))
Source=fso.OpenTextFile(FileName).ReadAll()
Source=sce.EncodeScriptFile(Ext, Source, 0, "VBScript")
FileName=Left(FileName,InStrRev(FileName,"."))&"VBE"
fso.CreateTextFile(FileName).Write Source
WScript.Quit
――――――――――――――――――――――――――――――――――――――
>つちや さん 2005年 04月 11日 14時 56分 46秒
>その実行ファイルは、実行の際にスクリプトを復号してファイルに書き出して実行します。スクリプトは実行後に削除します(よって、もとのスクリプトが同じフォルダにあったりすると上書きして削除しますので要注意)。
"Scripting.Encoder"でエンコードし、fso.TempName()の名前で作成し、
WScript.EXE //E:VBScript.Encode で実行すれば、よいのでは。
ところで、私はエンコードよりデコードのほうが気になるのですが、
スクリプトデコードするVBScriptはありません?
過去にCの例はありましたが、CをVBScriptにするのはちょっと面倒です。
>ばんのしゃーによかばんた さん 2005年 04月 12日 15時 18分 56秒
>かと思って、覘いてみると、.NETの実行ファイルにはソースがまんま入っているではありませんか。
と思ったのは、vbs2js.vbsがJScript.NETソースに埋め込んだVBScriptソースの文字列
でした。:-p
>ばんのしゃーによかばんた さん 2005年 04月 12日 16時 39分 04秒
>よく見ると、まんまなのは文字列だけですね。コードは見えません。
>なので、文字列だけ暗号化すればよいわけですが、それは面倒です。
"Scripting.Encoder"でエンコードして、Escapeして、埋め込み、
実行時はunescapeして、SC.Language='VBScript.Encode'で
スクリプトコントロールに投げます。
――――――――――――――――――――――――――――――――――――――
' vbs2jse.VBS converts VBScript to JScript.NET with VBE.
' Usage: vbs2jse vbsfile
Option Explicit
Dim fso
Dim fo
Dim iFile
Dim oFile
Dim oPath
Dim header
header="import System" & vbCRLF & _
"import System.Collections;" & vbCRLF & _
"var fso=new ActiveXObject('Scripting.FileSystemObject');" & vbCRLF & _
"var WScript=new Object();" & vbCRLF & _
"WScript.StdIn=fso.GetStandardStream(0);" & vbCRLF & _
"WScript.StdOut=fso.GetStandardStream(1);" & vbCRLF & _
"WScript.StdErr=fso.GetStandardStream(2);" & vbCRLF & _
"WScript.Echo=function(p){var pArray=new Array();" & vbCRLF & _
"for(var k=0;k<WScript.Echo.arguments.length;k++){pArray.push(WScript.Echo.arguments[k]);}" & vbCRLF & _
"WScript.StdOut.WriteLine(pArray.join(' '));}" & vbCRLF & _
"WScript.Arguments=function(n){return(Environment.GetCommandLineArgs()[n+1]);}" & vbCRLF & _
"var arguments:String[]=Environment.GetCommandLineArgs();" & vbCRLF & _
"var args:ArrayList=new ArrayList();" & vbCRLF & _
"for(var k=1;k<arguments.length;k++){args.Add(arguments[k]);}" & vbCRLF & _
"WScript.Arguments=args;" & vbCRLF & _
"WScript.Quit=function(n){Environment.Exit(n);}" & vbCRLF & _
"WScript.Sleep=function(msec:int){System.Threading.Thread.Sleep(msec);}" & vbCRLF & _
"var ext=fso.GetExtensionName(arguments[0]);" & vbCRLF & _
"if(ext=='') ext='EXE';" & vbCRLF & _
"WScript.ScriptName=fso.GetBaseName(arguments[0])+'.'+ext;" & vbCRLF & _
"WScript.ScriptFullName=fso.BuildPath(fso.GetParentFolderName(fso.GetAbsolutePathName(arguments[0])),WScript.ScriptName);" & vbCRLF & _
"WScript.FullName=WScript.ScriptFullName;" & vbCRLF & _
"WScript.Name=WScript.ScriptName;" & vbCRLF & _
"var SC=new ActiveXObject('ScriptControl');" & vbCRLF & _
"SC.Language='VBScript.Encode';" & vbCRLF & _
"SC.AllowUI=true;" & vbCRLF & _
"SC.TimeOut=-1;" & vbCRLF & _
"SC.AddObject('WScript',WScript,true);" & vbCRLF & _
"try{" & vbCRLF & _
"SC.ExecuteStatement(unescape("
Dim trailer
trailer="));" & vbCRLF & _
"}catch(e){" & vbCRLF & _
"WScript.StdOut.WriteLine('Number:' + SC.Error.Number);" & vbCRLF & _
"WScript.StdOut.WriteLine('Description:' + SC.Error.Description);" & vbCRLF & _
"WScript.StdOut.WriteLine('Source:' + SC.Error.Source);" & vbCRLF & _
"WScript.StdOut.WriteLine('Text:' + SC.Error.Text);" & vbCRLF & _
"WScript.StdOut.WriteLine('Line:' + SC.Error.Line);" & vbCRLF & _
"WScript.StdOut.WriteLine('Column:' + SC.Error.Column);" & vbCRLF & _
"}"
Dim line
Dim re
Set re=new RegExp
re.IgnoreCase=True
re.Global=True
Set fso=CreateObject("Scripting.FileSystemObject")
Dim sce
Set sce=CreateObject("Scripting.Encoder")
If Wscript.Arguments.Count<>1 Then
WScript.Echo "Usage: vbs2js vbsfile"
WScript.Quit
End If
Set fo=fso.GetFile(WScript.Arguments(0))
oPath=fso.BuildPath(fso.GetParentFolderName(fo.Path),fso.GetBaseName(fo.Name) & ".JS")
Set iFile=fso.OpenTextFile(fo.Path)
Set oFile=fso.CreateTextFile(oPath)
oFile.Write header
line=iFile.ReadAll
re.Pattern="$bWScript\.":line=re.Replace(line,"WScript.")
re.Pattern="\.StdIn$b":line=re.Replace(line,".StdIn")
re.Pattern="\.StdOut$b":line=re.Replace(line,".StdOut")
re.Pattern="\.StdErr$b":line=re.Replace(line,".StdErr")
re.Pattern="\.Echo$b":line=re.Replace(line,".Echo")
re.Pattern="\.Sleep$b":line=re.Replace(line,".Sleep")
re.Pattern="\.Arguments$b":line=re.Replace(line,".Arguments")
re.Pattern="\.Count$b":line=re.Replace(line,".Count")
re.Pattern="\.Item$b":line=re.Replace(line,".Item")
re.Pattern="\.Quit$b":line=re.Replace(line,".Quit")
re.Pattern="\.ScriptFullName$b":line=re.Replace(line,".ScriptFullName")
re.Pattern="\.ScriptName$b":line=re.Replace(line,".ScriptName")
re.Pattern="\.FullName$b":line=re.Replace(line,".FullName")
re.Pattern="\.Name$b":line=re.Replace(line,".Name")
line=sce.EncodeScriptFile(".VBS", line, 0, "VBScript")
line=Escape(line)
oFile.Write "'" & line & "'"
oFile.Write trailer
iFile.Close
oFile.Close
WScript.Quit
――――――――――――――――――――――――――――――――――――――
》シロウト さん 2005年 04月 13日 14時 31分 49秒
> 私も実行権限の問題では...。と思いIISマネージャをしらべていたんですが
> それらしいものがありませんでした。
管理ツールからなら、該当Webサイトのプロパティから、
1. [ディレクトリ セキュリティ]タブ
2. [匿名アクセスおよび認証コントロール]の[編集]
3. [匿名アクセス]の項目
ですね。
ATコマンドの方は、サービスの"Task Scheduler"(Schedule)です。
》魔界の仮面弁士 さん 2005年 04月 13日 13時 36分 30秒
さっそくご返事頂きありがとうございます。
> 権限の問題だと思います。
> サービスの実行アカウントを変更してみてください。
> 通常、コマンドプロンプトは、「ログイン中のユーザ」の権限で動作しますが、
> ATコマンドは SYSTEMアカウント、ASPは IUSER_nameアカウントで実行されます。
私も実行権限の問題では...。と思いIISマネージャをしらべていたんですが
それらしいものがありませんでした。
ATやASPからも共にバッチファイル自体は起動できているので
.wsf内の"IE.ExecWB"ステートメントがパーミッションエラー系で
正常動作しないのかなぁ??と思っています。
だらだらと自分の想像を述べてしまいすみません。
魔界の仮面弁士さんがおっしゃる下記の「サービス」とは何なんでしょうか?
> サービスの実行アカウントを変更してみてください。
素人質問ですみませんがご回答頂けますでしょうか。
》シロウトさん 2005年04月13日 11時31分55秒
> ただコマンドプロンプトから実行すると上手くいくのですが、
> ATコマンド指定の実行や、ASP組み込みでブラウザから実行すると
> なぜか動きません。
権限の問題だと思います。
サービスの実行アカウントを変更してみてください。
通常、コマンドプロンプトは、「ログイン中のユーザ」の権限で動作しますが、
ATコマンドは SYSTEMアカウント、ASPは IUSER_nameアカウントで実行されます。
こんにちは。
さっそくですが質問です。
「VBSでTIFFファイルを印刷する」という事をやりたいのですが、
InternetExplorer.Applicationオブジェクト+BASP21+ImageMagickのconvertコマンドを駆使して実行しています。
ただコマンドプロンプトから実行すると上手くいくのですが、
ATコマンド指定の実行や、ASP組み込みでブラウザから実行すると
なぜか動きません。
印刷する.wsfバッチファイル自体は正常実行され、エラーにもなっていないのに...
以下にバッチのソースコードを記述しますので、解決方法などご存知の方ご教授お願いします。
-----------------------------------------------------------------
Sub Main()
Dim MyFile
Dim IE
Const OLECMDID_PRINT = 6
Const OLECMDEXECOPT_DODEFAULT = 0
Const OLECMDEXECOPT_PROMPTUSER = 1
Const OLECMDEXECOPT_DONTPROMPTUSER = 2
Const OLECMDEXECOPT_SHOWHELP = 3
Const READYSTATE_COMPLETE = 4
call LOG_SetLogFile("C:\Inetpub\FAX\test\print.log")
call LOG_OutputLog("print.bat開始")
' MyFile = "http://localhost/FAX/img/flower.tif"
' MyFile = "http://localhost/FAX/img/logo.jpg"
MyFile = "C:\Inetpub\FAX\img\flower.jpg"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate2 MyFile
Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
IE.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER
Set IE = Nothing
if Err.Number <> 0 then
call LOG_OutputLog(Err.Description)
else
call LOG_OutputLog("no error")
end if
call LOG_OutputLog("print.bat終了")
End Sub
-----------------------------------------------------------------
上記以外よりもっと良いやり方があるようでしたら、
是非教えていただければと思います。
>ばんのしゃーによかばんた さん 2005年 04月 12日 15時 18分 56秒
>かと思って、覘いてみると、.NETの実行ファイルにはソースがまんま入っているではありませんか。
よく見ると、まんまなのは文字列だけですね。コードは見えません。
なので、文字列だけ暗号化すればよいわけですが、それは面倒です。
>コメント -> http://d.hatena.ne.jp/Fio/20050411
>スクリプトは192bit相当で軽く暗号化してますが、スクリプト実行の際に復号して一瞬ファイルに書き込んでますので、書き込んだ瞬間にそれをコピーすることができれば簡単にファイルの内容がわかります。そのこと知らない人にとっては、スクリプトの内容を取得するのはかなり難しくなると思いますが。実行したファイルはNULL文字で上書きしてから削除してます。
>MSScriptControlを使った実行にすれば、ファイルに書き出すことなく実行してしまえるので、スクリプト保護の目的を達することができると思いますが、WScriptオブジェクトが使えなくなるなど制限も多くなります。
とのことですが、
Execute CreateObject("Scripting.FileSystemObject").GetStandardStream(0).ReadAll
1行だけの.VBSファイルを作って、それをSet oExec=wShell.Exec "WScript.EXE "して、
oExec.StdIn.Writeでデコードしたスクリプトを与えれば、よいのでは。
>ばんのしゃーによかばんた さん 2005年 03月 12日 15時 56分 25秒
>CMD.EXEのコマンドグルーピング()の「障害」の回避方法です。
>ところが、CMD.EXEには「障害」があって、
>グルーピング()中の)が正しく処理されないのです。
さらに、<>のエスケープにも「障害」があるようです。:-<
グルーピング()中の<>が、パイプで繋いだときだけ、エラーになります。:-<
例えば、
(
ECHO Rem ^)
ECHO ^<head^>
ECHO Rem
)
の実行結果は、
C:\>(
ECHO Rem )
ECHO <head>
ECHO Rem
)
Rem )
<head>
Rem
でok
しかし、
(
ECHO Rem ^)
ECHO ^<head^>
ECHO Rem
)|MORE
の実行結果は、
C:\>(
ECHO Rem )
ECHO <head>
ECHO Rem
) | MORE
& の使い方が誤っています。
というエラーになります。&なんか使ってないのに。:-<
てなわけで、UnEscape()を使わざるを、得ない。(*注)
(
ECHO Rem ^)
ECHO %%3chead%%3e
ECHO %%3cscript language=vbscript%%3e
ECHO Set wShell=CreateObject("WScript.Shell"^)
ECHO wShell.PopUp("HOGE"^)
ECHO %%3c/script%%3e
ECHO %%3c/head%%3e
ECHO Rem
) | MSHTA.EXE vbscript:UnEscape(CreateObject("Scripting.FileSystemObject").GetStandardStream(0).ReadAll()) | MORE
PAUSE
(*注)
最近、テレビで、「使わ笊、負えない」「使わ去る、終えない」「使わ猿、追えない」
のどれかはわかりませんが、そういうつもりで言っているように聞こえるんです。
気のせいでしょうか?
P.S.
Windowsでは、コンソールはマイナとは云え、基本のCMD.EXEの障害ぐらいは枯れて欲しいっす。
CMD.EXE如きに未だにバグがあるなんて、きゃーなえ(強・萎え)ちゃいます。
表示中のHTMLソースから、スクリプト類を除去するJScriptです。
「お気に入り」や「リンク」から実行します。
scremove.js
――――――――――――――――――――――――――――――――――――――
var Shell=new ActiveXObject("Shell.Application");
var ie=Shell.Windows().Item();
if(!ie){WScript.Echo("IE Not Found");WScript.Quit();}
if(!ie.Document.parentWindow){
for(var k=0;k<Shell.Windows().Count;k++){
ie=Shell.Windows().Item(k);
if(ie.Document.parentWindow) break;
ie=null;
}
}
if(!ie){WScript.Echo("IE Not Found");WScript.Quit();}
var window=ie.Document.parentWindow;
for(var k=0;k<window.document.scripts.length;k++){
window.document.scripts(k).outerHTML='';
}
for(var k=0;k<window.document.all.length;k++){
for(var prop in window.document.all(k)){
if(prop.substr(0,2)=='on'){
window.document.all(k).setAttribute(prop,null);
}
}
}
var outerHTML=window.document.documentElement.outerHTML;
window.document.open();
window.document.write(outerHTML);
window.document.close();
――――――――――――――――――――――――――――――――――――――
一般に、
| IE上で「対象をファイルに保存(A)...」を行い、リンク先のファイルをローカルディス
| クの特定のファイルとして保存するには、どのようにすればよいのでしょうか?
のようなケースでは、XMLHTTP などを使用するのが通例のようですが、別解です。
別解が好きですね。>Me
download.htm or download.hta
――――――――――――――――――――――――――――――――――――――
<html><head>
<script language=vbscript>
Set wShell=CreateObject("WScript.Shell")
Sub btn1_onclick()
a1.href=text1.value
a1.innerText=text1.value
a1.focus
End Sub
Sub btn2_onclick()
btn2.blur
btn1_onclick
wShell.SendKeys "+{f10}a"
End Sub
</script>
</head>
<body>
<input type=text id=text1 maxlength=300 size=100 value="about:blank" onfocus="Me.select">
<br>
<button id=btn1>リンクを更新</button>
<button id=btn2>対象をファイルに保存</button>
<br>
<a id=a1 href="about:blank">about:blank</a>
</body></html>
――――――――――――――――――――――――――――――――――――――
>つちや さん 2005年 04月 11日 14時 56分 46秒
>唐突ですが、スクリプトエンコーダ作ってみました。スクリプトをD&Dすると実行ファイルを一つ作ります。スクリプトは実は暗号化されて実行ファイルにくっついているだけです。
以下と同じ?
>管理人むたぐち さん 2004年 11月 17日 09時 14分 46秒
>vbs2js.vbsでJScript.NETのコード(内部的にはScriptControlで
>VBScriptを実行している)に変換したものを、
>jsc.exeでコンパイルしたものを、*.cgiにリネームしたものです。
かと思って、覘いてみると、.NETの実行ファイルにはソースがまんま入っているではありませんか。
Excel VBAの場合はもう少しばらばらだったのに。
これなら別にコンパイルする必要なんてないのではありませんか?
.NETは、なんでコンパイルが必要なんでしょう?
単に、ソースとは別の情報をソースと一緒に、かつバイナリで保存したかっただけ?
To: シーズー大好き さん
WMIを使ってやればいいと思います。
例:
nProc = 0
sName = "javaw.exe"
For Each Process In GetObject("winmgmts:").InstancesOf ("win32_process")
If LCase(Process.name) = sName then
nProc = nProc + 1
End If
Next
MsgBox sName & "は" & nProc & "個起動しています。"