土屋 さん 2001年 11月 01日 16時 02分 13秒

Dear yuri さん

VBで使う場合は、プロジェクトメニューから参照設定を見て、
登録されているコンポーネント群が確認できると思います。

WSHの基本的なファイルは、wscript.exe(cscript.exe)と、
Windows Script Host Object Modelを提供するwshom.ocxですが、
このあたりはどうでしょうか。

yuri さん 2001年 11月 01日 10時 59分 10秒

土屋様
ありがとうございます。
>レジストリ登録を解除されていれば実行されないので、
これの確認方法はありますか。

いま、VBで作ったバッチプログラムでこのユーティリティーを使っているのですが、どうしてもエラーになってしまうのです。
エラーメッセージは「Active X」コンポーネントはオブジェクトを作成出来ません。
でした。
何か手がかりがあれば教えてください。

寺島 さん (terashima@d-web.co.jp) 2001年 11月 01日 09時 23分 37秒

特定のフォルダを作成しておき、そのフォルダにTextファイルをコピーすると自動に内容が見ることが出来るやり方ないですか。特定のフォルダに何か入れることで処理する方法を教えてください。

土屋 さん 2001年 11月 01日 08時 40分 59秒

Dear yuri さん

新規作成で、拡張子.vbsのファイルを作ってみて、アイコンが水色に変わったら、
WSHはOKです。

MsgBox "WSH OK!"

などと、実際に動かす手も。。
(WSH用のCOMファイル群があっても、レジストリ登録を解除されていれば実行されないので、
 ファイルの存在だけでは一概に判断できないのではとも思いますが、、、)

yuri さん 2001年 10月 31日 18時 17分 43秒

初歩的な話ですみません。
windowsNT Server (IE5.0インストール済み)にWSHが備わっているかどうか確認したいのですが、その方法を教えてください。
(あるファイルが存在していればOKとか)

yuri さん 2001年 10月 31日 18時 15分 52秒

初歩的な話ですみません
windowsNT Server (IE5.0課縦為済)にWSHが備わっているかどうかの確認をしたいのですが、何か目印となる箕荷がありますか?
(この筑リ個悗法@@kР戮「△譴弌△世い犬腓Δ箸@ΑΑΑヒ

土屋 さん 2001年 10月 31日 13時 24分 50秒

Dear tomi さん

> すみません。この方法、もう少し詳しく教えて頂けないでしょうか?

むたぐちさんの解説がありますので、詳しいことは抜きにしておきますが、
ShellApplicationで起動しているIEのオブジェクトができたら、
あとは、IEと同様に動かすことができます。(Navigateもできます)
とりあえず、基本構文を。
ただフレームに関しては、サイトによって、アクセス不可になります(なぜかわかりませんが)

Set Shell = CreateObject("Shell.Application")
'起動しているエクスプローラやIEの数を数えます。
intWindowCount = Shell.Windows.Count
'起動していなかったら終了
If intWindowCount = 0 Then WScript.Quit
'ひとつずつチェックしていきます。
For i = 0 To intWindowCount - 1
Set objWindow = Shell.Windows.item(i)
'もしもそれがIEだったら
If TypeName(objWindow.document)="HTMLDocument" Then
'もしもフレームが使われていたら、、
If objWindow.document.Frames.Length > 1 Then
For j = 0 To objWindow.document.Frames.Length - 1
MsgBox objWindow.document.Frames(j).document.body.innerTEXT
Next
Else
MsgBox objWindow.document.body.innerTEXT
End If
'目的を果たしたら出ます。
Exit For
End If
Next

tomi さん 2001年 10月 31日 12時 51分 12秒

土屋さん

>お陰様で、CreateObject("Internet.Explorer")せずに、
>閲覧中のIEをShell.Applicationでいろいろ遊べることがわかって、
>Shell.Applicationを見直しているところです。
>(閲覧していてこのページを保存したい、という時に、CreateObject
>("Internet.Explorer")
> だと新しくIEが立ち上がってしまうので、どうしたらいいのか考えていたので>すが、
> Shell.Applicationだったんですね。
> このサイトをちゃんと読むと分かることだったのに、今ごろ気づいたところで
>した)

すみません。この方法、もう少し詳しく教えて頂けないでしょうか?

tomi さん 2001年 10月 31日 12時 51分 04秒

土屋さん

>お陰様で、CreateObject("Internet.Explorer")せずに、
>閲覧中のIEをShell.Applicationでいろいろ遊べることがわかって、
>Shell.Applicationを見直しているところです。
>(閲覧していてこのページを保存したい、という時に、CreateObject
>("Internet.Explorer")
> だと新しくIEが立ち上がってしまうので、どうしたらいいのか考えていたので>すが、
> Shell.Applicationだったんですね。
> このサイトをちゃんと読むと分かることだったのに、今ごろ気づいたところで
>した)

すみません。この方法、もう少し詳しく教えて頂けないでしょうか?

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 31日 00時 25分 39秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

みなさんtbbバグってご存知?
今度はWin9xのconconとは違って、Win2000やXPのバグです。
\t\b\b(タブ+バックスペース*2)をコンソールに表示すると、OSが落ちるというとんでもないバグ。
バッチファイルでも再現可能なので、当然cscript.exeバージョンも作れるでしょう。(作るな)



To: たる さん

> ただ罠(gotcha)なことに、"about:blank"ではshowModalDialogメソッドをサポートするwindowオブジェクトが取得できないんです。

あれ、私のところでは、about:blankで開いたwindowオブジェクトからshowModalDialogメソッドを
呼び出して、その結果を新しいwindowオブジェクトとして取得することは可能でしたよ。

> と言うわけで、バリアント配列からバイト配列を返す関数CByteArrayを考えたので投稿します。

なかなかの力作ですねえ。
参考になります。



To: 筑集眺餅 さん

> をぉ。SQLじゃなくてWQLですか・・・。ウッキュエル?

Ruby256邪道編204ページを見よう!!
SQLを「シーケル」と読むときには、TPOをわきまえること。



To: 土屋 さん

> 私も直前までtype=fileで挑戦していたのですが、
> どうしてもclickがtype=fileだときかないので、セキュリティがかかっているのかなあ、
> と先送り(得意技)してました。

フォーカスかけてクリック、がポイントなんでしょうかねえ。

> 以前、JavaScriptでBase64やらLZH圧縮を行う技があることが紹介されましたが、
> ひょっとしたら、JavaScriptなら可能なのかな?(未確認)
> とすれば、.wsfを使って、バイト配列の部分だけJavaScriptを使うとか。。。

これ、検討してみる価値がありそうです。
次の日曜日のテーマはこれだな…。



To: 佐藤 さん

> VBScriptを使用してタスクのジョブを作成することはできますでしょうか?
> 実行するユーザや、実行時刻等設定できれば幸いです。

WMIかATコマンドを使えば可能です。
やり方については13-35 管理人むたぐち 2000/04/30 01:54 を参考にしてください。



To: 土屋 さん

> なんて見事な。

環境破壊活動とみなされたんでしょうねえ。
ご愁傷様です。

土屋 さん 2001年 10月 30日 19時 49分 24秒

今まで、共有コンピュータ(Win2000)のセキュリティをアップしようと、
アドミン権限でログオンしたあと、せっせとプログラムをインストールしたり、
共有フォルダを設定したり、WSHでレジストリをいじってファイル名を指定して実行コマンドを隠したり、
いろいろおこなって、さあ再起動!っと、再起動したら、、、
リカバリーソフトが自動で働いて、すべてが元に戻ってました。。。
インストールしたプログラムも、ローカルに保存しておいたデータも、すべてが、、、
時間だけが過ぎ去り、そしてコンピュータは見事に復元されました。
なんて見事な。(でも普通そこまでやるかなあ)
誰なの?このソフトをインストールしてたのはああああ

失礼しました。ついつい取り乱してしまいました。

佐藤 さん 2001年 10月 30日 15時 56分 09秒

はじめまして。早速ですが質問させていただきます。

VBScriptを使用してタスクのジョブを作成することはできますでしょうか?
実行するユーザや、実行時刻等設定できれば幸いです。

もしできるならやり方をお教えしてもらえますでしょうか?
宜しくお願いします。

土屋 さん 2001年 10月 30日 08時 53分 38秒

Dear むたぐち さん

> コモンダイアログを直に呼び出すこともできますね。

ブラボー!!
私も直前までtype=fileで挑戦していたのですが、
どうしてもclickがtype=fileだときかないので、セキュリティがかかっているのかなあ、
と先送り(得意技)してました。


Dear たる さん、むたぐち さん

>> ついでに言うと、バイト配列を(VBSの標準機能だけで)作ることもできません。

以前、JavaScriptでBase64やらLZH圧縮を行う技があることが紹介されましたが、
ひょっとしたら、JavaScriptなら可能なのかな?(未確認)
とすれば、.wsfを使って、バイト配列の部分だけJavaScriptを使うとか。。。

筑集眺餅 さん 2001年 10月 30日 08時 49分 29秒

To:むたぐちさん

>> 初めまして。 この板のリンク集から辿るとSQLのサンプルがあったので
>> 嬉しくて書き換えてみました。
>> WMIのことは知らないので、内容は聞かないで。(^^;)
>SQLじゃなくてWQL(WMI Query Language)です。
># すいません、くだらんつっこみで。
>## と、返信にコピペを使うのは反則だろうか。

をぉ。SQLじゃなくてWQLですか・・・。ウッキュエル?
(くだらん返しで、ひたすら ごめんなさい。)

管理人さんが戻ると掲示板がにぎやかですね。(^^)

たる さん 2001年 10月 30日 01時 06分 59秒

To: 土屋さん

"about:blank"が無効な値と言ったのは汎用性のありそうなことではありません。
なんとも、お騒がせしてしまって申し訳ありません。
例のループを経た後はwindowオブジェクトも取得できますし、そのプロパティも取れます。
ただ罠(gotcha)なことに、"about:blank"ではshowModalDialogメソッドをサポートするwindowオブジェクトが取得できないんです。

以前49-48 筑集眺餅 さんのクリップボードクラスを持って他のところで使う機会がありました。その時は、
IE6,Win98 IE5.5 Win Me 共にOKでした
引き合いに出してすいません。クリップボード操作と言えば、このスクリプトが便利なので。

それともう一点、
すごい。HTMLダイアログを使わなくてもModelessを実現していますね。
WSHで時間のかかるプログラムを実行するのに、プログレスバーがあれば便利かなと思っていたので是非とも作りたいところでした。
これならwindowオブジェクト以降をWSH側で操作出来るので受け渡す必要もないし、

To: 管理人むたぐち さん

>ついでに言うと、バイト配列を(VBSの標準機能だけで)作ることもできません。
>(Dim bytearray() As Byteが使えないから)
>WSH-MLでも話題になっていました。http://www.users.gr.jp/ml/archive/wsh/wsh3.asp
これが巷に聞くセーフ配列と言うやつなのですか。初めて見ます。
と言うわけで、バリアント配列からバイト配列を返す関数CByteArrayを考えたので投稿します。
(この関数はADO2.5以上必須)
これはそのMLで質問者の言っていた外部コンポーネントに当たるのか当たらないのか?
まぁ、他のところは公開する予定でなかったのでソースが汚いです。むやみに長いし。
なのであんまり見せたくないのですが、
皆さんのADODB.Streamライフ!?の一助になればと思います。
物はSJISテキストを投げるとそのものをEUCに変換する例のスクリプトです。(結局投げてしまった)

Option Explicit
Const csAsciiFile = "Ascii.tbl"
Const csTempFile = "./dataText.xml"
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Const adModeReadWrite = 3
Function selfPath()
'selfPath:ver0.03
'返り値:実行スクリプトのフォルダ名(最後\は含まず)
Dim strExecuteDir
On Error Resume Next
If IsEmpty(WScript) Then
strExecuteDir = self.location.pathname
Else
strExecuteDir = WScript.ScriptFullName
End If
Err.Clear
strExecuteDir = Replace(strExecuteDir, "/", "",1, 1)
strExecuteDir = Left(strExecuteDir, InStrRev(strExecuteDir, "\") - 1)
selfPath = strExecuteDir
End Function
Function CByteArray(avSrc,sTableFile)
'CByteArray:ver0.00
'返り値:バイト配列
Dim i, astSrc, astDest, buff

Set astSrc = WScript.CreateObject("ADODB.Stream")
Set astDest = WScript.CreateObject("ADODB.Stream")
astSrc.Type = adTypeBinary
astSrc.Mode = adModeReadWrite
astSrc.Open
astSrc.LoadFromFile sTableFile
astDest.Type = adTypeBinary
astDest.Mode = adModeReadWrite
astDest.Open
For i = 0 To UBound(avSrc)
astSrc.Position = CByte(avSrc(i))
astSrc.CopyTo astDest, 1
Next
astSrc.Close
Set astSrc = Nothing
astDest.Position = 0
buff = astDest.Read(-1)
CByteArray = buff
astDest.Close
Set astDest = Nothing
End Function
Sub MakeAsciiTable(sTableFile)
'MakeAsciiTable:ver0.00
'結果:0〜255までのAsciiテーブルを作成する
Dim objFS, objTS, sRead, i, astDest, astSrc

sRead = ""
For i = 0 To 256 - 2 Step 2
sRead = sRead & ChrW((i+1)*256+i)
Next
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
Set objTS = objFS.CreateTextFile(sTableFile, True, True)
objTS.Write sRead
Set objTS = Nothing
Set objFS = Nothing
Set astSrc = WScript.CreateObject("ADODB.Stream")
Set astDest = WScript.CreateObject("ADODB.Stream")
astSrc.Type = adTypeBinary
astSrc.Mode = adModeReadWrite
astSrc.Open
astSrc.LoadFromFile sTableFile
astSrc.Position = 2
astDest.Type = adTypeBinary
astDest.Mode = adModeReadWrite
astDest.Open
astSrc.CopyTo astDest, -1
astSrc.Close
Set astSrc = Nothing
astDest.SaveToFile sTableFile, adSaveCreateOverWrite
astDest.Close
Set astDest = Nothing
End Sub
Sub SJIStoEUC(filePath)
Dim astRes
Dim astDest
Dim sText
Dim objFS
Dim objTS
Dim sRead
Dim objFile
Dim bOdd
Dim lSize
Dim lPos
Dim sGT
Dim sBuff

Set astRes = Wscript.CreateObject("ADODB.Stream")
Set astDest = Wscript.CreateObject("ADODB.Stream")
astRes.Type = adTypeBinary
astRes.Mode = adModeReadWrite
astRes.Open
astRes.LoadFromFile csTempFile
astDest.Type = adTypeBinary
astDest.Mode = adModeReadWrite
astDest.Open
astRes.Position = 56
lSize = astRes.Size

Do
lPos = astRes.Position
sBuff = astRes.Read(1)
If AscB(sBuff) = 93 Then
astRes.Position = lPos
sGT = astRes.Read(6)
If CStr(sGT) = ChrW(&H5D5D) & ChrW(&H6726) & ChrW(&H3B74) Then
astDest.Write CByteArray(Array(93,93,62),selfPath & "\" & csAsciiFile)
Else
astRes.Position = lPos + 1
astDest.Write sBuff
End If
Else
astDest.Write sBuff
End If
Loop Until (astRes.Position >= astRes.Size - 12)
astDest.SaveToFile filePath, adSaveCreateOverWrite
astRes.Close
Set astRes = Nothing
astDest.Close
Set astDest = Nothing
End Sub
Dim objFS, objTS, sRead, objXML, cnDummy

Set cnDummy = CreateObject("ADODB.Connection")
If CDbl(cnDummy.Version)<2.5 Then
Set cnDummy = Nothing
Err.Raise 3120, , "指定のADOバージョンではありません。"
' WScript.Quit
End If
Set cnDummy = Nothing
If WScript.Arguments(0) = "" Then WScript.Quit
Set objFS = CreateObject("Scripting.FileSystemObject")
If Not objFS.FileExists(selfPath & "\" & csAsciiFile) Then MakeAsciiTable(selfPath & "\" & csAsciiFile)
Set objXML = CreateObject("Microsoft.XMLDom")
objXML.async = False

Set objTS = objFS.OpenTextFile(WScript.Arguments(0),1)
sRead = objTS.ReadAll
sRead = Replace(sRead, "]]>", "]]&gt;")
objTS.Close
objXML.loadXML("<root/>")
objXML.insertBefore objXML.createProcessingInstruction("xml","version=""1.0"" encoding=""euc-jp"""), objXML.documentElement
objXML.documentElement.appendChild objXML.createCDATASection(sRead)
objXML.save(csTempFile)
SJIStoEUC(WScript.Arguments(0))

objFS.DeleteFile(csTempFile)
'objFS.DeleteFile(selfPath & "\" & csAsciiFile)
Set objXML = Nothing
Set objFS = Nothing

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 30日 00時 29分 52秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

コモンダイアログを直に呼び出すこともできますね。

Set Ie = WScript.CreateObject("InternetExplorer.Application","IE_")

Ie.Navigate "about:blank"
Do While Ie.ReadyState<>4
WScript.Sleep 100
Loop

Set document=Ie.Document

document.Write "<html><body><input type=file id=txtFile></body></html>"

document.all.txtFile.focus
document.all.txtFile.click

MsgBox document.all.txtFile.Value

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 29日 22時 24分 38秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

あ、そうか。
Ie.Resizable=False を入れれば、最大化ボタンは無効化できますね。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 29日 21時 39分 35秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

Googleでもニュースグループの閲覧ができるようになっていること、ご存知でしたか?
http://groups.google.com/

microsoft.public.scripting.wshの記事なら、現在800スレッド程度が見られるようになっています。
(2001年4月からの記事)
http://groups.google.com/groups?hl=ja&group=microsoft.public.scripting.wsh
ただ、記事自体はどうも膨大に蓄積されているみたいで、検索をかけると
1998年の記事とかも引っかかってきます。

fjやjapanの記事も読めます。以前あった文字化け問題も解消されています。
# 日本語版Googleは、トップページからfjやjapanのグループに直接飛べるようにしておけば
# いいのに。

http://groups.google.com/groups?as_uauthors=Daisuke%20Mutaguchi%20&as_scoring=d
とかすると、私がこれまでネットニュースに投稿した記事が、ほぼ全部読めたりします。
…予想されるキーワード: Muraguchiってのはなんだよ(爆笑)

これは、はっきり言って使えます。



To: 土屋 さん

> IEで、<INPUT NAME="FileName" TYPE="file">だと、
> 参照ボタンを押して、コモンダイアログボックスを出すことができるんですね。

ファイルタイプフィルタとかが使えれば、便利なんですけどねえ。



To: 土屋 さん

> で、サンプルのThumb.vbsなんですが、これを実行すると、
> 作成されたファイルも新たな作成元対象に入ってしまい、
> 結局無限ループに陥ってしまいませんか?

なりますね。(Win2000+WSH5.6)
だんだんサムネイルの画質が劣化していくのが見所。(違)

> For Each objF in objFolder.Files
> って、最初のループの際に対象が確定するのではなくて、
> ループの途中で新しいファイルが追加されると、
> そのファイルも対象になっている感じです(環境依存なのかなあ)。

FileSystemObjectのコレクションは、ちょっと不可解なところが
ありますよね。
ずっと昔のバージョン(OS、IE、WSHともに)では、ループ中で
oFile.Name="NewName.ext"とかしても、変なことになりました。



To: SIGNAL9 さん

> 次回の更新の時には直しておきます…といっても、たぶん、次に
> コレに手をつけるときにはDoodle2(笑)とでもして、内部構造か
> ら見直して直しちゃいますので、互換性はなくなるでしょう(^^;)。

Doodle2、期待してますよ。
複数のキャンバスを持てるようになれば、ファイルの結合とか切り貼りとか
アニメ化とかが実装可能になりますよね。



To: 土屋 さん

> ところで、私もたる さんのshowModelessDialogのようなことをやってみたいと思い、
> 結局全然別のものができてしまいましたが、公開します。
> まあ、高度なことができないので、ただ単に、IEをフォーム代わりに使って、
> その値をWSHに呼び込んでいるだけですが、、、、

土屋さんのスクリプトをちょっと発展させて、VBSファイル単独でダイアログもどきを
出すスクリプトを作ってみました。
GetRef関数でボタンクリックイベントを捕捉しているところがポイントでしょうか。
結局IEのウィンドウであることに変わりはないので、タスクバーに表示されてしまいますし、
最大化、最小化ボタンも消せないのですが、まあ参考までに。

Set Ie = WScript.CreateObject("InternetExplorer.Application","IE_")

Ie.Navigate "about:blank"
Do While Ie.ReadyState<>4
WScript.Sleep 100
Loop

Set document=Ie.Document
Set window=document.ParentWindow

With Ie
.Top = window.screen.availHeight / 2-40
.Left = window.screen.availWidth / 2-150
.Width = 300
.Height = 80
.AddressBar = False
.MenuBar = False
.StatusBar = False
.ToolBar = False
End With

document.Write "<html><head><title>ファイル名を取得する               </title><style>BODY {font: 12 'MS UI Gothic';background: MENU; color: WINDOWTEXT; border-style: none; margin: 10; cursor: default}</style></head><body scroll=no><input type=file id=txtFile><input type=button value=OK id=cmdOK></body></html>"

Set document.all.cmdOK.onclick=GetRef("cmdOK_onclick")

Ie.Visible=True

Do
WScript.Sleep 100
Loop

Sub cmdOK_onclick()
IE.Quit
Msgbox document.all.txtFile.Value
WScript.Quit
End Sub

Sub IE_OnQuit()
WScript.Quit
End Sub

土屋 さん 2001年 10月 29日 16時 33分 07秒

何度も登場してすみません。

Dear SIGNAL9 さん

> うっと、これもぼくの環境だと初回のループの時しか見ないですね。

おそらくそうかとは思いましたが。。
どこまで環境のせいかわかりませんが、一応報告しておいた方がいいかと思いまして・・・

clipboardData.setDataの件もやはり報告しておいた方がいいかな、と思いまして。
WSHはIEやWSHのバージョン自体に左右されることが多いので、
他の人にも、って考える時には結構苦労しますね。(私は特に苦手でして)


ところで、私もたる さんのshowModelessDialogのようなことをやってみたいと思い、
結局全然別のものができてしまいましたが、公開します。
まあ、高度なことができないので、ただ単に、IEをフォーム代わりに使って、
その値をWSHに呼び込んでいるだけですが、、、、

【Dialog.vbs】Dialog.htmlと同じフォルダに置きます。
Set FS = CreateObject("Scripting.FileSystemObject")
FileName = FS.BuildPath(FS.GetParentFolderName(WScript.ScriptFullName),"Dialog.html")
Set FS = Nothing

Set IE = WScript.CreateObject("InternetExplorer.Application","IE_")
IE.Top = 20
IE.Left = 20
IE.Width = 650
IE.Height = 150
IE.AddressBar = False
IE.MenuBar = False
IE.StatusBar = False
IE.ToolBar = False
IE.Navigate2 FileName
IE.Visible = True

Do
WScript.Sleep 100
i = i + 1
Loop Until i > 6000 '10分後に自動で閉じます
IE.Quit
WScript.Quit

Sub IE_TitleChange(Text)
Select Case Text
Case "NowClose"
IE.Quit
Set IE=Nothing
WScript.Quit
Case "NowOK"
' ファイル名を取得した時に閉じない場合
' IE.Visible = False
Msg = IE.document.MyForm.FileName.Value
' IE.Quit
' Set IE=Nothing
MsgBox Msg
' WScript.Quit
End Select
End Sub

Sub IE_OnQuit()
'一応、IEが閉じられるときにWSHも終えるようにしておかないと
MsgBox "WSHも終了します"
WScript.Quit
End Sub

【Dialog.html】Dialog.vbsと同じフォルダに置きます。
<HTML lang="ja">
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis" />
<META HTTP-EQUIV="Content-Script-Type" CONTENT="text/vbscript" />
<META NAME="content-language" CONTENT="ja" />
<TITLE></TITLE>
<SCRIPT LANGUAGE="VBScript" TYPE="text/vbscript">
<!--
Sub doCopy()
document.parentWindow.clipboardData.setData "text",document.MyForm.FileName.Value
MsgBox "以下のデータがコピーされました。" & vbCrLf & document.parentWindow.clipboardData.getData("text")
End Sub

Sub window_onload()
document.MyForm.FileName.focus()
End Sub
-->
</SCRIPT>
</HEAD>
<BODY style="background-color:Ivory;margin:10;">
<FORM NAME="MyForm">
ファイル名を入れて下さい。<BR>
<INPUT NAME="FileName" TYPE="file" SIZE=100><BR>
<INPUT NAME="OK" TYPE="button" VALUE="データをWSHに送る" OnClick="document.title='NowOK'">
<INPUT NAME="Copy" TYPE="button" VALUE="コピーする" OnClick="doCopy()">
<INPUT NAME="Close" TYPE="button" VALUE="このまま閉じる" OnClick="document.title='NowClose'">
</FORM>
</BODY>
</HTML>

SIGNAL9 さん 2001年 10月 29日 14時 52分 27秒

>作成されたファイルも新たな作成元対象に入ってしまい、
>結局無限ループに陥ってしまいませんか?

うっと、これもぼくの環境だと初回のループの時しか見ないですね。
BMPを一個変換して終了します。
ちょっと今NT以外の環境がないので確かめられませんが、
FileSystemObjectってそういう仕様だったのでしょうか?
ただ、おっしゃるとおり、このサンプルは配慮が足りませんでした。

FolderName = Left( wScript.ScriptFullName,
Len(wScript.ScriptFullName) - Len(wScript.ScriptName))

この行を適当な画像のあるディレクトリすべきでしたねm(__)m

次回の更新の時には直しておきます…といっても、たぶん、次に
コレに手をつけるときにはDoodle2(笑)とでもして、内部構造か
ら見直して直しちゃいますので、互換性はなくなるでしょう(^^;)。

土屋 さん 2001年 10月 29日 13時 12分 33秒

おおっ。最近なんだか出番が多いぞ。

Dear SIGNAL9 さん

> おっかしいなぁ(ちなみにぼくの環境NT4SP6ではOKなんですが…OS依存?)。

昼間使っている2号機(98SE)の方では大丈夫でした。お騒がせしました。
夜用の1号機(Me)の方はあとで試してみます。

で、サンプルのThumb.vbsなんですが、これを実行すると、
作成されたファイルも新たな作成元対象に入ってしまい、
結局無限ループに陥ってしまいませんか?
For Each objF in objFolder.Files
って、最初のループの際に対象が確定するのではなくて、
ループの途中で新しいファイルが追加されると、
そのファイルも対象になっている感じです(環境依存なのかなあ)。

SIGNAL9 さん 2001年 10月 29日 09時 21分 35秒

>土屋さん

>でも、試してみたら、ConvertFileの際に、「致命的なエラーです」というのが>でます。
>これはどうしたらいいんでしょう?
>(いくつかのサンプルファイルで試したのですが、、)

げげっ。
SampleのTEST01.VBSで例外になりますか?
おっかしいなぁ(ちなみにぼくの環境NT4SP6ではOKなんですが…OS依存?)。
いっぺんRegsvr32 /U で削除して、再度登録しなおしてみても駄目でしょ
うか。

土屋 さん 2001年 10月 29日 09時 13分 33秒

> about:blankでも、windowsオブジェクトは取得しているみたいなんですが、
> clipboardData.setDataやgetDataがきかないですね。

> 他に98系でIE5.5か6.0使っている方はどうでしょう?

あれ、WinMe&IE5.5はきかないのに、Win98SE&IE6だときいている。
不思議。


IEで、<INPUT NAME="FileName" TYPE="file">だと、
参照ボタンを押して、コモンダイアログボックスを出すことができるんですね。
でも、このボタンにはキーイベントがきかないようになってますね(セキュリティ関係かな?)
これを利用してWSHでコモンダイアログボックスが出せるかなと思ったんですが、
惜しかった。。。

土屋 さん 2001年 10月 28日 20時 25分 35秒

Dear むたぐち さん

> about:blankのソースは、「<HTML></HTML>」になってまして、windowオブジェクトは
> 取得可能です。

about:blankでも、windowsオブジェクトは取得しているみたいなんですが、
clipboardData.setDataやgetDataがきかないですね。
試しに、「<HTML></HTML>」のソースやそれすらもない空白のHTMLファイルを作って、
それをnavigateして操作すると、setDataやgetDataがききます。
不思議。
他に98系でIE5.5か6.0使っている方はどうでしょう?

> 一応IEにはセキュリティゾーンというものがありまして、
> Web上に存在するHTMLが属する「インターネットゾーン」と、
> ローカルで実行されるHTMLが属する「マイコンピュータ」が
> 分けられています。

実はローカルのHTMLに対して怖いと思っていることなんですが、
たとえばスクリプトでFileSystemObjectを使ったサイトがあったとして、
これは、当然インターネットゾーンでは実行できないわけです。
それで大丈夫だったページをたとえばローカルに保存して、
それを開いたとします。
ローカルでたとえばFSOが実行できるようにセキュリティをさげておくと、
Web上では発動しなかったスクリプトがローカルということで実行されてしまうわけです。

確かに、レジストリを変更して、IE3の初期にあったようなWSHを実行してしまえる
状態(バグでしょうね)することも可能ですが、やはり危険な気がします。


Dear たる さん

> VBSでHTMLダイアログを呼ぶラッパー関数を考えたので投稿します。

う〜ん。すごい。
いろいろ勉強になります。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 28日 18時 30分 51秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 土屋 さん

> > ("about:blank"は値の受け渡し上無効な値です)
> > なので、引数にはMSのHTMLダイアログのサンプルにあるようにwindowとか
> > documentが使用できません。
>
> そうだったんですね。
> IE.Navigate "about:blank"
> を変えたら、クリップボード操作ができました。

あれ?
うちのところでは動きますが…。
(Win2000+IE6)

about:blankのソースは、「<HTML></HTML>」になってまして、windowオブジェクトは
取得可能です。
NT系と9x系では違うのかもしれません。

土屋 さん 2001年 10月 28日 18時 15分 35秒

Dear むたぐち さん

とべ!イサミ ってマンガのことだと思ってました。
そんなせりふがあった気が。。。

土屋 さん 2001年 10月 28日 18時 13分 35秒

Dear たる さん

> ("about:blank"は値の受け渡し上無効な値です)
> なので、引数にはMSのHTMLダイアログのサンプルにあるようにwindowとか
> documentが使用できません。

そうだったんですね。
IE.Navigate "about:blank"
を変えたら、クリップボード操作ができました。


実は、Shell.Applicationはフォルダ選択ダイアログ以外に使わない、
なんて言いながら、Shell.Applicationを使って、
現在閲覧中のIEを操作する方法をいろいろ試していまして、
完全htmlで保存する際に、ファイル名をクリップボードから貼り付けようなんて考えて、
昔使ったクリップボードのサンプルスクリプトを使ってみたらできないではありませんか。
ということでお騒がせしました。

お陰様で、CreateObject("Internet.Explorer")せずに、
閲覧中のIEをShell.Applicationでいろいろ遊べることがわかって、
Shell.Applicationを見直しているところです。
(閲覧していてこのページを保存したい、という時に、CreateObject("Internet.Explorer")
 だと新しくIEが立ち上がってしまうので、どうしたらいいのか考えていたのですが、
 Shell.Applicationだったんですね。
 このサイトをちゃんと読むと分かることだったのに、今ごろ気づいたところでした)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 28日 17時 48分 52秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

どうもです。
大量の記事に囲まれながら、どこから手をつけていいやらわかりませんが、
緊急度が高そうなもの、未解決問題を優先して、返信書き行ってみようと思います。



To: 土屋 さん

> > 近藤勇というと、「イサムではない。イサミだっ」というフレーズが思い浮かぶんですが
>
> ひょっとしたら、スターウォーズ風の危ないアイテム持ってたりしません?
> 小学生がああいうもので遊んじゃいかんなあ。

うーん。これはなんのことかわからないです。
フレーズのネタ元は筒井康隆なんですが…。



To: わかぞう さん

> VBでツリービューを使わないといけなくなぅたんですが
> 「選択したノード情報を取得して変数に入れて次の画面へ遷移」
> のやり方がよく分かりません。

NodeClickイベントを使えばいいと思います。



To: 【おじさま】 さん

> やっと 5.6 日本語版が単体で登場したようです。ちゃんと調べていませ
> んが IE6.0 に含まれるものよりも一部新しいファイルもあるとか(嘘か
> もしれない)。

いつも【おじさま】さんのWSHやIEの新バージョン登場アナウンスには
お世話になっています。
WSHのページをやっている私としては、真っ先に更新情報を得て
皆様にお伝えしたいところですが、いつも【おじさま】さんのスピードには
負けてしまってますね(^^;
それではいかん(こともないですが)とばかりに、WWWCを導入して
http://www.asia.microsoft.com/Japan/Developer/Scripting/default.htm
を監視していたんですが、こちらはいまだに更新されてないですね。
詰めが甘かった。



To: 筑集眺餅 さん

> さて、IEを使ってクリップボードにアクセスする技がありましたが、
> それでクリップボードのクラスを作ってみました。
> いかにもオブジェクト風に書けるのが面白いと思います。

ClassステートメントをVBSファイル中で活用しているのは初めて見ました。
面白いですね。



To: 筑集眺餅 さん

> 初めまして。 この板のリンク集から辿るとSQLのサンプルがあったので
> 嬉しくて書き換えてみました。
> WMIのことは知らないので、内容は聞かないで。(^^;)

SQLじゃなくてWQL(WMI Query Language)です。
# すいません、くだらんつっこみで。
## と、返信にコピペを使うのは反則だろうか。



To: uraken さん

> VBSで共有フォルダを作成したいのですが
> どのようにすればよいのでしょうか

ダウンロードのページにWMIを使ったサンプルがあります。



To: 土屋 さん

> たとえば次のようなスクリプトを自分用に設定しておきます。
> (これはパスフレーズから擬似乱数を作り、それからパスワードを生成する方法をとってます)
> これを普段使うコンピュータ(またはサイト)に置いておいて、必要なときに実行します。
> すると入力された言葉をもとにパスワードが生成されるので、これをパスワードに登録しておくわけです。
> スクリプトが同じであれば同じ言葉をいれれば同じパスワードが生成されるので、
> 日本語のフレーズを覚えておけばいいわけ。

スクリプトが実行できない環境でパスワードが必要になったらどうしましょう(^^;
あと、このスクリプトを実行したとき、画面上にパスワードが直で
表示されてしまうのも、ちょっと考え物かもしれませんね。
# 周囲に人がいない環境なら問題なしですが。電磁波盗聴という可能性もあるが…。


To: たる さん

> アドバイスありがとうございます。
> と言うわけでやってみました。
> 取りあえず]]>以外は、変換出来るようになりました。
>
> でもまぁ、タイミング逸したし、用途もないし、公開するまでもなくお蔵入りだな。

え、なんかもったいないので、せっかくだから公開されませんか?

> FSOと比べると、TrancateとかBinaryReadWriteはできるけど
> 切り詰め、挿入をするにはもう一つコピー先ストリームを用意する必要があります。
> なぜWriteメソッドがあるのに内容の編集ができない?
> 要点はReadメソッドで返されるByte配列が読み取り専用(では無いけれど配列要素を指定できない)と言うところにあるとおもいます。
> abytStream = astFile.Read(6)
> として出来たByte配列abytStreamに対して、何も変更せずにWrite abytStreamはできるんだけど。
> ReDim Preserve abytStream(4)とかもダメ
> abytStream(2)=CByte(32)とかもダメ

いろいろ調べてみて、問題の本質が、
「VBSではバイト配列の要素を取り出すことができない」という点にあることがわかりました。
UBound(bytearray)とかはできるんですけど、bytearray(1)とかFor Eachとかがダメ。
ついでに言うと、バイト配列を(VBSの標準機能だけで)作ることもできません。
(Dim bytearray() As Byteが使えないから)
WSH-MLでも話題になっていました。http://www.users.gr.jp/ml/archive/wsh/wsh3.asp

ちなみに、BASP21のSplitBメソッドを使うと、バイト配列を普通の配列に分解できます。
BASP21を併用すれば、バイナリストリームの編集が可能になるわけですが、
それだったら最初からバイナリファイルの読み込みにもBASP21を使えばいいわけで。

> 最後になりますが、質問があります。
> タイムスタンプを任意の日付に偽造したいんですけれど、Wshでやるにはどうしたらよいんでしょうか。

できないんじゃないでしょうか。
touchをWshShell.Runするくらいしか…。



To: 筑集眺餅 さん

> 忙しそうですね〜。
> 最近、常連化しつつあり・・・。(^^;)

いつもありがとうございます。この掲示板、立ち上げ当初は常連さんがなかなか
定着せず、苦労しておりましたが、最近は常連さんも増え、管理人としては
大変助かっております。



To: 土屋 さん

> これはセキュリティを下げればできないわけではないでしょうが、
> そのままインターネットに接続したりすると非常に危険なので、
> できない方が無難だと思います。

一応IEにはセキュリティゾーンというものがありまして、
Web上に存在するHTMLが属する「インターネットゾーン」と、
ローカルで実行されるHTMLが属する「マイコンピュータ」が
分けられています。
ただ、「マイコンピュータ」は、デフォルトではセキュリティ設定が
ダイアログからできないようになっていて、できるようにするためには
レジストリの書き換えが必要です。やり方は掲示板ログのどっかにあるでしょう。

> ファイル拡張子をhtaに変えてしまえば、可能です。

HTAはIE5以降ですね。

> Kconvは、UNICODEとJIS以外の場合は、バイト配列を返すので、そのままではエラーになります。
> そこで、バイト配列を文字列に変換する作業が必要となりますが、
> このあたりは詳しくないので、本家BASP21のレスポンスセンターで過去レスを探すと、
> 確か馬場さん自身によるレスがあったように記憶しています。

これもVBSでバイト配列が扱えないという仕様によるものですね。


To: たる さん

> VBSでHTMLダイアログを呼ぶラッパー関数を考えたので投稿します。

これすごいですね。
まるでWSHがインターフェースを持ったかのような振る舞いを見せてくれて、
嬉しくなってしまいます。

スクリプト中で使われているさまざまな技も要注目ですね。
IsEmpty(WScript)でホスト判別するのは、いいアイデアだなあと思いました。



こんなところかな。
もしなんか飛ばしてるところとか、ありましたらご指摘ください。

土屋 さん 2001年 10月 28日 17時 40分 47秒

Dear SIGNAL9 さん

おお、Doodleが画像縮小対応でバージョンアップしてたんですね。
ありがとうございます。
でも、試してみたら、ConvertFileの際に、「致命的なエラーです」というのがでます。
これはどうしたらいいんでしょう?
(いくつかのサンプルファイルで試したのですが、、)


Dear 志田 さん

> 勉強不足でして、htaというものを知りませんでした。
> 早速やってみたのですが、単純にhtmlの拡張子をhtaとすれば良いのでしょうか?
> やってみたところ、ソースが表示されるのみでフォームは表示されませんでした。

htaの詳しいことは、このサイトのリンクのページからたどるといろいろわかります。
IEの5以上が必要なのですが、WinCEのIEに対応しているかどうかはわからないです。

Pocket Excelなんかも、軽い分、VBAなどは動かせるような気もしないし、
外部からのExcel編集をローカルで行うのはちょっと難しい感じもします。


閑話休題。
IE経由でクリップボードを操作しようと、
次のようなスクリプトを試してみたんですが、
エラーはでないんですが、クリップボードには変化なしです。
どこかおかしいんでしょう???
IE5.5&WinME
IE6.0&Win98SE
の環境です。

Set IE = WScript.CreateObject("InternetExplorer.Application")
IE.Navigate "about:blank"
IE.Visible = True
While(IE.busy):Wscript.Sleep 100:Wend
IE.Document.parentWindow.clipboardData.setData "text","あいうえお"
MsgBox IE.Document.parentWindow.clipboardData.getData("text")
IE.Document.parentWindow.clipboardData.clearData "text"
IE.Quit

たる さん 2001年 10月 28日 15時 58分 59秒

VBSでHTMLダイアログを呼ぶラッパー関数を考えたので投稿します。
まずはじめにお断りですがあくまでラッパーしているのは呼び込むところでありダイアログでないと言うことです。
呼んで値を返すためには製作者が意識して双方のパラメータ整合しなくてはいけません。
htaでは自身がwindowオブジェクトを持っているのでこんなことをしなくていいのですが、VBSはwindowオブジェクトを持っていません。
なので、ダイアログ自身のHTMLをナビゲートし、そのwindowオブジェクトで値をスルーしつつダイアログを呼び出します。("about:blank"は値の受け渡し上無効な値です)
なので、引数にはMSのHTMLダイアログのサンプルにあるようにwindowとかdocumentが使用できません。ここでは暫定的にDomDocumentを与えて同じポインタを返しています。
値渡しなら、同じものでなくて構いません。

これの応用としてパスワード入力とかテキストボックスでもディフォルト値を持っているとかIMEがオンになっているとかのもろもろ混成ダイアログが考えられます。
もちろん、大きさ、配置位置もVBS側で設定できます。

本当はクラスオブジェクト化してshowModelessDialogを使いたかったのですが、
技量不足で、値変更イベントのfire方法が見つからなかったので、まぁModalだったら関数でもいいやと。

以下ソースとなります。2つのファイルを、なるべく同じディレクトリにおいてVBS側を実行してください。
- - ->VBS側
Option Explicit
Function selfPath()
'selfPath:ver0.03
'返り値:実行スクリプトのフォルダ名(最後\は含まず)
Dim strExecuteDir
On Error Resume Next
If IsEmpty(WScript) Then
strExecuteDir = self.location.pathname
Else
strExecuteDir = WScript.ScriptFullName
End If
Err.Clear
strExecuteDir = Replace(strExecuteDir, "/", "",1, 1)
strExecuteDir = Left(strExecuteDir, InStrRev(strExecuteDir, "\") - 1)
selfPath = strExecuteDir
End Function
Function ModalDialog(sDialogHTML, oxmlParam, sInitSetting)
Dim IE, eleTree, nodSet, oxmlReturn, bParamObj, sType, sText

Set IE = WScript.CreateObject("InternetExplorer.Application")
If InStr(sDialogHTML,":")=0 Then 'ローカルの相絶対判別、まだ甘いので注意。
IE.Navigate "file:///" & selfPath & "\" & sDialogHTML
Else
IE.Navigate "file:///" & sDialogHTML
End If
Do While IE.Busy
Wscript.Sleep 10
Loop
'IE.Visible = True 'デバッグ用
Set oxmlReturn = IE.document.parentWindow.showModalDialog(sDialogHTML,oxmlParam,CStr(sInitSetting))
Set ModalDialog = oxmlReturn
Set oxmlParam = Nothing
Set oxmlReturn = Nothing
Set IE = Nothing
End function
'ここ以降を自由に改変してください。
Dim oxmlParam
Dim oxmlResult
Dim sXML
sXML = "<?xml version=""1.0""?>" & vbCrLf & _
"<root>" & vbCrLf & _
"<select>" & vbCrLf & _
"<option value=""キー1"">北海道</option>" & vbCrLf & _
"<option value=""キー2"">東北</option>" & vbCrLf & _
"<option value=""キー3"">関東</option>" & vbCrLf & _
"<option value=""キー4"">東海</option>" & vbCrLf & _
"<option value=""キー5"">関西</option>" & vbCrLf & _
"<option value=""キー6"">中国</option>" & vbCrLf & _
"<option value=""キー7"">四国</option>" & vbCrLf & _
"<option value=""キー8"">九州</option>" & vbCrLf & _
"<option value=""キー9"">その他</option>" & vbCrLf & _
"</select>" & vbCrLf & _
"</root>" & vbCrLf
Set oxmlParam = Wscript.CreateObject("Microsoft.XMLDom")
oxmlParam.async = False
oxmlParam.loadXML(sXML)
Set oxmlResult = ModalDialog("hogehoge.html", oxmlParam ,"status:no;resizable:no;dialogWidth:205px;dialogHeight:105px;dialogLeft:300;dialogTop:60")
If oxmlResult.selectNodes("//key").length = 1 Then
Msgbox "ダイアログから受け取った値は" & oxmlResult.selectSingleNode("//key").text & "です。"
End If
Set oxmlResult = Nothing

- - ->HTML側(仮にhogehoge.html)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML ID="myDialog" lang="ja">
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis" />
<META HTTP-EQUIV="Content-Script-Type" CONTENT="text/vbscript" />
<META NAME="content-language" CONTENT="ja" />
<TITLE>地区選択画面                            </TITLE><!--Webページダイアログの記述を隠したい-->
<SCRIPT LANGUAGE="VBScript" TYPE="text/vbscript">
<!--
'ここから変更不可
Dim oxmlReturn
Sub window_onload()
Dim elmSelect
On Error Resume Next '1回目のonloadのため
Set oxmlReturn = dialogArguments
Err.Clear
'ここまで
Set elmSelect = oxmlReturn.selectSingleNode("//select")
elmSelect.setAttribute "id", "childSelect1"
elmSelect.setAttribute "style", "width:100%;"
divSelect.innerHTML = elmSelect.xml
childSelect1.focus()
End Sub
Sub dataChk()
Dim bytCode
bytCode = window.event.keyCode
Select Case bytCode
Case 13
' bytCode = 0
LeaveDialog(True)
Case 27
' bytCode = 0
LeaveDialog(False)
End Select
window.status = CStr(bytCode)
End Sub
Sub LeaveDialog(bOK)
Dim elmTree
If bOK Then
Set elmTree = oxmlReturn.createElement("key")
elmTree.appendChild oxmlReturn.createTextNode(childselect1.options(childselect1.selectedIndex).value)
oxmlReturn.documentElement.appendChild elmTree
oxmlReturn.documentElement.setAttribute "returnValue", "true"
Else
oxmlReturn.documentElement.setAttribute "returnValue", "false"
End If
Set returnValue = oxmlReturn
window.Close
End Sub
Sub window_onunload()
'ここから変更不可
If Not IsObject(returnValue) Then
On Error Resume Next '2回目のonunloadのため
Set returnValue = oxmlReturn
Err.Clear
Set oxmlReturn = Nothing
End If
End Sub
'ここまで
-->
</SCRIPT>
</HEAD>
<BODY onkeyPress="dataChk()" style="background-color:menu;margin:10;">
<div id="dispText" style="font-size:10pt;"></div>
<TABLE BORDER="1">
<TR>
<TD COLSPAN="2"><div id="divSelect" style="width:100%;"></div></TD>
</TR>
<TR>
<TD><input type="button" value="OK" style="width:60pt;" onclick="LeaveDialog(True)" /></TD>
<TD><input type="button" onclick="LeaveDialog(False)" value="キャンセル" style="width:60pt;" /></TD>
</TR>
</BODY>
</HTML>

ゆう さん 2001年 10月 28日 15時 37分 16秒

To:志田さん
以前私も同様のことをしたいと思い調べたことがあります。
そのときは、CEの環境ではなく普通のWinな環境でした。
結構昔なので記憶があいまいですが、ブラウザ(IE限定)からローカルへ
アクセスするようなスクリプトはエラーが戻って実行できなかった
ように思います。
志田さんの言うように、セキュリティの関係上IEの仕様がその様に
なっていたはずです。
ですので、GetObjectするのは不可能な気がします。

外していたら、ゴメンナサイ。
もしこれができたら教えてください。活用範囲が広がりますね。



たる さん 2001年 10月 27日 11時 28分 32秒

To: 志田 さん
もう、過去ログで解決されていると思われますが。

 既知の前提条件
OS:WinCE
ブラウザ:PocketIE
 確認
MSHTA.EXEは内包されていない?
GetObjectを使用:更新中のブックを変更したい?

ちなみに、CreateObjectは出来るのにGetObjectを使用したいというのは
何かわけがあるのでしょうか?
私にはGetObjectを使ったうまくいくVBSが書けなかったので、その内容次第ではうまくお答えできません。
ましてやWinCE機も持っていませんし。

GetObjectで作業中のBookを更新→ソースの提示(うまくいくVBSのほうも)
CreateObjectでExcelファイルを更新→過去ログ参照
もしやPocketExcelではマクロが実行出来ない?
前提の欠如している可能性には意味ありませんので、この辺で。

たる さん 2001年 10月 27日 09時 55分 24秒

To: セイウンスカイ♪ さん

プログラム見直してみて、ASPでやっていることに気がついて愕然。
冒頭に
<%@ Language="VBScript"
@CODEPAGE=932 %>
<%
Response.Charset="x-EUC-jp"
以降ASPコード
とかやって
普通に出力じゃダメなんですか?

志田 さん 2001年 10月 26日 12時 37分 56秒

Dear 土屋さん
返信ありがとうございます。

>IISやPWSを立ち上げて、使用しているパソコンをサーバーにしてしまって、
>ASPを動かせば、エクセルファイルの更新がブラウザから可能になります。
その通りなんです。
しかし、今回ローカルのマシンのOSがWinCEで、しかもPocketなのです。
さすがにこの環境ですとPWSでも難しいような気がしてそちらの方向には
進んでいません。

>ファイル拡張子をhtaに変えてしまえば、可能です。
>ただ、これだとブラウザがローカル仕様になるので、

勉強不足でして、htaというものを知りませんでした。
早速やってみたのですが、単純にhtmlの拡張子をhtaとすれば良いのでしょうか?
やってみたところ、ソースが表示されるのみでフォームは表示されませんでした。
何か手順があるのでしょうか?
もう少し調べてみます。もしヒントがありましたらご教授お願いします。


志田 さん (shida@ae.keio.ac.jp) 2001年 10月 26日 12時 18分 33秒

To:たるさん
返信ありがとうございます。
言葉不足でした、すみません。
前提条件は、全てローカルマシン上での完結でWebでの使用は想定していません。
たるさんの言われるように、サーバー側にASPやCGIを仕込み、WebDBを
構築することはできているのですが・・・

実現したいことは、ブラウザから入力したデータは、サーバーへは更新しません。
ローカルドライブ(自分自身が持つ)のDBへ更新をかけるだけです。
このDBは、バッチで別の時に更新します。
具体的にできないことは、HTMLのコード内に記述したスクリプトでは
GetObjectでExcelのObjectがSetできません。
しかし、新規にCreateObjectすることは出来てしまい、SaveAsでの保存も
可能です。

なんとも不思議な感じです。
でも冷静に考えると、ローカルドライブへのアクセスが可能になると
Web閲覧者のファイルを如何様にも操作できてしまうので、できない仕様に
ブラウザはなっているのでしょうか?
すみませんが、そのあたりの情報がございましたらお願いします。

土屋 さん 2001年 10月 26日 12時 16分 00秒

Dear 志田 さん

> 1.HTMLに埋め込んだスクリプトからは、ローカルファイルへ
>  アクセスし、更新をかけることができないのでしょうか?

これはセキュリティを下げればできないわけではないでしょうが、
そのままインターネットに接続したりすると非常に危険なので、
できない方が無難だと思います。

> 2.もし、1.が不可能な場合インタフェイスをブラウザにして
>  そこら入力されたデータをローカルにあるファイルへ更新する
>  手段はあるのでしょうか?

ファイル拡張子をhtaに変えてしまえば、可能です。
ただ、これだとブラウザがローカル仕様になるので、
IISやPWSを立ち上げて、使用しているパソコンをサーバーにしてしまって、
ASPを動かせば、エクセルファイルの更新がブラウザから可能になります。


Dear セイウンスカイ♪ さん

> BASP21のKconvメソッドを使用して、文字コードを変換させたいのですが・・・
> うまくいかないのです。。

Kconvは、UNICODEとJIS以外の場合は、バイト配列を返すので、そのままではエラーになります。
そこで、バイト配列を文字列に変換する作業が必要となりますが、
このあたりは詳しくないので、本家BASP21のレスポンスセンターで過去レスを探すと、
確か馬場さん自身によるレスがあったように記憶しています。

> Set bobj =Wscript.CreateObject("BASP21")

は、ループの外に出しておかないと、ループのたびにインスタンスが作成されて大変なことになってしまわないかと。。。


Dear たる さん

> 自分はBecky!2を使っているのですが、バージョンアップ後一つ不満があるんです。
> それは家で落としたメールを会社に持っていって使う事が出来なくなってしまったこと。
> DB化出来たらすごいです。ください。←こればっか。すいません。

現在、選択した複数のメールの情報を取得するところに居ます。
やり方のめどがついたので、ほっとしてお休みしている所でした。(おいおい)
(で、しかもTeraPadのアドインの方にうわきなんかしてたりして、、、)
がんばりますが、完成は地区の廃品回収後になりそうです。。。

私は、ShiftJIS Export pluginというのを使って、Becky!2からテキストファイルに書き出し、
これを持ち運んでいますが、これも便利ですよ。


Dear 筑集眺餅 さん

> おぉ、すごい。「坊さんが屁をこいた」でパスワードができる!
> こりゃ便利。(^^)

ただ文字によっては、ワンパターンのパスワードが生成されたりするので、
パスワード用の文字は64文字に絞ったほうがいいかもしれません。(128文字に増やしてもいいですが)

自分で作るソフトの場合は、日本語を入力してもらって、
それをパスワードに変換してデータベースに接続、という方法を考えています。

たる さん 2001年 10月 26日 12時 02分 58秒

To: セイウンスカイ♪ さん
EUCをファイルシステムオブジェクトで扱うのは出来なくは無いけどチョット難しいんです。
なのでこんなやり方はいかがですか。
後もう一つ、文字列をファイルにしておいてBASP21のKconvFileメソッドで 変換するって手もありますね。

- - ->makeXML.vbs
Const adPersistXML = 1
Function selfPath()
Dim strExecuteDir
strExecuteDir = WScript.ScriptFullName
strExecuteDir = Replace(strExecuteDir, "/", "",1, 1)
strExecuteDir = Left(strExecuteDir, InStrRev(strExecuteDir, "\") - 1)
selfPath = strExecuteDir
End Function
Dim Con1, strSQL, Rst, objFS
Set Con1 = Wscript.CreateObject("ADODB.Connection")
Set objFS = Wscript.CreateObject("Scripting.FileSystemObject")
If objFS.FileExists(selfPath & "\KConv.xml") Then objFS.DeleteFile selfPath & "\KConv.xml"
Con1.Open "LocalServer","DB名"
strSQL = ""
strSQL = strSQL & "SELECT "
strSQL = strSQL & "* "
strSQL = strSQL & "FROM "
strSQL = strSQL & "tblCode"
strSQL = strSQL & " Where"
strSQL = strSQL & " 条件"
'response.write strSQL
Set Rst=Con1.Execute(strSQL)
If objFS.FileExists("./temp.xml") Then objFS.DeleteFile "./temp.xml"
Rst.save "./temp.xml", adPersistXML
Set bobj = Nothing
Set Rst =Nothing
Con1.Close
Set Con1 = Nothing
Set objXML = Wscript.CreateObject("Microsoft.XMLDom")
objXML.async = False
Set objXSL = Wscript.CreateObject("Microsoft.XMLDom")
objXSL.async = False
Set objNewXML = Wscript.CreateObject("Microsoft.XMLDom")
objNewXML.async = False
If Not objXML.load("./temp.xml") Then WScript.Quit
If Not objXSL.load(selfPath & "\test1.xsl") Then WScript.Quit
Msgbox objXML.transformNode(objXSL)
objXML.transformNodeToObject objXSL, objNewXML
objNewXML.insertBefore objXML.createProcessingInstruction("xml","version=""1.0"" encoding=""euc-jp"""), objNewXML.documentElement
objNewXML.save(selfPath & "\Kconv.xml")
Set objNewXML = Nothing
Set objXML = Nothing
Set objXSL = Nothing
If objFS.FileExists("./temp.xml") Then objFS.DeleteFile "./temp.xml"
- - ->test1.xsl
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xml:lang="ja"
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<xsl:template match="/">
<root>
<xsl:apply-templates select="xml/rs:data/z:row" />
</root>
</xsl:template>
<xsl:template match="z:row">
<Value><xsl:value-of select="@XX" /></Value>
</xsl:template>
</xsl:stylesheet>

この二つのファイルを同じディレクトリにおいて下さい。

筑集眺餅 さん 2001年 10月 26日 07時 36分 04秒

To:matuさん

>筑集眺餅さんが処理系について言ってらっしゃることは分かっておりましたので、
>心配はいりません。
・・・そう言ってもらえるとありがたいですぅ。(^^)
宜しくお願いします。

筑集眺餅 さん 2001年 10月 26日 06時 36分 30秒

To:土屋さん

おぉ、すごい。「坊さんが屁をこいた」でパスワードができる!
こりゃ便利。(^^)

To:UDOHさん

とりあえず動作して、おめでとさんです。
そうですねぇ。やり方はいろいろあるでしょが、ワシなら・・・。

(1) CSVファイルからサービス名を読み込んでコレクションを準備する。
(1-0) コレクション用に Dictionary オブジェクトをCreateObject しておく。
(1-1) FileSystemObject.OpenTextFile でCSVファイルを開く。
(1-2) Stream.ReadLine で行(レコード)を読む。
(1-3) Split(-, ",")関数で行を Array に小分けして、要るところだけを、
 Dictionary.Exists でキー登録済みでないか確認しながら、Dictionary.Add
 でキー登録する。
(1-4) ここまでを Do Until (Stream).AtEndOfStream でぐるぐる回し。
⇒ これで、CSVの中身が、Dictionary コレクションのキーに化ける。

(2) 前のスクリプトみたいな仕組みでサービスを抜き出して、比べる。
(2-1) サービス名 oService.Caption を Dictionary.Exists でコレクション
 のキーと比較する。
(2-2) 一致したものがあれば、WshShell.Run でアプリを走らす。
 (WSH5.6 がインストール済みなら、WshShell.Exec がベター?。)
(2-3) ここまでをぐるぐる回し。

・・・とまぁ、2つのループが並んだような仕組みになるでしょか?
詳しい事は、むたぐちさんの解説とかを見てくだせぇ。

To:管理人むたぐちさん

忙しそうですね〜。
最近、常連化しつつあり・・・。(^^;)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 10月 26日 00時 39分 43秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

ご無沙汰です。
忙しくて返信できませんでした。
まだ当分この状況は続きそうなので、気長にお待ちください…。

常連の皆様、いつもありがとうございます。
頼りにしてます(^^;

たる さん 2001年 10月 26日 00時 33分 17秒

To: 志田 さん
>現在、ブラウザをインタフェイスにし、ローカルドライブにある
>エクセルに更新をかけたいと思っています。
前提条件を確認しますが、WEB上に置かれたHTMLでローカルのExcelファイルを更新したいと言う訳ですよね。
それが出来なきゃイントラが成り立たないと思います。
ディレクトリの指定が間違っていないかどうか、
まさかとは思いますが、セキュリティの設定が安全でないスクリプト:無効 になっていたり。
もちろんサイトを限定して甘くするとういのは言うまでもないことでしょうけれど。
基本的なことはそのくらいでしょうか。
応用的なことはコードを拝見してからになりますね。

#「親にも見られたことがないのに」と拒絶することはありませんよね。

To: 土屋 さん
>ところで、Becky!2でVBSを使おうというプラグインが出ているのですが、
>昨日からこれで遊んでます。
>これで、メールのDB化を図ろうとしているのですが、
>AccessのMDBファイルに選択したメールを送るのはうまくいきそうなんですが、
くう、なんてよさそうな…。
自分はBecky!2を使っているのですが、バージョンアップ後一つ不満があるんです。
それは家で落としたメールを会社に持っていって使う事が出来なくなってしまったこと。
DB化出来たらすごいです。ください。←こればっか。すいません。
やっぱりこんな個人的かつデータストア的用途にはMDBが一番です。(宗旨ころころ変えるやつ)

To: むたぐち さん
>ADOを使ったバイナリ書き込みの
>方法を併用すれば何とかなりませんかねえ?
アドバイスありがとうございます。
と言うわけでやってみました。
取りあえず]]&gt;以外は、変換出来るようになりました。

でもまぁ、タイミング逸したし、用途もないし、公開するまでもなくお蔵入りだな。

[ADODB.Streamを使ってみて]
FSOと比べると、TrancateとかBinaryReadWriteはできるけど
切り詰め、挿入をするにはもう一つコピー先ストリームを用意する必要があります。
なぜWriteメソッドがあるのに内容の編集ができない?
要点はReadメソッドで返されるByte配列が読み取り専用(では無いけれど配列要素を指定できない)と言うところにあるとおもいます。
abytStream = astFile.Read(6)
として出来たByte配列abytStreamに対して、何も変更せずにWrite abytStreamはできるんだけど。
ReDim Preserve abytStream(4)とかもダメ
abytStream(2)=CByte(32)とかもダメ

唯一思いついた方法は0〜255のAsciiコードを連続で書いたファイル(仮にアスキーテーブルと呼ぶ)
を第3のストリームとして読み込んで
Set astAsciiTable = Wscript.CreateObject("ADODB.Stream")
astAsciiTable.Type = adTypeBinary '1
astAsciiTable.Mode = adModeReadWrite '3
astAsciiTable.Open
astAsciiTable.LoadFromFile selfPath & "\アスキーテーブル"
としておいて
astAsciiTable.Position = lCode 'lCodeはセットしたいコード
astAsciiTable.CopyTo astDest, 1
とかやる方法。(astDestはファイルとして生成したいコピー先のストリーム)

なんだか他に方法はないような感じで、もうすこし融通つけてくれたら便利だと思うんですけれど。

>XMLDOMですか。これは私にとって未開拓の分野なので参考になります。
今回はまったく正規でない使い方をしていますが。
.NETになったらこの知識もお蔵入りでしょうね。
知らないんだけどXMLReaderクラスって感じで見るんでしょうか?

知っていても特にならないお蔵入り豆知識その2
>スクリプトエンジンもDOMもブラウザ本体もCOMの枠組みに内包するという、現在の
>姿とは程遠かったんでしょうね。
イベントが全体以外からRaiseできないWindow_onload()プロシージャとか
Forms、Anchors、Framesなんて名前がその時の名残ですね。
今じゃタグ名やアトリビュート名がオブジェクトやプロパティになっていないほうが珍しいですからね。
却って、プロパティとして読み取り・設定できないと質問が来るくらい。

突然、WshLab.htaが起動できなくなってしまった。1003行 終了していない文字型の定数です。と怒られ緑の画面がでた。
何でかなとか思ったけど、
EUCの表示テストをしてたからデフォルトのエンコードが移ってしまったんですね。ちょっとびっくり。

最後になりますが、質問があります。
タイムスタンプを任意の日付に偽造したいんですけれど、Wshでやるにはどうしたらよいんでしょうか。

セイウンスカイ♪ さん 2001年 10月 25日 23時 40分 05秒

こんばんは。。
BASP21のKconvメソッドを使用して、文字コードを変換させたいのですが・・・
うまくいかないのです。。
型が違いますというエラーが出てしまいます。。
以下のような使用法はあやまりなのでしょうか??
宜しくお願い致します。。

Set Con1 = Wscript.CreateObject("ADODB.Connection")
Con1.Open "LocalServer","DB名"

Set objFS = Wscript.CreateObject("Scripting.FileSystemObject")
Set objTf = objFS.CreateTextFile("C:\Kconv.xml")


strSQL = ""
strSQL = strSQL & " select "
strSQL = strSQL & " * "
strSQL = strSQL & " from "
strSQL = strSQL & " テーブル名 "
strSQL = strSQL & " Where"
strSQL = strSQL & " 条件"
'response.write strSQL
Set Rst=Con1.Execute(strSQL)

Do Until Rst.EOF

Set bobj =Wscript.CreateObject("BASP21")
rc =bobj.Kconv(Rst("XX"),2,0)

objTf.Write("<Value>") & & ("</Value>") & vbLF
ここの& & の間に BASP21のrcの内容を書き出したい。。。


Rst.MoveNext
Loop

Set bobj = Nothing
Set Rst =Nothing

ObjTf.Close


Con1.Close
Set Con1= Nothing


UDOH さん 2001年 10月 25日 23時 23分 27秒

TO:筑集眺餅

こんにちははじめまして。

教えて頂いたスクリプトで問題なく動作しました。

また、このスクリプトを元に下記のようなことを
実現させたいのですが、どのようにすればよいのか
教えていただければ助かります。

@ある「CSV」ファイルに必ず動作しているべき
サービス名を記述しておく。

Aその「CSV」ファイルにあるサービス名と停止した
サービスを比較する。

B「@」に記述してあるサービス名がある場合はある
アプリケーションを実行する。

上記のようなことを実現したいのですが、どのように
すれば可能でしょうか?

大変申し訳ないですけれどもご教授頂ければ助かります。

志田 さん (shida@ae.keio.ac.jp) 2001年 10月 25日 16時 26分 55秒

はじめまして、VBSの初心者ですがよろしくお願いします。

現在、ブラウザをインタフェイスにし、ローカルドライブにある
エクセルに更新をかけたいと思っています。
そこで、HTMLの中にVBSを埋め込み、エクセルの更新スクリプトを
書いてみたのですがうまくいきません。
しかし、スクリプトファイル(hoge.vbsのような)からですと
問題なく、更新ができます。

そこで、質問なのですが、
1.HTMLに埋め込んだスクリプトからは、ローカルファイルへ
 アクセスし、更新をかけることができないのでしょうか?
2.もし、1.が不可能な場合インタフェイスをブラウザにして
 そこら入力されたデータをローカルにあるファイルへ更新する
 手段はあるのでしょうか?

非常に基本的な質問でしたら済みません。
ご教授お願いします。

土屋 さん 2001年 10月 25日 16時 05分 43秒

Dear 筑集眺餅 さん

> へぇ、日本語でパスワードが設定できますか。
> なら、好きな歌手とか座右の銘とか自分の覚えやすいのでOKですよね。
> いいなぁ。

たとえば次のようなスクリプトを自分用に設定しておきます。
(これはパスフレーズから擬似乱数を作り、それからパスワードを生成する方法をとってます)
これを普段使うコンピュータ(またはサイト)に置いておいて、必要なときに実行します。
すると入力された言葉をもとにパスワードが生成されるので、これをパスワードに登録しておくわけです。
スクリプトが同じであれば同じ言葉をいれれば同じパスワードが生成されるので、
日本語のフレーズを覚えておけばいいわけ。
これだと覚えられると思うんですが。。。
スクリプトの書き換えを防ぐためには、初期設定をしたあと、スクリプトエンコーダでエンコードしておく手があります。
(エンコーダは秘密保持ではなくて、書き換えをしにくくする役割の方で使います)

'初期設定(変更可能)
K = 8 'パスワードの文字数
N = 1234567 '任意のゼロ以上の奇数
Str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" & _
"0123456789/#$&^~_" 'パスワードに使われる文字を指定

'パスワード生成のための元のデータ(日本語)を入力
strINPUT = InputBox("パスワードを作成するための" & vbCrLf & "元になるフレーズを入力してください","パスワード生成","")
'文字がなければ終了します
If strINPUT = "" Then WScript.Quit

'擬似乱数のための種(シード)を作成
Mojisu = Len(Str)
For i = 1 To Len(strINPUT)
intPASS = intPASS + AscW(Mid(strINPUT, i, 1)) Mod Mojisu
Next

'擬似乱数用の設定
R = intPASS
M = intPASS * 4 + 1

'擬似乱数からパスワード生成
For i = 1 To K
R = (R * M + N) Mod Mojisu
Pass = Pass & Mid(Str, R + 1, 1)
Next

'できたパスワードを表示
outINPUT = InputBox("パスワードは" & vbCrLf & "以下の通りです", "パスワード生成", Pass)

uraken さん (urakendotocom@ybb.ne.jp) 2001年 10月 24日 22時 23分 02秒

VBSで共有フォルダを作成したいのですが
どのようにすればよいのでしょうか

VBだったら"NETAPI32.DLL"なるものを利用した
方法があるのですが、WIN2000のみでしか通用
しない技なので・・・

VBSは初心者ですがぜひご教授下さい

筑集眺餅 さん 2001年 10月 24日 21時 39分 28秒

To:土屋さん
>覚える必要があるのは日本語のフレーズで、パスワードが必要になったときに、
>サイトに接続してパスワードを生成するという仕組みです。
へぇ、日本語でパスワードが設定できますか。
なら、好きな歌手とか座右の銘とか自分の覚えやすいのでOKですよね。
いいなぁ。

To:UDOHさん

初めまして。 この板のリンク集から辿るとSQLのサンプルがあったので
嬉しくて書き換えてみました。
WMIのことは知らないので、内容は聞かないで。(^^;)

'--------------------------
Set oFS=WScript.CreateObject("Scripting.FileSystemObject")
Set tOut=oFS.OpenTextfile("aaa.txt", 2, True)
Set oServiceSet=GetObject(_
"winmgmts:{impersonationLevel=impersonate}").ExecQuery(_
"SELECT * FROM Win32_Service " & _
"WHERE StartMode='Auto' AND State='Stopped'") ' おぉ、SQLだ!
For Each oService in oServiceSet
tOut.WriteLine(oService.Caption)
Next
Set oService=Nothing: Set oServiceSet=Nothing
tOut.Close: Set tOut=Nothing
Set oFS=Nothing
'--------------------

UDOH さん (t_udoh@yahoo.co.jp) 2001年 10月 24日 19時 27分 52秒

こんにちは。
初めて掲示させて頂いております。

WMIから自動起動サービスが停止しているものを格納し、
結果をテキストファイルへ書き出したいのですがなかなか
上手くいきません。

内容は以下のとおりです。

--  内容  --
Set ServiceSet = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Service")

for each Service in ServiceSet

dim filesystem
set filesystem = WScript.CreateObject("Scripting.FileSystemObject")
const ForReading = 1
const ForWriting = 2

dim output_filename
output_filename = "aaa.txt"

dim output
set output = filesystem.OpenTextFile(output_filename, ForWriting, True)
output.Write(Service)
output.Close
set output = nothing

Next


-------------------------------------------

お分かりになられる方がいらっしゃいましたら、教えてください。
お願い致します。

土屋 さん 2001年 10月 24日 10時 55分 49秒

Dear 筑集眺餅 さん

> ははぁ、それでパスワード生成のスクリプトというわけですか。

あ。ばれました?
実は、あれはとあるMLで話題に上ったので作成してみたものなんです。
(実際にはもっと発展させて、擬似乱数を使う手を考えてます)

実はちょっと前に暗号についてあれやこれやとやっていたのも関連してます。
パスワードは覚えにくいので、ブラウザ上でJavaScriptを使うか(つまりローカルな状態で)、
またはWSHで、日本語フレーズからパスワードを生成して使えるようにできないか、
と考えていたわけです。

覚える必要があるのは日本語のフレーズで、パスワードが必要になったときに、
サイトに接続してパスワードを生成するという仕組みです。
JavaScriptにこだわったのは、サーバーに送らずに、
ローカルなコンピュータ上で処理したかったからです。
WSHファイルを起動して生成する方法でもいいですね。
(生成したパスワードをクリップボードに送ると便利かなと思って、
 それで、WSHでクリップボード操作という具合になるわけです)

筑集眺餅 さん 2001年 10月 24日 08時 57分 40秒

To:土屋さん
ははぁ、それでパスワード生成のスクリプトというわけですか。

あんまり関係ない、一社会人の立場としての感想ですが、世の中
パスワードだらけでたまらんです。
キャッシュカード/クレジットカードに始まってその他もろもろ。
考え出すのも大変なら、そろそろ個人で管理できる限界に達してます。

中でも、腹が立つのが、定期的にパスワードを変えさせるシステム。
システムの立場で見れば安全確保のための合理的なシステムでしょうが、
たまにしか使わんのに3カ月毎にパスワードをひねりだにゃならん。
しかも、勘違いして古いパスワードやら他のシステムのパスワードを
打ち込んだりして3回間違うと、パスワードを無効にされて 謝りの電話
をかけて新しいパスワードを設定してもらわなならん。
何とかしてくれぇ。 (;_;)

Return