ひろすけ さん 2001年 11月 24日 07時 23分 38秒

おはようございます。ひろすけです。
また、ご指導頂きたく投稿いたしました。

質問が2点あります。

現在、個人的にADSLでWEBサーバーを構築中なのですが、
そのWEBは一般の人に見て頂くものではなく、
個人的に(私 ひろすけのみが)遠隔地から見るためものなのですが、
私的にのみ利用したいためDynamicDNSにて名前の解決をしてもらわず、
毎回定時にw2yをRestartさせその時取得したグローバルIPをメールで
遠隔地にいる私のところまで送信する
という計画をしています。

今回の質問は、2つのケースにてそのIPの取得方法をご指導いただきたいのです。

ケース1

ADSL回線からADSL対応モデムに接続し、その先にW2Y pro(WEBサーバー)を接続しているケースの
W2Y proのグローバルIPの取得

ケース2

ADSL回線からADSL対応ルーターモデム(内側のIP→192.168.0.1)に接続し、
HUBに接続し、その先にW2Y pro(WEBサーバー→192.168.0.2)を接続しているケースの
ADSL対応ルーターモデムの外側のグローバルIPの取得

※ ケース2ではルーター側でNATテーブル(ポートマッピング)が行われ
httpプロトコル(80)→192.168.0.2のPCと定義ずけられています。

ぜひ、よろしくお願いします

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

えっ、WindowsXP HomeEditionって、NTドメインに参加できないの??
これから発売されるPCにプリインストールされるOSって、だいたいHomeEditionだろうし、
NTドメインな研究室の次期ネットワーク管理者になる私としては、非常に困るんですけど。
Professionalにアップグレードしろ、なんて言えぬ…。
# もしくはWin98/2000にダウングレードしろ、ってか。(MEはとてもじゃないがすすめられん)

えっ、アクティベーションってダイヤルアップか電話だって??
アナログ回線なんてないよ…いちいち電話するのか?

XP、やなかんじかも。

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

To: たくや さん

> 自分のパスワ−ドを見ることできないんですか

よく意味がわからないです。

たくや さん 2001年 11月 23日 23時 45分 19秒

自分のパスワ−ドを見ることできないんですか

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 11月 23日 23時 44分 42秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 土屋 さん

> やはりWindowsのバージョンを調べて、対応するしかないのかなあ。
> なんだか面倒なものですね。(熱がさめてしまった)
> バージョンは、近くにあるもので調べたら、
> Win95 4.0
> Win98SE 4.10
> WinNT4 4.0
> WinME 4.90
> Win2000 5.0
> みたいな感じだったのですが、こんなとこでいいんでしょうか。
> 98とXPのバージョンもご存知の方教えて下さい。
> 98はやっぱり4.10かな?

4.10.1998 Win98
4.10.2222 Win98SE
です。

WinMEのバージョンが、いかにも中途半端で出しちゃった感じがするのが笑える(^^;

よだん。WSHからWindowsのバージョンを調べる方法:
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
msgbox Fs.GetFileVersion(Fs.BuildPath(Fs.GetSpecialFolder(1).Path,"kernel32.dll"))



To: もと さん

> WSHを利用してファイル所有者の情報を取得することはできまるでしょうか?

WMIを使えば可能です。
以下はhttp://groups.google.com/groups?as_umsgid=%3C81289428@domain%3E&hl=jaにあったものの転載です。

MsgBox GetFileOwnership("D:\test\test.txt")
Function GetFileOwnership(filespec)
Set instance = GetObject("winmgmts:\\.\root\CIMV2:Win32_LogicalFileSecuritySetting.Path='" & Replace(filespec, "\", "\\", 1, -1, 1) & "'")
If instance Is Nothing Then
GetFileOwnership = Null
Exit Function
Else
retval = instance.GetSecurityDescriptor(objDescriptor)
If retval = 0 And Err.Number = 0 Then
Set owner = objDescriptor.Properties_.Item("owner")
GetFileOwnership = owner.Value.Properties_.Item("name")
Else
GetFileOwnership = ("Error# " & CStr(Err.Number) & ": " & Err.Description & "occurred when retrieving the security descriptor")
End If
End If
End Function



To: 土屋 さん

> またもや二重投稿の確信犯です。(ここにも投稿しておけば、あとで検索して探しやすくなるかな、なんて思ってたりして、、、)

どうもありがとうございます。
たしかに情報がまとまってると検索が楽ですね。
私が二重投稿するのもまさにそれが理由だったりします。

いちろう さん 2001年 11月 23日 23時 02分 04秒

To: 筑集眺餅 さん
今年7月に夏休みをとって南米パラグアイに行ったのですが、
途中経由した、シアトルで米国の入国審査がありました。
パスポートを見せると、"Oh! Ichiro!!!!"と騒がれました。
帰りは免税店に寄ったのですが、そこでも。。。
どうでもいいことですが。。。(笑)
ファイルのプロパティを変える。っていうのは少し考えて
みたのですが、スクリプトが途中で止まったりして、万が一
大きいトラブルになると困るので、会社で使うのは難しい
かもしれません。

To: たる さん
教えていただいた過去ログをいろいろテストしてみたところ
いやー完璧なまでにきちんと動作しますね。(当たり前?)
会社のPCでも同様に動いてくれることを期待してます!
自分でも過去ログから探しだそうとしたのですが、これだけ
あると、初心者には簡単には見つかりませんね。。。
とても助かりました。

To: むたぐち さん
ここはすごいですね。レベルが高く、内容濃く、しかも
親切な人が多く。ほんとに助かりました。メソッドや
プロパティを自分でいろいろ調べられるといいんですが、
ExcelやOffice以外はさっぱりオブジェクトブラウザの
使い方がわかっていないので。もっと精進したいと思います。



土屋 さん 2001年 11月 23日 22時 59分 00秒

またもや二重投稿の確信犯です。(ここにも投稿しておけば、あとで検索して探しやすくなるかな、なんて思ってたりして、、、)

今回はD&Dで受け取ったワード文書内の文字列を一括置換するスクリプトです。
少し変更すると、ワイルドカードの使用や書式の置換もできるようになります。

'========================================================================
'WordReplace.vbs
'ドラッグ&ドロップで受け取ったWordファイルの文字列を置換します。
'========================================================================
'以下の2行の部分を書き換えます。(上が検索する語で下が置き換える語)
Const FindText = "清水町"
Const ReplaceText = "高野町"

Dim myWord, myDocument, FS, FileName, FolderName, i
If WScript.Arguments.Count = 0 Then WScript.Quit
Set FS = CreateObject("Scripting.FileSystemObject")
i = 0
Set myWord = CreateObject("Word.Application")
'myWord.Visible = True
For Each FileName in WScript.Arguments
FolderName = FS.GetParentFolderName(FileName)
Select Case LCase(FS.GetExtensionName(FileName))
Case "doc"
Set myDocument = myWord.Documents.Open (FileName)
With myDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = 1
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = True
.Execute , , , , , , , , , , 2
End With
myDocument.Save
myDocument.Close
i = i + 1
End Select
Next
myWord.Quit
Set FS = Nothing
Set myDocument = Nothing
Set myWord = Nothing
MsgBox i & "個のファイルを変換しました"

もと さん 2001年 11月 23日 18時 06分 41秒

お世話になります。
WSHを利用してファイル所有者の情報を取得することはできまるでしょうか?
色々本などよんでいるのですが、載ってなくて、、
簡単にはいきそうにありません。
よろしければご教授ください。

土屋 さん 2001年 11月 23日 16時 52分 39秒

WSHからコモンダイアログをいぢるときは、VSなどのライセンスが必要なわけなんですが、
やっぱりそれでは不便ということで、
comdlg32.dllを利用して、コモンダイアログを召喚するActiveX Dllを作ってみたのですが、
あんれ?MEだとうまくいったのに、98SEだと反応しない・・・
2000は大丈夫なのに、95は当然だめ。
Windowsのバージョンによって、違ってたんですね。知らなかった。

そこで、反応しないときは、すかさず昔のダイアログを召喚するようにしてみたら、
MEではファイルを保存、98ではファイルを開くコモンダイアログが出てくるというすごいものができてしまった。
(MEでファイルを保存でキャンセルすると、ファイルを開くのも出てきたりして)
ま、これはOpenとSaveを間違ってたわけですが、結構楽しめます。

やはりWindowsのバージョンを調べて、対応するしかないのかなあ。
なんだか面倒なものですね。(熱がさめてしまった)
バージョンは、近くにあるもので調べたら、
Win95 4.0
Win98SE 4.10
WinNT4 4.0
WinME 4.90
Win2000 5.0
みたいな感じだったのですが、こんなとこでいいんでしょうか。
98とXPのバージョンもご存知の方教えて下さい。
98はやっぱり4.10かな?

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

To: いちろう さん

> そこで、代わりにスクリプトを書いたHTMLへリンクを張って、
> そのHTMLを読み込むと、『ディスクに保存』を選択したような
> 振る舞いをさせる。ということができないか考えました。

これ、昨日研究室の後輩から同じ質問を受けたばかりだったりします。
もっとも、彼の場合はIriaで落ちてこない画像ファイルをブラウザで何とか楽に
落としたいという実に不純な動機なわけでしたが(^^;

> いろいろ調べているのですが、なかなか見つかりません。
> ExecWB でできる!と一瞬思ったのですが。。。(笑)

これも私が最初に考えた解決策と同じですね(^^;
でも、HTML以外ではExecWBが使えないということに気づき、挫折したのも、たぶん
いちろうさんと同じでしょう。

他に、クライアントのレジストリのMIME設定をいじってどうにかしようとたくらんだんですが、
どうもIEはシェルのMIME設定以外にも独自のMIME設定を持っているっぽく、
これは失敗しました。

というわけで、解決策はたるさん、筑集眺餅さんの返信をどうぞ。



To: たる さん

> 今、CreateObject("Shell.Application")の修得をしている所なのですが、
> こうなってくると俄然欲が出てきて、フォルダ表示かつ位置サイズ指定を、
> 出来ればSendkeyを使わず(作業時間が安定できたら大丈夫かな)、
> やりたいなとか思ってしまいました。
> コマンドライン実行でexplorer /e,[path]で任意のフォルダ表示が出来るのは判ったのですが
> サイズを変更しようとすると、フォルダ表示が消えてしまう…。なぜ〜?

何で消えるのかはわかりませんけど、エクスプローラバーをエクスプローラに表示させる
方法はあります。詳しくは「ダウンロード」のページからshowbar2.vbsを落としてください。
「フォルダ一覧」を示すClassIDはわからなかったのですが…。

> ところで過去ログ43-49 31-40
> を元に今まで懸念事項だったタイムスタンプの偽造^h^h設定に成功しましたので投稿します。

これはっ!
Shell32のModifyDateプロパティってReadOnlyじゃなかったのか!
いやー、知らなかった。# でもなんでReadOnlyじゃないんだ?

というわけで、ちょっと簡略化したスクリプトを。
更新日時を0時0分0秒にするスクリプトです。

Function ModifyDate(path,date)
Set Shell = WScript.CreateObject("Shell.Application")
Shell.NameSpace(path).ParentFolder.ParseName(Shell.NameSpace(path).Title).ModifyDate=date
End Function

ModifyDate "C:\test\test.txt",DateValue(Date & " 00:00:00")

一応、フォルダを指定してもエラーにはならないのですが、更新日時は変わらないようです。
あと、ルートのファイルはダメです。

> Shell.Applicationはメソッド・プロパティがいっぱいあって
> 何がどう使えるのかよく分かりません。でも楽しい。
>
> エクスプローラで出来る全ての動作が欲しかったがそれは詮無きことなのか?

Shell32は、フォルダのWeb表示で使われているコンポーネントなので、基本的に
そこで使う機能しか実装されていません。
# ModifyDateがあってCreateDateがないのもそれが理由。
逆にいうと、フォルダのHTMLソースを読めば、ある程度使い方がわかるということになります。
*.httを見てみてください。



To: 後藤 さん

> OutlookExpressのユザ−名の変えかた分からないんです

これってスクリプトからのやり方ですよね。
WshShellのRegWriteメソッドを使って、該当するキーの値を書き換えてやると良いでしょう。
といっても、該当キーがどこかは私は知りませんので、Outlook Express上で名前を適当に変更して、
レジストリの変更を追跡(レジストリエディタの検索機能で)して突き止めてください。

後藤 さん 2001年 11月 23日 01時 18分 08秒

OutlookExpressのユザ−名の変えかた分からないんです

たる さん 2001年 11月 23日 00時 17分 06秒

To:いちろうさん

WSHを使ったバイナリのダウンロードなら48-43 管理人むたぐちさんの書かれたADODB.StreamオブジェクトとXMLHTTPオブジェクトによるダウンロードを参考になさったら如何でしょうか?
IISを使っておられるなら、パラメータを渡す所から出来るので、セッション等組み合わせればローカルのVBSは配布した姿のままかゆいところに手が届くように出来ると思いますよ。

筑集眺餅 さん 2001年 11月 22日 23時 29分 22秒

To:いちろうさん

>ですが、Excelファイルへリンクを張ると、クリックしたときに
>IE上でExcelが起動してファイルを開いてしまうのです。

初めまして。アリーグMVPおめでとうございます。<それはイチロー

WSH的な解決とは違いますが、エクセルファイルのプロパティを
変えてやって、保存を選べるようにする手もあります。

http://homepage2.nifty.com/winfaq/c/ietrouble.html#314

では、新人賞おめでとうございました。<それはイチロー

たる さん 2001年 11月 22日 23時 05分 25秒

To: SIGNAL9 さん

私自身画像を処理するようなことはあまりなく、書かれていたこともふ〜〜ん、すごいなぁ
と思いつつも参画出来ないでいました。それなのに要求をいったら大変おこがましいとは
思うのですが、キャプチャが出来ると言うことを聞き、それなら任意矩形域外の切り捨て
があれば連続取込に便利と思ってしまったのですけれど、どうでしょうか?

あと、ひまわりの衛星写真をgifアニメ化できたらいいなぁ。とかいってみる。

To: 土屋 さん 管理人むたぐち さん

おー。すごいです。
考えても見ない方法が聞けたので、やはり聞いて良かったです。

今、CreateObject("Shell.Application")の修得をしている所なのですが、
こうなってくると俄然欲が出てきて、フォルダ表示かつ位置サイズ指定を、
出来ればSendkeyを使わず(作業時間が安定できたら大丈夫かな)、
やりたいなとか思ってしまいました。
コマンドライン実行でexplorer /e,[path]で任意のフォルダ表示が出来るのは判ったのですが
サイズを変更しようとすると、フォルダ表示が消えてしまう…。なぜ〜?

ところで過去ログ43-49 31-40
を元に今まで懸念事項だったタイムスタンプの偽造^h^h設定に成功しましたので投稿します。

Function ModifyDate(f,datSrc)
Dim Shell, oFolder2,file, bSuccess
Set Shell = WScript.CreateObject("Shell.Application")
Set oFolder2 = Shell.Namespace(f.ParentFolder.Path) 'ルートの場合はまたあとで考える
For Each file In oFolder2.Items
If f.Name = file.Name Then
file.ModifyDate = datSrc
bSuccess = True
Exit For
End If
Next
Set Shell = Nothing
ModifyDate = bSuccess
End Function

Dim oFS
Set oFS = CreateObject("Scripting.FileSystemObject")
Set oFile = oFS.GetFile("C:\usr\local\doc\privnote\Wsh\doc\reply.txt")
ModifyDate oFile,#2001/11/23 12:00:00#
Set oFile = Nothing
Set oFS = Nothing

Shell.Applicationはメソッド・プロパティがいっぱいあって
何がどう使えるのかよく分かりません。でも楽しい。

エクスプローラで出来る全ての動作が欲しかったがそれは詮無きことなのか?

いちろう さん 2001年 11月 22日 21時 42分 59秒

はじめまして。WSHを使えるようになろうと勉強を始めた
ところです。以下のようなことをやりたいのですが、できますか?

社内で不特定多数のひとにExcelファイルを配布したいのですが、
全社的に見えるディスクがないため、社内用Webページから
ダウンロードしてもらうことになりました。

ですが、Excelファイルへリンクを張ると、クリックしたときに
IE上でExcelが起動してファイルを開いてしまうのです。
リンクを右クリックして『ディスクに保存』を選択してもらえば
いいのですが、社内にはPCが詳しくない人もいるので、誰でも
わかるような、簡単にダウンロードできる方法がないか調べています。

そこで、代わりにスクリプトを書いたHTMLへリンクを張って、
そのHTMLを読み込むと、『ディスクに保存』を選択したような
振る舞いをさせる。ということができないか考えました。
いろいろ調べているのですが、なかなか見つかりません。
ExecWB でできる!と一瞬思ったのですが。。。(笑)
よろしければ教えてください。よろしくお願いします。

OSはNTで、ブラウザーはIE5です。

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

今週の金曜日、新しく出たWinXP搭載なLOOX-Sを買いに行こうと思っていたんだけど、
なんとCrusoeの供給不足?で発売延期になっているではないか。
http://www.fmworld.net/annc/info/loox.html

VAIO C1もダメだ。
http://www.vaio.sony.co.jp/Info/products_pcg-c1mrx_01.html

んー、これはLibrettoを買えという神の思し召しなんでしょか。
http://dynabook.com/pc/catalog/libretto/010802l2/index_j.htm (L2)
http://dynabook.com/pc/catalog/libretto/011024l3/index_j.htm (L3)
Win2000でもまあいいわけだし。XPはデスクトップに入れる予定だし。
メモリが増設できるというのもイイ(LOOXは不可)。何より安いのがいいね。
問題はLOOXより200gほど重いことくらいか。



To: Lib30 さん

LibL2/LibL3はどうっすか?

> 各パソコンに画面のキャプチャーをサーバーに送るソフトが入っているようで、
> おそらく先生たちにはばれていますね。禁止令が出るのも本当に時間の問題でしょう。
> そのソフトを終了させるにはパスワードがいるし、タスクマネージャーで殺そうと
> しても「権限がありません」とか言って死にません。なかなか手強いです。

敵もさる者、ってわけですね。
最近はそんなもんまであるんですなあ。プライバシーの侵害だ! (ん、この手のソフトの紹介、
前にZDNNで見た気がする…)

> ちなみに、学校内にはファイアーウォールが入っていて、有害なページをカットする
> ようになっていますが、Googleのキャッシュを経由すれば内容を見ることができます。
> 内容自体はほとんど変化ないはずだから、URLを見て取捨選択しているのでしょうか?

徹底的に性悪説を貫き通していてある意味好感が持てるなあ。
はなっから生徒に対する信頼なんてないんですね(^^;
そのうちGoogleも有害ページにノミネートされかねんなあ。
# イメージ検索の &filter=0は有害コンテンツ指定でしょう(^^;

> そういうわけで、英→日をやります。

すばらしい!
「翻訳する」という関数が実現してしまいましたね。
常時接続だとすごい威力を発揮しそうです。

次はKids Gooを使ったkanji2kana関数ですか?
オンライン辞書を使って、単語を引数に与えるとその意味を返す関数とかもいいですね。
あ、それがありなら
Set oResults = SearchEngine.Search("検索する単語","Google")
For Each oResult In oResults
MsgBox oResult.Title & "(" & oResult.URL & ")" & vbCrLf & oResult.Comment
Next
的なクラスもありだな。誰かつくりません?

> Cでは当たり前のように使う、整形した文字列を出力する関数です。
> 123 → +123
> 3.14159265 → 0003.14
> 255 → FF
> のような変換処理が気軽にできます。

便利そうですね。
こういうのがwsc化されてOS標準コンポーネントになるというのは、
興味深い話ですね。DLLじゃなくてwscなとこが萌え。



To: 筑集眺餅 さん

> >あ、私Win2000で経験済みなのでよくわかります。
> >だいたいiniファイルに設定を書き込むアプリは全滅ですね。Users。
> >でも、そういうときのための「互換モード」じゃないんですか?
>
> そういうもんですか。
> ちとXP(NT?)の使い方を習得しなくては・・・。

この互換モード機能はXPの売りの一つなんですが、実はWin2000sp2でも
できるようになってます。
やり方は http://www.microsoft.com/JAPAN/support/kb/articles/JP279/7/92.htm 参照。

筑集眺餅 さん 2001年 11月 21日 08時 19分 48秒

To:むたぐちさん

>あ、私Win2000で経験済みなのでよくわかります。
>だいたいiniファイルに設定を書き込むアプリは全滅ですね。Users。
>でも、そういうときのための「互換モード」じゃないんですか?

そういうもんですか。
ちとXP(NT?)の使い方を習得しなくては・・・。

Lib30 さん (lib30@write-off.f2s.com) 2001年 11月 20日 23時 18分 50秒
URL:http://www.ob.aitai.ne.jp/~kazoo/

To 管理人むたぐち さん

>> 各クラスに入ったパソコンなんですが、ゲーム大好きな生徒の
>> 所有物となっています。Vectorからゲームをたくさんダウン
>> ロードしてきて休み時間中に寸暇を惜しんでやっています。
>
>あらま。
>ゲーム禁止令が出るのも間もないんじゃないですか?
>違法系に発展しないよう祈っております(^^;

各パソコンに画面のキャプチャーをサーバーに送るソフトが入っているようで、
おそらく先生たちにはばれていますね。禁止令が出るのも本当に時間の問題でしょう。
そのソフトを終了させるにはパスワードがいるし、タスクマネージャーで殺そうと
しても「権限がありません」とか言って死にません。なかなか手強いです。

ちなみに、学校内にはファイアーウォールが入っていて、有害なページをカットする
ようになっていますが、Googleのキャッシュを経由すれば内容を見ることができます。
内容自体はほとんど変化ないはずだから、URLを見て取捨選択しているのでしょうか?


>> また、本当は英→日をやりたいのですがxmlhttp.responseTextは相変わらず文字化け
>> した文字列を返してくるので、日本語を取得することができません。どうにか
>> ならないでしょうかね。
>
>44-36 管理人むたぐち 2001/08/25 00:26 の方法を使って、無理やりSJISに変換
>するのはいかが?

ブラウザ内の右クリックメニューから呼び出すあのスクリプトに使うことを想定して
作っているため、ファイル入出力を使うのはちょっと大げさかと思ったのだけれども、
BASP21でも変換できなかったし、そうするしかなさそうですね。

そういうわけで、英→日をやります。


var text = "Time flies like an arrow."
WScript.Echo(text + "\n" + E2J(text))

function E2J(str) {
str=encodeURIComponent(str)
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
xmlhttp.Open("POST","http://www.excite.co.jp/world/text/",false)
xmlhttp.send("wb_lp=ENJA&before="+str) //パラメーター

var strHTML=Unicode2SJIS(xmlhttp.responseBody)
//ソースから訳を抽出
var strPattern = /<textarea .*name="after".*>([^\0]*)<\/textarea>/gi
strHTML.match(strPattern)
var str = RegExp.$1

return(str)
}

function Unicode2SJIS(bite){
var FS = new ActiveXObject("Scripting.FileSystemObject")
var sFileName = FS.GetTempName()
var TS=FS.CreateTextFile(sFileName,true,true) //UNICODEとして書き込む
TS.Write(bite)
TS.Close()

var TS=FS.OpenTextFile(sFileName,1,false,0) //SJISとして読む
if(! TS.AtEndOfStream){
TS.Read(2) //2バイトのごみ(UNICODEヘッダ?)
if(! TS.AtEndOfStream){
sTempStr = TS.ReadAll()
}
}
TS.Close()

var TS=FS.CreateTextFile(sFileName,true,false) //SJISとして保存
TS.Write(sTempStr)
TS.Close()

FS.DeleteFile(sFileName)

return sTempStr
}


> …sprintfって何でしたっけ。

Cでは当たり前のように使う、整形した文字列を出力する関数です。
123 → +123
3.14159265 → 0003.14
255 → FF
のような変換処理が気軽にできます。


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

To: Lib30 さん

> 各クラスに入ったパソコンなんですが、ゲーム大好きな生徒の
> 所有物となっています。Vectorからゲームをたくさんダウン
> ロードしてきて休み時間中に寸暇を惜しんでやっています。

あらま。
ゲーム禁止令が出るのも間もないんじゃないですか?
違法系に発展しないよう祈っております(^^;

> 最近XMLHTTPオブジェクトを使ってサーバーにデータを送ることに
> チャレンジしています。それで、「Excite翻訳」にデータをPOSTして
> 日本語の英訳を取得するサンプルを作ってみました。

おお、これ、私もやってみたいと思っていたことです。
なるほど、こうやるのか。参考になります。

> このスクリプトは日本語処理が結構シビアで、Win2000ではファイルをJISで
> 保存しないとうまくいきません。SJISは、どうも内部でUNICODEとして処理されて
> いるようで、サーバーに送る際もUNICODEで送ってしまってうまくいきません。

うーん。文字コードの話は最近話題になっていましたよね。
あのへんを応用して何とかなりませんか?
49-26くらいからのたるさんの記事を追っていくと、いろんな方法があることが
わかります。

> また、本当は英→日をやりたいのですがxmlhttp.responseTextは相変わらず文字化け
> した文字列を返してくるので、日本語を取得することができません。どうにか
> ならないでしょうかね。

44-36 管理人むたぐち 2001/08/25 00:26 の方法を使って、無理やりSJISに変換
するのはいかが?

> うちでは家族がMeを使っているので、買う可能性大。
> 何せMeは一日一回ハングアップしますから。自分が使っているのは
> Win2000なのでアップグレードするつもりはありませんが。

なんと言うか、雑誌の比較記事で、MEを比較対象にしている記事があまりにも
多くて萎えますねえ。
MEよりいいのは当たり前で、Win2000と比べてどうなのかがポイントなわけで。
まあ、これもMSのご意向に沿った記事となると、そうせざるを得ないというのも
わからんではないですが。

> sprintfなどはなかなか使えそうですね。数値から簡単にRGB16進法を取得できます。
> Hex関数を使えばいいと思うかもしれませんが、あれは桁が足りなくても0を
> 補ってくれないもので(別に付け足すのは簡単なのですが)。

…sprintfって何でしたっけ。



To: 土屋 さん

> MLの方に投稿してみたExcelを使ったコモンダイアログ召喚ですが、
> こっちにも投稿しちゃおうっと。

おお、宣言つき二重投稿。私も良くやってますが(^^;
ありがとうございます。

cmdlg32.ocxを使わずに、コモンダイアログの代替をさせる方法、
結構いろいろ出揃いましたね。ここでまとめておこう。
(専用のコンポーネントを使うというのは除外)

1. Shell32のBrowseForFolderを使う >4-37他
2. ShellNameSpaceオブジェクトをHTA内で使用 >33-29
3. <input type="file">を呼び出す >50-35
4. Excelを使用する >52-28

他にもあったような気がするんですが…。



To: SIGNAL9 さん

> >それって、ひまわりみたいなもの?
>
> MINDというのはこういうものなんです。
> http://www.scripts-lab.co.jp/qa/whatsmind.html
> DOS時代からある、由緒正しいお笑い…じゃない、開発言語なんで
> す(笑)。昔々、始めて見た時は腹筋割れるかと思いました(爆)。

あ、これ「ひまわり」とそっくりだ。
「ひまわり」とはこういうもんです。
http://www.text2music.com/tools/himawari/
もちろんこれの方が後発でしょうが…。

> IEプラットフォームではけっこうユーザがいるみたいですよ。雑誌投稿の
> ネタでも時々見かけますし。

Googleしてもけっこう出てきますね。
私が知らんかっただけか。

> ぼくは積極的に使う機会がないんで詳しくないんですが、上手く使えば簡
> 単なゲーム(RPGとか)なら、スクリプトだけでも組めそうですね。

ゲームでスクリプトと言ったら、やっぱHSPじゃないですか?
# 意図的に話をそらしてみる…

いや、WSHのライバルって結構増えてる気がするんですよね。
WSHは結構イイ線行ってると思うんですが、いかんせん色気がたりないよなあ。
COMの制御ができるというウリも、最近の処理系では、たとえスクリプト系でも
わりと当たり前になってきてますしね。(Win32版RubyやPerlとかもそうだし)

OS標準という地位に安住していていいのかWSH。
.NET時代はどう身を振るつもりなのだWSH。

> #たまに、VBAなどの他の言語環境でCOMの参照設定などをやると、見た
> #こともないようなエントリが急に出来ていて、「あれ、なんだこれ」と
> #調べ始めてる内に、当初やっていたことを忘れてしまう…なんてことがた
> #まにあります(^^;)

ありがちですね。
まあ、私はむしろそっちを目的として、オブジェクトブラウザを見ることのほうが
多いんですが。



To: 筑集眺餅 さん

> 「召喚」とは言いえて妙ですね。

あれですか、ムービーが長すぎて使ってみて後悔、という。
# あ、そんなこと書いたら土屋さんに対して失礼ではないか。

> へっへっへ。早速、XPを入れてみましたよぅ。
> サイケでキッチュなインターフェースは、家族で切り替えて使うのに
> 便利で、ビデオや写真の扱いが楽チンなので、なかなかナイスです。

サイケでキッチュ…。いやはや。
有志が作成したcoolなスキン(テーマ? なんでもいいや)を待つとしましょう。
ってあれって置き換え可能なもんなのだろうか?

> が、「管理者」か「制限つきアカウント」しかなくて、「制限つき〜」だ
> と Wz Editor が使えない。

え、2個しかないんですか? 追加できないとか?
Home Editionだけですよねえ。

> ”ファイル システムおよびレジストリ セキュリティがサポートされて
> いなかったため (Windows 95 および Windows 98)、また既定のセキュリ
> ティ設定が緩やかな状態で出荷されたため (Windows NT)、Users は、Windows 2000 より前のバージョン用に書かれたほとんどのプログラムを
> 実行できません。”・・・聞いてないぞぅ。

あ、私Win2000で経験済みなのでよくわかります。
だいたいiniファイルに設定を書き込むアプリは全滅ですね。Users。
でも、そういうときのための「互換モード」じゃないんですか?

筑集眺餅 さん 2001年 11月 19日 21時 35分 19秒

To:土屋さん

>MLの方に投稿してみたExcelを使ったコモンダイアログ召喚ですが、

「召喚」とは言いえて妙ですね。
げ、”MPが足りない”

To:むたぐちさん

>WindowsXP、ついに登場ですね。
>皆さんは導入されましたか?

へっへっへ。早速、XPを入れてみましたよぅ。
サイケでキッチュなインターフェースは、家族で切り替えて使うのに
便利で、ビデオや写真の扱いが楽チンなので、なかなかナイスです。

が、「管理者」か「制限つきアカウント」しかなくて、「制限つき〜」だ
と Wz Editor が使えない。

”ファイル システムおよびレジストリ セキュリティがサポートされて
いなかったため (Windows 95 および Windows 98)、また既定のセキュリ
ティ設定が緩やかな状態で出荷されたため (Windows NT)、Users は、Windows 2000 より前のバージョン用に書かれたほとんどのプログラムを
実行できません。”・・・聞いてないぞぅ。


SIGNAL9 さん 2001年 11月 19日 09時 21分 12秒

To: むたぐちさん

俺>>以上、MIND風にお伝えしました(爆)

>それって、ひまわりみたいなもの?

MINDというのはこういうものなんです。
http://www.scripts-lab.co.jp/qa/whatsmind.html
DOS時代からある、由緒正しいお笑い…じゃない、開発言語なんで
す(笑)。昔々、始めて見た時は腹筋割れるかと思いました(爆)。

俺>>DirectAnimationコントロールはIE4以降に含まれていますので、

>おお、こんなのがあったんですね。
>システム標準なコンポーネントなのに、知りませんでした。
>うーん、まだまだいろいろあるんだなあ…。

IEプラットフォームではけっこうユーザがいるみたいですよ。雑誌投稿の
ネタでも時々見かけますし。
ぼくは積極的に使う機会がないんで詳しくないんですが、上手く使えば簡
単なゲーム(RPGとか)なら、スクリプトだけでも組めそうですね。

#たまに、VBAなどの他の言語環境でCOMの参照設定などをやると、見た
#こともないようなエントリが急に出来ていて、「あれ、なんだこれ」と
#調べ始めてる内に、当初やっていたことを忘れてしまう…なんてことがた
#まにあります(^^;)

土屋 さん 2001年 11月 19日 08時 43分 22秒

モーダルダイアログ関連ですが、次のようなものはどうでしょう。
どうもabout:blank関係は、うまく動くPCとうまく動かないPCがありますが。

Set IE = WScript.CreateObject("InternetExplorer.Application","IE_")
IE.Navigate "about:blank"
Do While IE.Busy:WScript.Sleep 100:Loop
Ie.Visible=True
IE.Document.Write "<html><body><input type=button id=MD onClick=showModalDialog(""about:OK?"",window,""status:false;dialogWidth:320px;dialogHeight:240px"")></body></html>"
IE.Document.all.MD.focus
IE.Document.all.MD.click

土屋 さん 2001年 11月 19日 08時 22分 56秒

MLの方に投稿してみたExcelを使ったコモンダイアログ召喚ですが、
こっちにも投稿しちゃおうっと。

Set objXL = CreateObject("Excel.Application")

'ファイルを開くダイアログ
strOpenFileName = _
objXL.GetOpenFilename("WSHファイル, *.vbs;*.js;*.wsf")
If strOpenFileName <> False Then
MsgBox strOpenFileName
End If

'名前をつけてファイルを保存ダイアログ
strOpenFileName = objXL.GetSaveAsFilename( "", _
"CSVファイル(*.csv),*.csv,すべてのファイル (*.*) ,*.*")
If strOpenFileName <> False Then
MsgBox strOpenFileName
End If

objXL.Quit
Set objXL = Nothing

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

ちょっと改良。
リサイズ・移動が見えないようにした。
# たまに失敗することがあります。理由は不明。

Set Shell = WScript.CreateObject("Shell.Application")
sPath="C:\"

Shell.ShellExecute sPath,,,,0
Do Until Shell.Windows.count > 0
WScript.Sleep 100
Loop

For Each oWindow In Shell.Windows
Set oDocument=oWindow.document
If TypeName(oDocument)="IShellFolderViewDual" Or _
TypeName(oDocument)="WebViewFolderContents" Then
If UCase(oDocument.Folder.Items.Item.Path) = UCase(sPath) Then
With oWindow
.Top=0
.Left=0
.Height=500
.Width=500
End With
End If
End If
Next

Shell.ShellExecute sPath,,,,1

Lib30 さん (lib30@write-off.f2s.com) 2001年 11月 19日 00時 05分 44秒
URL:http://www.ob.aitai.ne.jp/~kazoo/

どうも、なんか久しぶりに書き込みします。
各クラスに入ったパソコンなんですが、ゲーム大好きな生徒の
所有物となっています。Vectorからゲームをたくさんダウン
ロードしてきて休み時間中に寸暇を惜しんでやっています。
どうも、各アカウントのデータはサーバー内にすべて保存されていて、
どのパソコンからログインしても同じデスクトップ環境になります。
ただし、目の前にあるパソコン内のデータはいじれません。


最近XMLHTTPオブジェクトを使ってサーバーにデータを送ることに
チャレンジしています。それで、「Excite翻訳」にデータをPOSTして
日本語の英訳を取得するサンプルを作ってみました。

var text = "今日は天気です"
WScript.Echo(text + "\n" + J2E(text))

function J2E(str) {
str=encodeURIComponent(str)
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
xmlhttp.Open("POST","http://www.excite.co.jp/world/text/",false)
xmlhttp.send("wb_lp=JAEN&before="+str)
var strHTML=xmlhttp.responseText
var strPattern = /<textarea .*name="after".*>(.+)<\/textarea>/ig
strHTML.match(strPattern)
var str = RegExp.$1
return(str)
}


このスクリプトは日本語処理が結構シビアで、Win2000ではファイルをJISで
保存しないとうまくいきません。SJISは、どうも内部でUNICODEとして処理されて
いるようで、サーバーに送る際もUNICODEで送ってしまってうまくいきません。
また、本当は英→日をやりたいのですがxmlhttp.responseTextは相変わらず文字化け
した文字列を返してくるので、日本語を取得することができません。どうにか
ならないでしょうかね。


To 管理人むたぐち さん

> ○WindowsXP登場

うちでは家族がMeを使っているので、買う可能性大。
何せMeは一日一回ハングアップしますから。自分が使っているのは
Win2000なのでアップグレードするつもりはありませんが。
あと、ZDNetのニュースで以前「家庭内の複数のパソコンにXPをインストールできる
ように家族アカウントを数十ドルで提供する」旨の記事を読んだことがあるのですが、
そういう話は聞きませんね。なしになったのでしょうか。


> cmdlib.wscがちょっと意表を突かれました。ぜひソースを見たいものです。

sprintfなどはなかなか使えそうですね。数値から簡単にRGB16進法を取得できます。
Hex関数を使えばいいと思うかもしれませんが、あれは桁が足りなくても0を
補ってくれないもので(別に付け足すのは簡単なのですが)。

ちなみに、Script版sprintf関数のソースはここにもあります。
http://www.goice.co.jp/member/mo/amuse/javascript/expert/
# 以前話題になっていた、JavaScriptによるZIP圧縮のソースもあります。

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

○WindowsXP登場

WindowsXP、ついに登場ですね。
みなさんは導入されましたか?
私はまだですが、そのうち入れたいと思っています。もちろんインターフェースはWin2000互換モードでね(笑)

スクリプト方面で注目すべき点は、WSH5.6だけだと思っていたのですが、他にも
いろんなフィーチャーが追加されているようです。
http://content.communities.msn.com/WindowsScript/windowsxp.msnw
MaskEditコントロールみたいなことができるようになったみたいですね。
これは良さげ。

SOAP clientやMMC 2.0オートメーションも要注目ですね。
cmdlib.wscがちょっと意表を突かれました。ぜひソースを見たいものです。

あと、Shell32はどうなってるんかな…。


○更新情報

ダウンロードのページをちょっと改装。
今ではあまり意味がないと思われるスクリプトを数点削除。
OSの種類が増えすぎてわけがわからなくなってきたので、動作環境を
WSH5.6、Win98SE以上必須とすることで簡略化した。
MSに倣って、Win95は切り捨てることにしました(^^;

あと、スクリプトを数点追加しましたのでどうぞ。
何をいまさら的なスクリプトかもしれませんが、原点回帰ということで。



To: 土屋 さん

> メモ帳などの任意のプログラムを常に手前にして起動する技はWSHにはないでしょう。
> (これは、プログラム側で実装しなければならないことなのでは、、)

一応、SetWindowPosというAPI関数を指定のウィンドウハンドルを持ったウィンドウに
送ることで、外部から制御できます。
WSH+DynaCallでやるなら、以下のようになります。

Const HWND_BOTTOM = 1
Const HWND_BROADCAST = &HFFFF&
Const HWND_DESKTOP = 0
Const HWND_NOTOPMOST = -2
Const HWND_TOP = 0
Const HWND_TOPMOST = -1

Const SWP_DRAWFRAME = &H20
Const SWP_FRAMECHANGED = &H20 ' The frame changed: send WM_NCCALCSIZE
Const SWP_HIDEWINDOW = &H80
Const SWP_NOACTIVATE = &H10
Const SWP_NOCOPYBITS = &H100
Const SWP_NOMOVE = &H2
Const SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering
Const SWP_NOREDRAW = &H8
Const SWP_NOREPOSITION = &H200
Const SWP_NOSIZE = &H1
Const SWP_NOZORDER = &H4
Const SWP_SHOWWINDOW = &H40

Set UserWrap1 = CreateObject("DynamicWrapper")
Set UserWrap2 = CreateObject("DynamicWrapper")
UserWrap1.Register "user32.dll", "FindWindowA", "I=ss","f=s", "r=l"
UserWrap2.Register "user32.dll", "SetWindowPos", "I=lllllll","f=s", "r=l"

'電卓を「常に手前に表示」
UserWrap2.SetWindowPos UserWrap1.FindWindowA (vbNullString, "電卓"),HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE

ところで、
Title="電卓"
UserWrap2.SetWindowPos UserWrap1.FindWindowA (vbNullString, Title),HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
とやると動作しないのは何故でしょう?



To: SIGNAL9 さん

> DirectAnimationコントロールはIE4以降に含まれていますので、
> ある意味Windows標準のコントロールですし、WSHなどのスクリプト
> からも使えますし(元々ブラウザのスクリプト用なので)、主要な
> グラフィック操作の大半がこなせます。

おお、こんなのがあったんですね。
システム標準なコンポーネントなのに、知りませんでした。

うーん、まだまだいろいろあるんだなあ…。



To: たる さん

> たぶん、総合して作業フォルダ>path通しフォルダ(Runとかの実行系)>スクリプトを実行したフォルダになるのでは?(感覚)
> それで、エクスプローラは作業フォルダを変更すると。
> これを確認できるスクリプトって何かないでしょうか。

MsgBox WshShell.CurrentDirectory
(WSH5.6限定)

パスを省略すると、CurrentDirectoryプロパティのパスが処理の対象となるわけです。
で、CurrentDirectoryプロパティには次の値が入ります。

エクスプローラから実行した場合: スクリプトのあるフォルダ
作業フォルダを指定して実行した場合: 作業フォルダ
コマンドプロンプトから実行した場合: カレントディレクトリ

これは別にWSHに限った話ではないですが…。

> WSHで出来ないことリストって作ったら面白そうですね。
> しかも、それに対して出来るよっていう実績で反証していくような感じの。

だれかこのネタでページを立ち上げてください。
私が殴りこみに行きますので(笑)

> で最後に質問、WinMeでエクスプローラってタイトルが決まってないんですが(フォルダ名だけ)
> これをサイズ、位置指定したいのですが出来ますでしょうか?
> あ、新規に立ち上げででも指定出来るのなら構わないです。

土屋さんの方法だとIEのウィンドウで立ち上がってしまうので、好みが分かれるかもしれませんね。
↑で挙げた、SetWindowPos関数を使う手もありますが、システム標準以外のコンポーネントが
必要になってきます。

以下は非常に冗長で、見てるだけでも鬱になってくるかもしれないスクリプトですが、
こういう方法もあるということで。

Set Shell = WScript.CreateObject("Shell.Application")
sPath="C:\"

Shell.ShellExecute sPath
Do Until Shell.Windows.Count > 0 'エクスプローラが一個も立ち上がってないと、なぜか失敗するので
WScript.Sleep 100
Loop

For Each oWindow In Shell.Windows
Set oDocument=oWindow.document
If TypeName(oDocument)="IShellFolderViewDual" Or _
TypeName(oDocument)="WebViewFolderContents" Then
If UCase(oDocument.Folder.Items.Item.Path) = UCase(sPath) Then
With oWindow
.Top=0
.Left=0
.Height=500
.Width=500
End With
End If
End If
Next

土屋 さん 2001年 11月 17日 23時 30分 37秒

Dear たる さん

> で最後に質問、WinMeでエクスプローラってタイトルが決まってないんですが(フォルダ名だけ)
> これをサイズ、位置指定したいのですが出来ますでしょうか?
> あ、新規に立ち上げででも指定出来るのなら構わないです。

これって、IEにフォルダを振ると、エクスプローラに変身するので、
これを利用できるのでは。
Set IE = CreateObject("InternetExplorer.Application")
URL = "file:///c:\My Documents"
IE.Top = 20
IE.Left = 400
IE.Width = 400
IE.Height = 320
IE.Navigate2(URL)
IE.Visible = True

とりあえず、ここだけ。。。

たる さん 2001年 11月 17日 17時 45分 52秒

To: 土屋 さん

どちらかと言えばTo:sato さん ->筑集眺餅 さん->管理人むたぐち さん -> 土屋 さんになるのかな。

> > どちらも、パスが通っているフォルダのファイルも、フルパス指定なしで
> > 開くことができます。
> エクスプローラで開く時はそうなんですが、
> たとえばWZ EDITORのマクロで開く場合は、WZ EDITORで指定した作業フォルダが優先されているのでは?という現象も見られます。
> で、私の場合は、どこにファイルがあってもOK!という時以外は、
> 同じフォルダの場合でもFSでスクリプトフォルダを指定してやってます。(しかたなく)
たぶん、総合して作業フォルダ>path通しフォルダ(Runとかの実行系)>スクリプトを実行したフォルダになるのでは?(感覚)
それで、エクスプローラは作業フォルダを変更すると。
これを確認できるスクリプトって何かないでしょうか。(Explorerのバージョン依存のような気がします)

Me+PWS4.0+WSH5.6で確認したところ、件のスクリプトはデスクトップ(半角)にテキストが出来ました。
多分ここはWEBサーバーだったら書込み禁止にしているだろうと思いますけど。
ここに出来るのは直接作成じゃないからかな。
そもそもは指定しないとエクスプローラから実行しても
そこに出来るものとばかり思っていました。(IE3〜5を使用)

こっちは 武井進 さん -> 土屋 さんかな(それにしても精力的にレス書きされてますね)

> 50-21のたるさんのスクリプトのようなモーダルダイアログのことですか?
> IEの機能をWSHで召喚すれば可能だと思います。(といおうかそのまま実例ですね)
あうー、ごめんなさい。
あのダイアログは作成した側のウィンドウの上にはなりますが、他ウィンドウを上回ることはないです。
しかもあのスクリプトでは、自分自身が作成したwindowだから既存の制御になんの意味もないという。
なので、未検証ですが常駐もどき & AppActivateではどうでしょう?

WSHで出来ないことリストって作ったら面白そうですね。
しかも、それに対して出来るよっていう実績で反証していくような感じの。
さまざまなコンポーネントの勉強にもなりそうだし。

あ、でもそれを目的にしたコンポーネント作りはどうか。判断が悩みどころ。

で最後に質問、WinMeでエクスプローラってタイトルが決まってないんですが(フォルダ名だけ)
これをサイズ、位置指定したいのですが出来ますでしょうか?
あ、新規に立ち上げででも指定出来るのなら構わないです。

Ranma8 さん 2001年 11月 16日 23時 59分 47秒

SIGNAL9さん貴重な貴重な情報ありがとうございます。

>DirectAnimationコントロールはIE4以降に含まれていますので、
>ある意味Windows標準のコントロールですし・・・

IEですと、まさに標準!この方向で勉強していきたいと思います。
突破口が見つかって助かりました。本当にありがとうございます。

それにしてもWSHって素晴らしい技術ですね!
言語もBASIよりもシンプルで、楽しそうです(^_^)
学習意欲がわいてきました。

今後ともよろしくお願いいたします。

Ranma8

土屋 さん 2001年 11月 16日 20時 53分 16秒

WSHのMLの方にも投稿しましたが、
ADOとDAOのスピードの比較です。

WSHから、ADOとDAOでAccessのMDBデータベースに接続して、
5000件のデータを追加・読み込み・更新・削除を行うスピードを比較してみました。

普通、「97に比べて2000は遅くなった。」「DAOに比べてADOはAccessのデータベース操作はかなり遅い。」と言われ、そう信じていたのですが、結果はご覧の通りです。

(表がずれますが、順番にならんでますのでご容赦を。)
ADO 2000 DAO 2000 ADO 97 DAO 97
│追加 │ 1.5 │ 1.4 │ 2.0 │ 1.7 │
│読み込み│ 0.8 │ 0.9 │ 0.9 │ 1.2 │
│更新 │ 6.4 │ 1.6 │ 5.0 │ 1.8 │
│削除 │ 17.5 │ 0.4 │ 11.5 │ 0.4 │

(それぞれ5000件のデータ。単位は秒)

きっかけの(参考にした)サイトは、
http://homepage1.nifty.com/tsware/labo/index.htm
ですが、他のところもとても参考になります。作者の方に感謝
DAOの比較においては、全然違う結果になってしまいましたが。

SIGNAL9 さん 2001年 11月 16日 18時 17分 09秒

すみません、ちょっと勘違いしてました。DirectXでキャプチャと
いうのは見当ハズレなようです。

調べたら、WIA(Windows Image Acquisition)というモノを見つ
けました。
コッチの方がそれらしいかと思いますが…
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wia/ref-auto_9orx.asp

#実際には、Windows Media(かMultiMedia)との合わせワザになる
#のかな?

市販品でもありそうですね(LeadToolsあたりでできないのかな)。

SIGNAL9 さん 2001年 11月 16日 17時 01分 53秒

To:Ranma8 さん

直接の回答ではないのですが。

>●Windows標準のビデオキャプチャソフトをWSHで制御
ぼく自身はキャプチャまではやってないのですが、MS標準という
ことだと、DirectXコントロール(DirectAnimationコントロール
など)が検討の可能性はあると思います。

DirectAnimationコントロールはIE4以降に含まれていますので、
ある意味Windows標準のコントロールですし、WSHなどのスクリプト
からも使えますし(元々ブラウザのスクリプト用なので)、主要な
グラフィック操作の大半がこなせます。
英語ですがドキュメントはこちら。
http://www.microsoft.com/Developer/PRODINFO/directx/dxm/help/da/ref_script/scriptref.htm
http://www.microsoft.com/Developer/PRODINFO/directx/dxm/help/da/contents.htm

#関係ないけど、コレが出てきたんでDoodleの更新ってヤル気がなかった
#んです(笑)

ただ、ImportはあるけどExportが? まあ、方法が無いわけはないと
思いますが…

またDirectX8.1からはVideo Capture Update for DirectX 8.0
がリリースされています。コレ自体がスクリプトから呼べるかどう
かは試してないですが、調べてみる価値はあるかもしれません。
http://www.microsoft.com/japan/directx/homeuser/downloads/default.asp

シオコ さん 2001年 11月 16日 16時 05分 09秒

管理人様。お礼が遅くなってすみません。
急な仕事が入ったものですから。。。
あの後、アドバイスのとおりに追加してみたのですが、時間がなくてまだちゃんと検証していません。
やってみて、疑問質問がありましたら、また書き込みさせていただきます。
ありがとうございました。

Ranma8 さん 2001年 11月 16日 03時 15分 03秒

初めましてこんにちは。
Macでの開発がメインのRanma8と申します。
Win環境は事務用に使う程度であまり詳しくないのですが、次ぎの作業を
自動化する必要がでてきました。可能でしょうか?

●Windows標準のビデオキャプチャソフトをWSHで制御
1.静止画像(JPG)を任意のパスに保存。
2.動画ファイルを保存。

これだけのことです。キャプチャソフトはOS標準のものでなくてもいいの
ですが、自動化に対応しているようなソフトウエアがあれば、このソフト
名などを教えていただけると幸いです。

最近、印刷の世界にもWindows機が出現しているので、管理者としては大変(^_^;
MacではAppleScriptという同様の制御言語があります。(結構遅い)

土屋 さん 2001年 11月 16日 02時 24分 53秒

Dear むたぐち さん

> WshShell.Runも同様ですね。
> これ、意外と知られていないのかな?

> どちらも、パスが通っているフォルダのファイルも、フルパス指定なしで
> 開くことができます。

エクスプローラで開く時はそうなんですが、
たとえばWZ EDITORのマクロで開く場合は、WZ EDITORで指定した作業フォルダが優先されているのでは?という現象も見られます。
で、私の場合は、どこにファイルがあってもOK!という時以外は、
同じフォルダの場合でもFSでスクリプトフォルダを指定してやってます。(しかたなく)


Dear 武井進 さん

> たとえば、タスクマネージャーは、他の画面をクリックしても、常に一番前で表示されます。
> このような事をしたいと思っています。

50-21のたるさんのスクリプトのようなモーダルダイアログのことですか?
IEの機能をWSHで召喚すれば可能だと思います。(といおうかそのまま実例ですね)
メモ帳などの任意のプログラムを常に手前にして起動する技はWSHにはないでしょう。
(これは、プログラム側で実装しなければならないことなのでは、、)


Dear AKI さん

> WSHではSQLseverのDBを参照することはできるのでしょうか。

38-14 の、高橋 さんのスクリプトをご覧になれば、そのまま実例がみられますよ。


ところで、何の脈絡もないのですが、ADOを使ってAcceess2000のMDBファイルとその中のテーブルを作成するWSHのサンプルです。
接続文字列を変えると、他のDBにも応用可能なのでは、と。

Const strDBName = "MyTest.mdb"
Const strTBLName = "一覧"

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = objFS.GetParentFolderName(WScript.ScriptFullName)
strDBPath = objFS.BuildPath(strFolder,strDBName)
Set objFS = Nothing

strCN = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & strDBPath

Set objCAT = CreateObject("ADOX.Catalog")
objCAT.Create strCN
Set objCAT = Nothing

Set objCN = CreateObject("ADODB.Connection")
objCN.ConnectionString = strCN
objCN.Open

strSQL = "CREATE TABLE 一覧 (" & _
"ID LONG CONSTRAINT 一覧キー PRIMARY KEY," & _
"氏名 TEXT (20)," & _
"ふりがな TEXT (15)," & _
"郵便番号 TEXT (10)," & _
"現住所 TEXT (20)," & _
"電話番号 TEXT (15)" & _
");"

objCN.Execute strSQL
objCN.Close
Set objCN = Nothing

MsgBox "完了しました"

筑集眺餅 さん 2001年 11月 15日 23時 55分 19秒

To:むたぐちさん、miyaさん

>ちなみに、エラーが出る環境というのはどんなんでしょう? > miyaさん
>Win2000+IE6では特にエラーは出ませんでした。

タブのようなインデクス(「商品紹介」とか)の上をマウスポインタが1回通る
と、2回エラーメッセージが出ます。@Win2000+IE6
原因はってぇと、kiaさんの ご指摘の通りかと思われますです。

エラーの出ないページの changeImages()の引数は2つですが、エラーの出る
ページの changeImages()の引数は4つなので、たぶん、後ろの引数2つが余計
でしょう。

ところで、クツワの筆入れって、なんか懐かしい・・・。

武井進 さん (susumu-takei@msd.biglobe.ne.jp) 2001年 11月 15日 12時 40分 34秒

Wshから立ち上げた画面を常に一番前にするという方法はありますでしょうか?
Windowsの場合、クリックされた画面が一番前に来てしまいますが、それを抑止する方法を探しています。
たとえば、タスクマネージャーは、他の画面をクリックしても、常に一番前で表示されます。このような事をしたいと思っています。
よろしくお願いいたします。

AKI さん 2001年 11月 15日 09時 41分 16秒

はじめまして。初心者なんでとんでもないことをお聞きすると
思いますが、宜しくお願いします。

WSHではSQLseverのDBを参照することはできるのでしょうか。

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

To: SIGNAL9 さん

> お言葉に甘えて(^^;)、大筋こんな感じにしてみます
>
> function LoadFromDeskTop(WindowClassName)

いい感じじゃないでしょうか。
完成を楽しみにしてます。

> 以上、MIND風にお伝えしました(爆)

それって、ひまわりみたいなもの?



To: 初心者 さん

> 直前の
> bConnected=(InStr(oExec.StdOut.ReadAll, "...")>0)
> の記述を外したら表示されるようになりました。
> なぜかtext_streamの中身が消えてしまうようです。

TextStreamってのは、基本的に読んだ部分は破棄されるので、
ReadAllを実行した段階で、すべて破棄されます。
ReadAllした後にそのストリームの読み出しをする際、
標準出力のストリームの場合はエラーにはなりませんが、これが
テキストファイルのストリームである場合は、「ファイルの最後を越えた入力を
行おうとしました」というエラーになります。



To: kia さん

> というかなんとなく板違いかな?

かもしれません。
まあ、(IEで動かす限りは)ActiveXスクリプトには変わりないので、いいんじゃないでしょうか。

ちなみに、エラーが出る環境というのはどんなんでしょう? > miyaさん
Win2000+IE6では特にエラーは出ませんでした。



To: 筑集眺餅 さん

> ほんとだ。ここだけ試すとスクリプトのフォルダに作られますね。
> OpenTextfile("test.txt", ForReading) もスクリプトフォルダに
> 置いたものはパスなしでOKでした。
> こりゃ便利。

WshShell.Runも同様ですね。
これ、意外と知られていないのかな?

どちらも、パスが通っているフォルダのファイルも、フルパス指定なしで
開くことができます。

筑集眺餅 さん 2001年 11月 14日 21時 28分 46秒

To:むたぐちさん

>>>set objf = objfs.createtextfile("test.txt",true)
>> の "text.txt" にはパス指定がないですが、どこのパスにできるんでしょね?
>WSHから実行する場合、普通はそのスクリプトが存在するフォルダに生成します。
>ただし、作業フォルダを指定していると、作業フォルダに生成します。

ほんとだ。ここだけ試すとスクリプトのフォルダに作られますね。
OpenTextfile("test.txt", ForReading) もスクリプトフォルダに
置いたものはパスなしでOKでした。
こりゃ便利。

kia さん (kia@geocities.co.jp) 2001年 11月 14日 17時 03分 17秒

ご無沙汰です。

>miyaさん
確認はしてないので推測ですが、
存在しない画像を入れ替えようとしているのではないですか?

エラーが出ているところではなく、
changeImages()を呼び出しているところを見てください。
onmouseoverとかonmouseoutとかのところ。
index_12〜index_19のイメージは実際は無いんと違いますか?
どーでしょ?

というかなんとなく板違いかな?

初心者 さん 2001年 11月 14日 16時 23分 30秒

To むたぐち さん(再送)

>WScript.StdOut.Write oExec.StdOut.ReadAll 'pingの標準出力をスクリプトの標準出力に書き込む。
>WScript.StdIn.ReadLine 'これでスクリプトのウィンドウが強制的に閉じられるのを防ぐ。

>でOKだと思います。

直前の
bConnected=(InStr(oExec.StdOut.ReadAll, "...")>0)
の記述を外したら表示されるようになりました。
なぜかtext_streamの中身が消えてしまうようです。
お騒がせしました。

初心者 さん 2001年 11月 14日 16時 01分 27秒

To むたぐち さん

>WScript.StdOut.Write oExec.StdOut.ReadAll 'pingの標準出力をスクリプトの標準出力に書き込む。
>WScript.StdIn.ReadLine 'これでスクリプトのウィンドウが強制的に閉じられるのを防ぐ。

>でOKだと思います。

それでも残念ながら何も表示されませんでした。
もう少し試行錯誤してみます。
ありがとうございました。

miya さん (kaihatsubu@kutsuwa.co.jp) 2001年 11月 14日 12時 55分 45秒
URL:http://www.kutsuwa.co.jp

ホームページをリニューアルしたのですが、ノートパソコンで見ると
他のページに飛ぶアイコンにクリックしようとすると、

ランタイムエラーが発生しました。デバックしますか?
行20
document[...]はオブジェクトではありません

というエラー表示がでます。
他の出ないページと比較しあたのですが、行20に違いがあるようには思えません。
宜しければ教えてください。
なお、エラー表示がでるのはクツワツアーと皆の広場と求人のところです。

SIGNAL9 さん 2001年 11月 14日 09時 58分 07秒

土屋さん>これは、WSHなどから入力されたWindowタイトルをFindWindowで取得して、
土屋さん>取得できなければ無視、という感じでいいと思うんですが。
土屋さん>ASPがらみだと使えない技術のような感じもしますし。

むたぐちさん>私は単に「アクティブウィンドウをキャプチャする」メソッドがあれば
むたぐちさん>いいかな、と思います。
むたぐちさん>アクティブにしたいウィンドウは、WshShell.AppActivateでアクティブ
むたぐちさん>化できますし、機能的にはこれで問題ないかと。

どうも有難うございます。
お言葉に甘えて(^^;)、大筋こんな感じにしてみます

function LoadFromDeskTop(WindowClassName)

もし WindowClassName が ''(指定無し) なら
WCN := 'ProgMan' // ProgMan はデスクトップのウィンドウクラス名
それ以外
WCN := WindowClassName(引数採用)
もし終わり

もし WCN が '@FORE' という文字列を含んでいたら
対象=最前面のウィンドウ (GetForegroundWindow)
それ以外
対象=WCNというクラス名のウィンドウを探す(FindWindow)
もし 見つかったら
そのウィンドウを最前面へ?? (BringWindowToTop) // ここはちょい疑問。余計なお世話か?
もし終わり
もし終わり

もし エラーが発生してたら(GetLastError<> 0)
エラーを返す
もし終わり

以上、MIND風にお伝えしました(爆)

筑集眺餅 さん 2001年 11月 14日 09時 20分 10秒

To:素人さん

>VBスクリプトで「GOTO文」を使うことはできないのでしょうか?
>色々試したのですがダメだったのです

ダメっす。 お疲れさまでした。(^^;)

ヘルプの「VBA の機能で VBScript に含まれていない機能」の項目を見ると、
制御構造で GoToステートメントが挙がってます。
On Error GoTo 0 ってのがありますが、別物っす。

To:エブリボデ

家族で風邪引いて参ってます。みなさま、気ぃつけて。

素人 さん 2001年 11月 14日 08時 38分 32秒

非常に単純なことですが
VBスクリプトで「GOTO文」を使うことはできないのでしょうか?
色々試したのですがダメだったのです

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 11月 14日 02時 12分 49秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 初心者 さん

> ここで最後に
> WScript.Echo oExec.StdOut.ReadAll
> のような記述で標準出力の内容をそのままコマンドライン実行ウィンドウに表示できれば
> ベストなのですが、これは虫が良すぎますよね。

sIP="127.0.0.1"
Set oShell=CreateObject("WScript.Shell")
Set oExec=oShell.Exec("ping -n 1 -w 1000 " & sIP)
Do While oExec.Status=WshRunning ' ping の実行が終わるまでループ
WScript.Sleep 50
Loop

WScript.StdOut.Write oExec.StdOut.ReadAll 'pingの標準出力をスクリプトの標準出力に書き込む。
WScript.StdIn.ReadLine 'これでスクリプトのウィンドウが強制的に閉じられるのを防ぐ。

でOKだと思います。
スクリプト自体の標準入力・出力も制御できるというところがポイントです。
(この機能自体はWSH2.0からありました。他のプロセスの標準入出力が扱えるように
なったのはWSH5.6から)



To: SIGNAL9 さん

> (1)「デスクトップ」が無い場合がある。
>  例えばASPやWSHを画面対話件無しのサービスから動かした場合。
>  →これはエラーにするしかない。あんまり状況依存のコードは入れ
>   たくないと思いますが…。

これ、あんまり状況がよくわかっていないのですが、そういうこともあるわけですか。

> (2)スクリプトから動いた場合、人間が介在しないので、「現在のア
>  クティブウィンドウ」などの概念が難しい
>
>  端的に言えば、
>  ・スクリプトから見て「キャプチャしたいウィンドウ」をどう指定
>   させるか。
>  という問題です。

私は単に「アクティブウィンドウをキャプチャする」メソッドがあればいいかな、と思います。
アクティブにしたいウィンドウは、WshShell.AppActivateでアクティブ化できますし、
機能的にはこれで問題ないかと。
それならWshShell.SendKeysでAlt+PrintScreenを送ればいいじゃん、という人がいるかも
知れませんが、ヘルプによると、SendKeysではPrintScreenを送れないので、不可なのです。
# 新ヘルプは、AppActivateが成功したかどうかのBool値を返すこととか、引数に
# プロセスIDが取れることとかが(今になってやっと)書かれていますね。



To: ひっし さん

> MsgBoxの文字制限なのですが、いろいろ調べるとやはり制限が
> あるそうで、1 バイト文字で約 1,024 文字だそうです。

少ないような多いような…。
改行が多いと、ダイアログが画面に収まらないこともありますね。



To: シオコ さん

> この処理ははすんなり出来たのですが、
> ここにWMPが途中でエラーになった場合、WMP&IEを終わらせ、
> 新たにIE&WMPを起動するという処理を組み込みたいのです。
>
> エラーになった場合というのは、「コネクションが切れました」などの
> エラーメッセージウィンドウが出た場合を指します。
>
> メッセージウィンドウが表示されているという判断ができるのか
> それとも、システム上で何かの判断材料があるのか
> そもそもWSHでは無理なのか、教えていただければ幸いです。

ちょっと難しいですね。
WMPのイベントに、「エラーが発生したとき」というのは、なかったでしたっけ。

もしあれば、たとえばそれがOnErrorなら、
Sub MediaPlayer_OnError()
window.open url
window.close
End Sub
とかのコード(例は超適当なのであしからず)を書いてやればいいような気がします。


To: 土屋 さん

> これは、WSHなどから入力されたWindowタイトルをFindWindowで取得して、
> 取得できなければ無視、という感じでいいと思うんですが。
> ASPがらみだと使えない技術のような感じもしますし。

いや、最近流行り?の「リアルタイムで自分のデスクトップ晒しあげ」ができるので
使える技術です。(「使える」の意味が違うか)

> 昔話題に出したました、オートメーション操作でExcelにデータを貼り付ける処理ですが、
> セルにFor 〜 Nextで代入する方法よりもクリップボードを介して一気に貼り付けた方が速く、
> それよりも、CopyFromRecordsetでレコードセットから直接貼り付けた方が速く、
> 一番速かったのは、配列を直接代入する方法でした。
> (Timerを使って測ってみました。他の環境ではどうかわかりませんが。。。)

検証してみると意外な方法が速い、ということがたまにありますよね。
クリップボードの方がFor...Nextより速いというのは、私にとってかなり意外です。

> Dictionaryでも配列が使えるので、なかなか便利と思って配列を勉強中なのでした。

そういえば、例の新ヘルプには、Dictionaryオブジェクトの説明に、「Perl関連の配列」と
書かれてます。
こういう、わかりやすい誤訳は微笑ましくていいですね。

> で、配列の縦と横を入れ替える時って、やはりFor 〜 Nextで代入していくしか方法がないのかなあ。*/

というか、Excelのメソッドかなんかに、そんなのなかったでしたっけ?

土屋 さん 2001年 11月 13日 22時 17分 42秒

Dear 高橋 さん

> ドキュメントからスケルトンコードをおこしたり、テストデータを作ったり&消したり、

いいですねぇ。
私の場合、MDBデータベースからデータを取得してWSHでクロス集計し、
Excelファイルに出力する、なんて作業をおこなっているのですが、
WSHでデバッグしたあと、Delphi(Object Pascal)に移行するのを手作業でせっせとやっています。
この作業をWSHでもっと楽できるようにすればいいのかなあ。
(=を:=にして、行の終わりに;つけるだけでもずい分違う気がする)
(あ。WZ EDITORのマクロにした方が楽かなあ)


Dear むたぐち さん

> WSHから呼び出すという話だったら、アリだと思うんですが、
> VBからだとちょっと外れ気味かもしれません。

私もそう思ったんですが、話がWSHとどう結びつけたらいいのか、わからなかったもので。
(でも、どこかにVBのアプリがあったりして、、、)


Dear 初心者 さん

> WScript.Echo oExec.StdOut.ReadAll
> のような記述で標準出力の内容をそのままコマンドライン実行ウィンドウに表示できれば
> ベストなのですが、これは虫が良すぎますよね。

いや、今話題のWSHの新ヘルプを参照していただいて、
ぜひチャレンジしていただきたいところです。
標準出力うんぬんは、WSHではまだ新しい分野で、極めている人はまだ少ない感じがします。
でも、まず誰かにチャレンジしてもらって、、、というのであれば、
確かに虫が良すぎますね、と言えるところですが、、、(それはないですよね)


Dear SIGNAL9 さん

これは、WSHなどから入力されたWindowタイトルをFindWindowで取得して、
取得できなければ無視、という感じでいいと思うんですが。
ASPがらみだと使えない技術のような感じもしますし。


/*ところで、
TeraPadのMLに参加してみたのですが、TeraPadの開発のテンポってすごいですね。
それと、作者のてらおさんの反応のよさと誠意もすばらしい。
(でも、編集中のWSHの実行速度はWZ EDITORの方が上なので、WZ EDITORをメインで使ってますが)


その他、
昔話題に出したました、オートメーション操作でExcelにデータを貼り付ける処理ですが、
セルにFor 〜 Nextで代入する方法よりもクリップボードを介して一気に貼り付けた方が速く、
それよりも、CopyFromRecordsetでレコードセットから直接貼り付けた方が速く、
一番速かったのは、配列を直接代入する方法でした。
(Timerを使って測ってみました。他の環境ではどうかわかりませんが。。。)

データベースの数値データから0〜9、10〜19・・・の人数を男女別に集計する、
という作業でいくつか試してみたのですが、
これもDCountを使うより配列を利用した方が圧倒的に速かったです。
配列って便利。(でも大きくなるとメモリを食うんだろうなあ)
この手の集計は、JETデータベース(拡張子MDBの例のファイル)だと、
TransformやPivot、Partitionを駆使すればかなり快適なんですが、
集計結果の整形がうまくできないので、今後の課題。。。

Dictionaryでも配列が使えるので、なかなか便利と思って配列を勉強中なのでした。

で、配列の縦と横を入れ替える時って、やはりFor 〜 Nextで代入していくしか方法がないのかなあ。*/

シオコ さん 2001年 11月 13日 17時 40分 45秒

最近、WSHに手を出した者です。
やりたいことがあって、それをどう実現するか判らないでいるのですが。
どなたか教えていただけるとありがたいです。

処理の概要は

1. IEを起動
2. 映像ファイルのあるURLを指定する
3. プラグインのWindowsMediaPlayer(以下WMP)が立ち上がる
4. 映像が流れる
5. 映像が終わる時間を間計らって、IEを終了させる

これを一定時間毎に繰り返す処理です。

この処理ははすんなり出来たのですが、
ここにWMPが途中でエラーになった場合、WMP&IEを終わらせ、
新たにIE&WMPを起動するという処理を組み込みたいのです。

エラーになった場合というのは、「コネクションが切れました」などの
エラーメッセージウィンドウが出た場合を指します。

メッセージウィンドウが表示されているという判断ができるのか
それとも、システム上で何かの判断材料があるのか
そもそもWSHでは無理なのか、教えていただければ幸いです。
よろしくお願いします。

Return