高岡 さん 2003年 06月 05日 14時 11分 29秒

むたぐちさん、VBScriptでの手法ご教授ありがとうございます。

なるほど、JavaScriptがVBScriptがどうこうという訳でなく、クラスの仕様として、このように記述できるという事なんですね。

neroさん、連想配列に関する情報源の提示、ありがとうございます。

あの時点ではJavaScriptでやっていると書いたものの、まだ慣れない部分が多かったのでとても参考になります。

せっかくお二方から情報を頂いておきながら、レスが遅くなって申し訳ありません。ほにょさんに教えていただいた方法でうまくいったことで、しばらくJavaScriptでプログラミング漬けになってました(汗)

省吾 さん 2003年 06月 05日 11時 29分 11秒

あささんへ

不愉快な思いをさせて申し訳ありませんでしたm(__)m

プログラム自体はできてたのですがちょっと
気になったもので、お礼のご挨拶をするのも忘れていました、
もう愛想つかされているとは思いますが、
いろいろとお世話になりましてので、最後にお礼だけはと思いまして。

どうもありがとうございましたm(__)m

よく仕様を調べもしていませんでしたので、
IsFolderではフォルダへのショートカットを拾うことは
ないのかな?と、聞きたかったのはここだでした。

なので、IsFolderの直下でフォルダに対して
Not objItem.IsLinkを調べなくて良いのかと
よく考えれば分りそうな馬鹿なことまでも考えていました。

でも、これは自分で調べるべきことでしたね、
あささんの親切に甘えていました。

たいへん失礼を致しました。

並びに、一連の投稿をご覧になれれた皆様にも
お詫び申し上げます。

あさ さん 2003年 06月 05日 09時 54分 00秒

>AAさんへ
ほにょさんに答えられてしまっていました(汗)
解決したようですので、よかったですね。(^^

>省吾さんへ
省吾さんの文面を見れば、こちらが出したプログラムを理解していないのが、うすうす感じられます。(少なくとも私はそう思った)

「私か省吾さんが勘違いしている」か、「私が省吾さんのやりたいことを理解していないか」と、いろいろ考え、出来るだけ親切に対応しようと思って、今までやってきたのですが、一気に冷めてしまいました。

おかしいなと思ったのは、省吾さんの期待通りの処理が出来るプログラムを提示しているのに、「このあたりがちょっと解せないのですが」と言われた所からです。

私は省吾さん専属デバッカーでもプログラマーでもありませんよ。自分で作ってください。
ヒントをもらったら、まずそれについて調べてください。

まさか、ここで動くプログラムを誰かが出してくれることを期待してはいませんよね?(汗)

それから、これからも答える側の労力と気持ちを考えて、文章を書いてくださいね。

では、今までの話で省吾さんのやりたいプログラムは書けると思いますので頑張ってください。
これ以上は、むたぐちさんに迷惑がかかるので、省吾さんへの書き込みは最後にします。

省吾 さん 2003年 06月 05日 07時 29分 18秒

あささんへ

>ひょっとして、「フォルダへのショートカット」の参照先のフォルダまで再帰処理しようなんて考えています???

もう何度も書いていると思うのですが(^^ゞ
ショートカットは "要らない" んで除外したいと。

何をしたいかは、全ソースを挙げさせて頂きましたので
ご覧になって頂ければ分かると思いますが。

ショートカット以外のフォルダ・ファイルのバックアップです。

こんなところです。

ほにょ さん 2003年 06月 04日 23時 17分 55秒

> AAさん

「Show」の反対は「Hide」だろう、ってことで試してみたら
Peedyはアニメーションして消えていきましたよ。

これまで見て見ぬふりをしてきたMS Agentを
今回初めてインストールしたわけですが
たった数行のスクリプトで動くことに感動です。
いいおもちゃが見つかったぞ。しめしめ。

AA さん 2003年 06月 04日 17時 20分 46秒

申し訳ないです。うまく説明できませんで…
XPで下記プログラムを作ってAgentを出しています。
Dim Obj,Char
Set Obj = WScript.CreateObject("Agent.Control.1","MyAgent_")
Obj.Connected = True
Obj.Characters.Load "Agent"
Set Char =Obj.Characters("Agent")
CHar.MoveTo 100,100
Char.Show
この後、スクリプトを動かしたまま、Char.Showで現れたキャラクタを消したいのですが、コマンドが判りません。教えてください。初心者なのですみません。

あさ さん 2003年 06月 04日 16時 20分 17秒

>AAさんへ
ごめんなさい、私にはAAさんが聞きたい事の意味が良く分かりません。
もうちょっと具体的にお願いします。^^;;


>省吾さんへ
・・・と・・・ここまで書いて、ふと思う・・・・

ひょっとして、「フォルダへのショートカット」の参照先のフォルダまで再帰処理しようなんて考えています???

と考えると、
>どうやら、そこでファイルだろうがフォルダだろうが全てのショートカットが取得されているようでした。
の意味がわかってきた(汗)

だとすると、無限ループにならないように処理を考えないといけませんよ。
例えば、デスクトップ上にあるショートカットが、デスクトップ内を参照していると、グルグル処理が終わらなくなる可能性があります。

どこかで、
Set objDictionary = CreateObject("Scripting.Dictionary")
とか使って、作業済みフォルダを管理する必要があると思います。

--------------------------------------------------
If objItem.IsLink Then
Set objLink=objItem.GetLink
If objLink.Pathがファイルかフォルダか判断処理(手抜き) Then
'フォルダなら
If 既に走査したフォルダかどうか判断処理(手抜き) Then
'まだ処理していないフォルダ
'再帰呼び出し
blnRet = funcFolderScan(objLink.Path)
Else
'処理済みフォルダ
'無視
End If
Else
'ファイルなら
'その他の処理
End If
End If
--------------------------------------------------

こんな感じになるでしょうか・・・
ここまできたら、何をやりたいのか書いてもらったほうがいいかも知れませんね(汗)
私も首突っ込んでしまったので(笑)

あさ さん 2003年 06月 04日 15時 53分 03秒

>省吾さんへ

あ。ひょっとして、難しく考えすぎていませんかねぇ(汗)

If Not objItem.IsLink Then
'リンクでない
'msgbox "Not Link:" & objItem.Name
'ここにやりたい処理を書く。
Else
'リンク
msgbox " Link:" & objItem.Name ← ここで全て取れてしまうみたいです
'・・・ということで、ここでは何もしない。つまり何も書かない。
'Elseから消してもOK
End if

IsLinkでショートカットかそうでないかを判断しているので、ショートカットの時は、何も処理しなければOKなはずですよ。(^^;;
#その為の判断だし^^

objWorkFolder.Itemsは、FileSystemObjectとは違い、ファイルもフォルダも全て列挙されます。
ですので、IsFolderでフォルダかどうかの判断してますので、フォルダでないものは全てファイルなのです。
ショートカットも「*.lnk」という拡張子がついた「ただのファイル」なので、IsFolderではFalseとなります。
ちなみにホームページへのリンクは「*.url」になります。

とりあえず、「あさ さん 2003年 06月 04日 12時 13分 33秒」で書き込んだソースを丸ごと「test.vbs」とでもして保存し、(cscript.exeで)実行して見てください。
で、動きを確認して下さい。

それから、省吾さんがリンクファイル&フォルダを判断したかった理由は、サブフォルダの走査にショートカットが邪魔だったからではないのです??

多分それだけの理由なら、しかもバックアップのコピー処理っぽい話なら、こんな感じでいけると思います。

Function funcFolderScan(strFolderName)
Dim blnRet
Dim objShellApp
Dim objWorkFolder
Dim objItem

blnRet = True

Set objShellApp = WScript.CreateObject("Shell.Application")
Set objWorkFolder = objShellApp.NameSpace(strFolderName)

For Each objItem In objWorkFolder.Items
If objItem.IsFolder Then
blnRet = funcFolderScan(objItem.Path)
If blnRet = False Then
Exit For
End If
Else
'なんかいろいろ処理。省吾さんがやりたい処理をここに書く。
'objItem.Nameで名前だけ、objItem.Pathでフルパス名が取得できます。
'で、エラーが発生したらblnRetにFalseを入れてあげればループから抜けます。
End If
Next

funcFolderScan = blnRet
End Function

もう一度、本来やるべき処理を見直した方がよさそうですね(笑)
頑張りましょう(^^

AA さん 2003年 06月 04日 14時 21分 55秒

 エージェントのコントロールでChar.ShowでShowのプロパティで表示させることはで来ましたが、キャラクタを消すプロパティが判りません。
 誰かご存知の方、教えてください。

省吾 さん 2003年 06月 04日 14時 11分 45秒

あさ さんへ

何度も間違えましてお恥ずかしい(^_^;

>省吾さんのように、FileSystemObjectを使うのであれば、やはり>CreateShortcutを使う必要があるということですね。

VBやAccessでも使えるのでFileSystemObjectを好んで使っています、
この場合、CreateShortcutを使う必要があるのですね!?

さてさて。

If objItem.IsFolder Then
'ここでフォルダへのショートカットかどうかを判断
If Not objItem.IsLink Then
msgbox "Not Shortcut"
End if
Else

で判断するのかと思ったのですが・・・

If Not objItem.IsLink Then
'リンクでない
'msgbox "Not Link:" & objItem.Name
Else
'リンク
msgbox " Link:" & objItem.Name ← ここで全て取れてしまうみたいです
End if

どうやら、そこでファイルだろうがフォルダだろうが全てのショートカットが取得されているようでした。

このあたりがちょっと解せないのですが、
何はともあれこれで何とかできそうです。

一応、CreateShortcutのほうもやってみるつもりでいます。

あささん、Much Thanks!

省吾



あさ さん 2003年 06月 04日 13時 45分 07秒

あ。

と、言うか・・・
結局、リンクのフォルダを見つける必要がなくなったような・・・(爆)

あさ さん 2003年 06月 04日 13時 30分 20秒

あれ?

ずーとここのBBS開いたまま作ってたので、
「省吾 さん 2003年 06月 04日 10時 55分 16秒」の書き込みに気が付かなかったです(汗)

> あき さんへ
あ。で・・・「あ”さ”」の間違いですね(爆)
ひょっとしてわざと・・・?(^^;;

> 不愉快な思いを
いえいえ(汗
そんなつもりはありません(汗
むたぐちさんのロジックの方が断然よかったので、そっちを参考にして、私のは使われず寂しいなぁ・・と思っただけで(汗)
気にしないで下さいね(^^;;;

で、ソースを見た感じ、FileSystemObjectは頭から離して考えてもらえれば、もっと簡単になるかと^^;;;

私の前の書き込みを参考に作り直してもらったほうがいいと思います。

Shell.Applicationについては、ここのサイトにもむたぐちさんが記事を載せていますし、(オブジェクトの説明のところを参照)マイクロソフトのサイトにもHelpがあると思います。(ただし英語だけかも)

頑張ってくださいね^^

あさ さん 2003年 06月 04日 12時 13分 33秒

と・・・言うわけで汚名挽回(汗)
作りましたよ(笑)

'for test
Dim objWshShell
Dim strDesktopFolder
Set objWshShell = WScript.CreateObject("WScript.Shell")
strDesktopFolder = objWshShell.SpecialFolders("Desktop")

call funcFolderScan(strDesktopFolder)

'**************************************************
'
'**************************************************
Function funcFolderScan(strFolderName)
Dim blnRet

Dim objShellApp
Dim objWorkFolder
Dim objItem

blnRet = True

Set objShellApp = WScript.CreateObject("Shell.Application")
Set objWorkFolder = objShellApp.NameSpace(strFolderName)

For Each objItem In objWorkFolder.Items
'IsBrowsable,IsFileSystemあたりをここでチェック必要?
If objItem.IsFolder Then
WScript.Echo " Folder:" & objItem.Path
blnRet = funcFolderScan(objItem.Path)
If blnRet = False Then
Exit For
End If
Else
If Not objItem.IsLink Then
'リンクでない
WScript.Echo "Not Link:" & objItem.Name
Else
'リンク
WScript.Echo " Link:" & objItem.Name
End if
End If
Next

funcFolderScan = blnRet
End Function

今度は動作確認済みです。
場合によっては、IsBrowsableとIsFileSystemで、判断してやらなければならないかも知れません。
とりあえず、これでどうでしょ?省吾さん(^^;;

いやぁ・・・また勉強になったなぁ・・しみじみ。

あさ さん 2003年 06月 04日 11時 27分 17秒

ノォォぉーーーーーー(笑)

前々回の私の書き込みは無視してください(笑)
ということで、よく見ると、むたぐちさんの書き込みに、

> Shell.Applicationの、
って書いてあるじゃないですかぁ・・・

道理でIsLinkがWSHのHelpに載ってないわけだぁ・・・
動かないはずです・・・(汗)

Set objShellApp = WScript.CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace("C:\")
For Each objItem In objFolder.Items
If objItem.IsBrowsable Then
End if
If objItem.IsFileSystem Then
End if
If objItem.IsFolder Then
'ここで再帰呼び出し
End if
If objItem.IsLink Then
End if
Next
って感じになるはずです・・・

省吾さんのように、FileSystemObjectを使うのであれば、やはりCreateShortcutを使う必要があるということですね。

省吾 さん 2003年 06月 04日 10時 55分 16秒

あき さんへ

たいへん失礼しました、一番最初にレス頂いて
いたのですね、全く気付きませんで不愉快な思いを
させてしまいたいへん申し訳ありませんでしたm(__)m

>これではダメでしょうか?(動作確認してません)
>書き込まれた方法で問題なくいけそうな気がするのですが・・・

コンライルエラーです、つまり、このようなメソッドは
サポートしていませんと、言葉足らずで申し訳ありませんでした。

>#SubFoldersにショートカットは含まれないですよね?

それが、フォルダへのショートカットも多々あるんです。

>#なので「If Not subF.items.IsLink Then」はいらないと思います。

なので、これも必要になります。
「If Not subF.items.IsLink Then」を取ってみましたが
「If Not ObjF.items.IsLink Then」もサポートしていないようでした。

一応、下手なコードでお恥ずかしいのですが挙げさせて頂きます。

もっとパフォーマンスを改善できるようなところや、
こうしたほうがソースが綺麗だよ、というような箇所がありましたら、
ご指導いただければ幸いです。

特に、再帰のところでしょうか
フォルダとファイルとを分けてしまっていますが、
二重ループとかでもいけるんでしょうか?

Set WSell = CreateObject("WScript.Shell")
Set FS = CreateObject("Scripting.FileSystemObject")
'Set Shell = WScript.CreateObject("Shell.Application")

'Const BIF_EDITBOX = &H10
'Const BIF_DONTGOBELOWDOMAIN = &H2
'Const BIF_RETURNONLYFSDIRS = &H1

Dim i

'On Error Resume Next

'Set oFolder=Shell.BrowseForFolder(0,"バックアップしたいフォルダを選んでください。",BIF_EDITBOX+BIF_DONTGOBELOWDOMAIN+BIF_RETURNONLYFSDIRS,"C:\原価管理")
'If oFolder Is Nothing Then WScript.Quit

Top = WSell.SpecialFolders("Desktop")

Set FF = FS.GetFolder(Top)

If Not FS.FolderExists("D:\DESKTOP_BACKUP") Then

FS.CreateFolder "D:\DESKTOP_BACKUP"

End If

Set XX = FS.GetFolder("D:\DESKTOP_BACKUP")

'サブルーチン呼び出し
CopyFolder FF, XX

MsgBox "バックアップ処理が正常に終了しました。" & vbCrLf & i & "件のデータを更新しました。"

Sub CopyFolder(F, X)

'ループ1
For Each subf In F.SubFolders

'If Not subf.items.IsLink Then

If FS.FolderExists(X.Path & "\" & subf.Name) Then

'サブルーチン呼び出し
CopyFolder subf, X.SubFolders(subf.Name)
Else

FS.CreateFolder(X.Path & "\" & subf.Name)

'サブルーチン呼び出し
CopyFolder subf, X.SubFolders(subf.Name)

End If

'End If

Next

'ループ2
For Each ObjF In F.Files

If Not ObjF.items.IsLink Then

If FS.FileExists(X.Path & "\" & F.Files(ObjF.Name).Name) Then

If ObjF.dateLastModified > X.Files(ObjF.Name).dateLastModified Then

ObjF.Copy X.Path & "\"
i = i + 1
End if

Else

ObjF.Copy X.Path & "\"
i = i + 1
End If

End If

Next

End Sub

宜しくお願いします。

あさ さん 2003年 06月 04日 10時 53分 16秒

ん・・・・?
なんかIsLinkを勘違いしてそう・・・調べて見よ(ボソ)

あさ さん 2003年 06月 04日 09時 48分 34秒

>省吾さんへ
うぅうぅ〜ん??
問題点がよくわからないのですが・・・・

Set FF = FS.GetFolder("D:\sample")
GetFiles FF

Sub GetFiles(F)
For Each subF In F.SubFolders
Call GetFolder(subF)
Next
For Each ObjF In F.Files
If Not ObjF.items.IsLink Then
'なんか処理
End If
Next
Sub

これではダメでしょうか?(動作確認してません)
書き込まれた方法で問題なくいけそうな気がするのですが・・・
#SubFoldersにショートカットは含まれないですよね?
#なので「If Not subF.items.IsLink Then」はいらないと思います。


何がどうダメだったのでしょうか・・・
具体的にそのロジックで起きた問題点を教えて下さいね。(^^;;;

うまく説明できないのであれば、「その症状を確認できるソースコード」を、全部貼り付けてもらったほうが確認しやすいです。
それなら、こちらもコピペして実行するだけで、症状を見れるので。。。

そうでないと、答える側が、そのプログラムを作って確認しなければならなくなります(汗)


>管理人むたくち様へ
「むた”ぐ”ち」さんの間違いですね(笑)
あと、私のは読まれていないのかな・・・(;o;)な気分になりました(笑)

省吾 さん 2003年 06月 03日 18時 09分 19秒

ショートカットフォルダ・ファイル除外で
ファイルの取得という件に関して補足させて下さい。

Set FF = FS.GetFolder("D:\sample")

'サブルーチン呼び出し
GetFiles FF

Sub GetFiles(F)

'フォルダループ
For Each subF In F.SubFolders

'サブフォルダがあれば再帰
Call GetFolder(subF)

Next

'ファイルループ
For Each ObjF In F.Files

'ファイルの取得

Next

Sub

のように、フォルダオブジェクトを渡しているため
If Not subF.items.IsLink Then
If Not ObjF.items.IsLink Then
でショートカットのフォルダ or ファイルを除外しての
ファイル取得はできませんでした。

この場合ですと何か対処の方法はありますでしょうか?

重ね重ね、宜しくお願いします。

省吾 さん 2003年 06月 03日 17時 32分 06秒

管理人むたくち様へ

お返事ありがとうございます。

>For Each oItem In oFolder.Items
>If oItem.IsLink Then
>Set oLink=oItem.GetLink
>oLink.Path なんたら
>End If
>Next

If oItem.IsLink Then
この条件がショートカットという事でしょうか?

ならばこれで
If Not oItem.IsLink Then
'ファイルの取得
End If

のようにできそうです。


あさ さん 2003年 06月 03日 11時 45分 17秒

>ノリさんへ
こちらは、むたぐちさんにお任せします(汗
実は私HTAをまださわったぐらいしかやってないので(汗
勉強しますです^^;;

>むたぐちさんへ
すんません、私、WScript.StdInとWScript.StdOutを勘違いしていたようです。
やればやるほど、方向が違ってるなぁ・・・と感じて既にあきらめてました(笑)
・・・というか未だにWScript.StdInとWScript.StdOutの使い道がよくわかってません(汗)

○echo ほげほげ|hoge.vbs
これは、「関連付け呼び出し」がうまく動いていないようですね。
ExecやRunでvbsを呼び出す時もそうだったと思いますが、cscript.exeをきっちり指定しないと動かないケースが結構あるみたいです。

○WshShell.Execでtelnet
これは私に依頼されているような気が(汗)

○VB .NET
私もまだ、触っていませんが、軽く見てみた感じ、多言語でクラスとかオブジェクトを理解していれば、結構簡単に入れそうな気がします。
ただ、今までVBしか触ったこと無い人には、敷居が高くなったと思いますね。
初心者向け言語から脱却していくつもりなんでしょうね。マイクロソフトは。。

○BrowseForFolder
やっぱり、そこで話が止まってましたか(汗)
あくまでフォルダ選択用ですもんねぇ・・・
ファイル選択ダイアログ出す場合は、やっぱり私が書いたmscomdlg.commondialogを使わないとできないのかなぁ・・・

○いえいえ、あささんのお陰で随分楽させてもらってます。
いや、ホントにこちらこそ、いろいろ質問が出てくるので、解決するたび勉強になってます(笑)
これからもよろしくお願いします。(^^

○IsLink
はうあ!そんな方法があったのですね・・・知りませんでした(泣)
あぁ・・・なんか悔しいなぁ・・・(笑)
しかもそっちの方が処理速度も速そう・・

山羊 さん 2003年 06月 03日 09時 48分 06秒

管理人むたぐち様ありがとうございました。
無事解決いたしました。
今後とも宜しくお願いいたします。

管理人むたぐち さん 2003年 06月 02日 22時 26分 59秒

To: かや さん&あさ さん

> ここのBBSの過去ログでみると、過去にBrowseForFolderについて議論がされていたようです。
> ということで、どうなったのかむたぐちさん教えてください(笑)
> 私には結論が見つけられませんでした(汗)

私もどうなったのか覚えてないです(w
でも、多分そのときの議論とは別の問題だと思います。

そもそもShell.ApplicationのBrowseForFolderで得られるのはあくまでもFolderオブジェクトで
あって、FolderItemオブジェクトではありません。
ところが、BrowseForFolderメソッドの引数でBIF_BROWSEINCLUDEFILESを指定すると、
何故かファイルが選択できてしまいます。

そして、Folderオブジェクトに対して、oFolder.Items.Item(もしくはWin2000以上ならoFolder.Self)
とすると、自分自身のFolderItemオブジェクトが取得できることを利用すると、
BrowseForFolderで取得した「ファイルのFolderオブジェクト」をFolderItemオブジェクトに
変換できてしまうわけです。

この手を使えば、ファイル名をダイアログから選択させることができ、中々便利です。
実際、かやさんの書かれたスクリプトはWin2000やMEなどではちゃんと動作します。

が、WinXPでこれを実行すると、「ファイルがみつかりません」というエラーになってしまいます。
しかしこれは元々、Folderオブジェクトにファイルを格納するというイレギュラーな技ですから、
本来の正しい挙動に戻ったと言えるかもしれません。

というわけで、WinXPをお使いならば、この手は諦めてください。
(他にも動かない環境があるかもですね。非シェル統合のWin95/NT4はShell.Applicationが
使えないから論外ですけど)

> #って、最近、苦しくなるとむたぐちさんに投げ出してるなぁ・・・(汗)

いえいえ、あささんのお陰で随分楽させてもらってます。
いつもありがとうございます。


To: 省吾 さん&あさ さん

> CreateShortcutっていうと、新規のショートカットしか作れないような感じに思いますが、存在するファイルに対してCreateShortcutすると、しっかり情報を取得できるようです。(5.6で確認)
> この動きから思うに、CreateShortcutは、「ショートカットの作成」ではなく、「ショートカットオブジェクトの作成」という意味のようです。
> まったく紛らわしい・・・

たしかに最初はそう錯覚しますよね。
Shell.Applicationの、

For Each oItem In oFolder.Items
If oItem.IsLink Then
Set oLink=oItem.GetLink
oLink.Path なんたら
End If
Next

って感じの方が直感的で好きです。
(もっともShell.Applicationじゃ、ショートカットを作成することはできないわけですが)


To: ノリ さん

> HTAでフレームを使用し、一般サイトを表示させたいと思っているのですが、
> フレーム上のリンクをドラッグ&ドロップすると
> リンク先のファイルがドロップ先のフレームに表示されてしまいます。

ほんとだ。
Win2000+IE6sp1/WinXP+IE6sp1でhtaを動かすと再現しました。
わけわかんない仕様ですね。

hta側で、各フレームのonbeforeunloadイベントを見て、移動を監視できないですかね?
もしくは、hta側から各フレームのアンカーオブジェクトにアクセスしてD&Dを禁止するとか。
ちょっとやったことがないので分かりませんが。
(htaから外部サイトの子フレームへのアクセスは禁止されてたような気もするなあ)


To: 山羊 さん

> パスにスペースが入ってしまう為に実行できません。

パスを""でくくってください。
ただし、文字列中の"は""のように重ねてかく必要があります。
なのでこんな感じになります。
WshShell.Run """C:\Program Files"""

あとこの掲示板で半角カナを使うと文字化けしますんでよろしくお願いします。

管理人むたぐち さん 2003年 06月 02日 20時 46分 39秒

To: 高岡 さん&ほにょ さん

VBScriptでも同じようにできますよ。

IE.Document.forms[0]["bLogon.y"].click();
は、VBSだと
IE.Document.forms(0)("bLogon.y").click
となります。
正確には、
IE.Document.forms(0).item("bLogon.y").click
ですね。
(もっと冗長に書けばIE.Document.forms.item(0).item("bLogon.y").clickかな)

ただ、VBSはJavaScriptとは違って、すべてのオブジェクトが連想配列として
扱えるという訳ではないです。
この場合、「HTMLFormElementオブジェクトの既定メンバ"item"は、配下のオブジェクト名
もしくはインデックスを引数に取り得るため、連想処理が可能である」
というのが正解ですかね。
つまり、言語の仕様じゃなくてクラスの仕様なわけです。
(ただ、IE.Document.forms(0).bLogon.clickのようなことがVBSでもできる理由は
私にもわかりません。誰か教えてください)

VBやVBAをお持ちの方は、オブジェクトブラウザでMicrosoft HTML Object Library(mshtml.tlb)という
タイプライブラリを参照設定して、仕様を見ると面白い、かもしれません。


To: あさ さん
> 今のみたいに、ブラウザ上で動くスクリプトを指して「VBScript」と呼ぶ場合もあれば、
> Windows上で動くスクリプトを指して「WSH(VBScript)」と呼ぶし・・・

そして実体はどっちも共通のスクリプトエンジンであるところが痺れるところです(w
ASP、HTAで使われるVBSも同一のものですね。
(VBA、VBはそれぞれ別物ですが)

> #そういう意味では、JavaScript覚えたほうが応用範囲が広いかも知れません。

私も、これからWSHを始めるという方には、JavaScriptをお勧めしますね。
VBSは習得するのは楽だと思いますが、他言語に移行するのが難しいような気がします。
現に私もいまだにVBSがメインになってますしね。
また、VBScriptの元になったVBは、言語自体が消滅する方向にありますし。
(VB .NETはもはや別物です。というか使ってる人っているんだろうか?)
(そういえばVBAってこれからどうなるんだったか…)


To: nero さん

情報提供ありがとうございます。
二つ目のページで勉強させていただきました。
JavaScriptはなかなか奥が深いですねえ。

山羊 さん 2003年 06月 02日 19時 21分 57秒

すみません、先ほど書き込んだ文の一部が文字化けしてしまいましたので、訂正いたします。
4行目 
現在「RUNメソッド・鮖藩僂靴ニ*.vbs等を実行したいのですが

修正
現在「RUNメソッドC鮖藩僂掘滔滾.vbs等を実行したいのですが、

山羊 さん 2003年 06月 02日 19時 17分 54秒

はじめまして。
宜しくお願いいたします。
WSH(VBScript)
現在「RUNメソッドC鮖藩僂靴ニ*.vbs等を実行したいのですが、パスにスペースが
入ってしまう為に実行できません。
どうしたら良いでしょうか。
(C:\Document and SettingsやC:\Programu Files)
イロイロ調べたのですがよい方法がありませんでした。
どなたか、よい方法をご存知の方は宜しくお願いいたします。
(Execも使ったのですが動きませんでした。)

因みにコードは
Option Explicit
'On Error Resume Next

Dim WSHShell,WshSysEnv
Dim FileSystem
Dim Ver
Dim Err_level
Dim Fs
Dim Folder_Name

Set FileSystem = CreateObject("WScript.Shell")
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv=WshShell.Environment("PROCESS")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

Dim ScriptFullName
ScriptFullName = WScript.ScriptFullName
Dim CurFolder
CurFolder = Fs.GetParentFolderName(ScriptFullName)

Folder_Name = Fs.BuildPath(CurFolder,"Setup_RUN_File")

Dim StopProc
StopProc = Fs.BuildPath(Folder_Name,"******.vbs")

Err_level = ""
Err_level = FileSystem.Run ("Wscript "& StopProc &"")

If Err_level = 0 Then

Else
MsgBox "*****”
End If


管理人むたぐち さん 2003年 06月 02日 18時 55分 28秒

まずは前ページ分の発言の返信から。


To: あさ さん&市新野 さん

> バッチスクリプトから出力したメッセージを同DOS窓に表示したいのですが。

やりかたとしては、私もあささんと同じ方法を提案します。

> 後、WScript.StdInとWScript.StdOutを使って出来ないか、

WScript.Echo "hoge"と、WScript.StdOut.WriteLine "hoge"は、cscript.exeで実行
する限り、たぶん同じ働きをすると思います。
(間違ってwscript.exeで実行したときに、メッセージボックスが死ぬほど開くのを
回避できるので後者がお勧めです)
WScript.StdInは、この用途に何か使えますかね?

余談ですが、

'hoge.vbs
WScript.StdOut.WriteLine WScript.StdIn.ReadLine

というスクリプトを、cscript //H:CScriptとした上で、コンソール上で
echo ほげほげ|hoge.vbs
という風に実行するとエラーになるんですね。何故だろう?

echo ほげほげ|cscript hoge.vbs
とやるとちゃんとコンソールに
ほげほげ
と表示されるんですが。

Win2000のcmd.exeの仕様でしょうか。もっともWin9xのcommand.comではそもそも
ファイルの関連付け起動という芸当自体ができないわけですが。

またまた余談ですが、誰かWshShell.Execでtelnetを呼び出すことで、
汎用ソケットオブジェクトみたいに使える関数書いてください(w

それにしても、WshShell.Execで非表示実行できるようになっていたら、本当に
いいんですけどねえ。次期バージョン(あるのか?)では是非。

ノリ さん 2003年 06月 02日 18時 50分 43秒

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

HTAでフレームを使用し、一般サイトを表示させたいと思っているのですが、
フレーム上のリンクをドラッグ&ドロップすると
リンク先のファイルがドロップ先のフレームに表示されてしまいます。

具体的に説明しますと、↓のHTAを実行し…
--------sample.hta--------
<html lang="ja">
<head>
<hta:application navigable="yes">
</head>
<frameset rows="50%,*">
<frame src="http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/" application="no" name="wshl">
<frame src="http://www.yahoo.co.jp/" application="no" name="yahoo">
</frameset>
</html>
--------------------------
…通常では、上段(Windows Scripting Host Laboratoryさんのサイト)左フレームの「トップページ」アンカーをクリックすると、上段右フレームにトップページが表示されますが、
そこで「トップページ」アンカーを誤って少しでもドラッグ&ドロップすると、上段フレーム全体にトップページが表示されてしまいます。
(念のためIE(WinNT+IE6)で同様の動作を行ったら、ドラッグ&ドロップ禁止マーク(?)が表示され、ドラッグ&ドロップが行えないようになっていました。)
この現象(バグ?仕様?)を回避したいのですが、何かご存知の方はいらっしゃいますでしょうか?

一応回避策として、各ページにドラッグ&ドロップを抑制するスクリプトを書けば解決するとも考えたのですが、
一般サイトも表示したいので、そうもいきません。

どうかお知恵をお貸しください。

あさ さん 2003年 06月 02日 16時 30分 55秒

>かやさんへ
とりあえず、むたぐちさんの書き込み待ちですね(笑)
おまちしております(笑

>ひろさんへ
よかったですねぇ^^
動いたスクリプトとバッチを貼り付けてもらえると、同じような事をしたい人が助かるかもです^^

>省吾さんへ
Set objWorkFolder = objFso.GetFolder(strFolderName)
For Each objBuffFile In objWorkFolder.Files
For Each objBuffFolder In objWorkFolder.SubFolders
・・・という感じで、再帰呼び出ししながら、フォルダの取得をしていると想定して(笑)

とりあえず、ファイル検索中に拡張子が「*.lnk」なファイルを見つけたら、そのショートカットファイルに対して、CreateShortcutをして、オブジェクトを作成します。
そうすれば、TargetPathで、ショートカット先の内容を取得できるので、フォルダへのショートカットか、ファイルへのショートカットかどうか判断できます。

で、フォルダへのショートカットなら無視ってとこですかね。

CreateShortcutっていうと、新規のショートカットしか作れないような感じに思いますが、存在するファイルに対してCreateShortcutすると、しっかり情報を取得できるようです。(5.6で確認)
この動きから思うに、CreateShortcutは、「ショートカットの作成」ではなく、「ショートカットオブジェクトの作成」という意味のようです。
まったく紛らわしい・・・

私はこの手法で、ログオンスクリプト用として、実体が無くなった古いショートカットの参照先を新しく書き換えるスクリプトを作りました。

とりあえず、これでいけると思いますので、頑張ってください。^^
#むたぐちさんより書き込んでる私。汗

省吾 さん 2003年 06月 02日 09時 49分 13秒

こんにちは、省吾です。

WSHを使い、フォルダの中のファイルをサブフォルダを
含めて全て取得しています、ただ、ここでその中にフォルダ・ファイル
へのショートカットが含まれていると、これまで取得されてしまうため、
これを何とか排除したいのですが、何か良い方法はありますでしょうか?

宜しくお願いします。

ひろ さん 2003年 05月 30日 22時 16分 33秒

すみません、無関係でした。
日本語を含む名前のディレクトリに対応しきっていなかっただけでした。
うまく動作しました。ありがとうございました。
#板汚しすみませんでした。

ひろ さん (syoppana@sea.plala.or.jp) 2003年 05月 30日 21時 57分 01秒

あさ さん、
ご回答頂きありがとうございました。
また既出だったとのことで、すみませんでした。
言い訳にはなりませんが、vbsはずぶの素人で
今ある事(DOS窓の表示無しでbatファイルを実行)がしたくで
必死でさわっている所です。。。

30日 11時 25分にご投稿頂いた内容で試してみたら、
test1.vbsが置いてあるディレクトリで実行したら
無事に該当バッチプログラムが動いたのですが、
それ以外のディレクトリから起動したら
正常に動いてくれませんでした。
環境変数も引き継がないといけないのかもしれません。

やろうとしているのは、エクスプローラー上での
右クリックからこれを起動してバッチファイルを実行したいのです。

---sample.cmd---
for /f %%a in ('date /t') do @for /f "delims=/ tokens=1,2,3" %%A in ("%%a") do @NOTEPAD "%~dp1\%%A.%%B.%%C - 無題.txt"
---

こんなのを、dos窓の表示無しで
エクスプローラ上の右クリックで起動したいのですが。。。。
自分でもいろいろと調べているのですが、、、
1週間近くこれに時間を費やされているのですが力不足でした。

長文失礼しました。

かや さん 2003年 05月 30日 17時 29分 11秒

あささん調べていただいてありがとうございました。
初心者にも使えるようにとダイヤログを表示させたほうが分かりやすいと思ってやってみましたが、どうにもできそうになかったので当面「パス+ファイル名」をInputBoxに入れてやってもらうようにします。

あさ さん 2003年 05月 30日 12時 32分 10秒

>かやさん&むたぐちさんへ

ども、調べて見ると、かなり難しいようですね。

ここのBBSの過去ログでみると、過去にBrowseForFolderについて議論がされていたようです。
ということで、どうなったのかむたぐちさん教えてください(笑)
私には結論が見つけられませんでした(汗)

#って、最近、苦しくなるとむたぐちさんに投げ出してるなぁ・・・(汗)

あさ さん 2003年 05月 30日 11時 25分 02秒

>AISANCEさんへ
こちらこそよろしくです(^^;;
私も過去C言語やVBでのプログラマーだったこともあり、VBの方が利用頻度高いです。(私もMSX時代がありました。笑)

>takumaさん
JavaScriptの方が難しいと思われ・・・(笑)
まぁ、言語としては、C言語とかJavaの方が完成度高いですし、Java覚えたらVBは簡単に思えると思います。
頑張ってください!^^

>ひろさんへ
ちょっと日にちが経ってしまって、スレッド探すのちょっと苦労しました(笑)
これでどうでしょうか、全てのパラメータを引き継ぐように作ったので、
渡すパラメータの数がわかっていれば、固定でもいいと思います。
その場合、もっと簡素になるでしょう。
--------------------test1.vbs--------------------
Dim objWshShell
Dim objArguments
Dim intCount
Dim strArgList
strArgu = ""
Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objArguments = WScript.Arguments
For intCount = 0 to objArguments.Count - 1
strArgList = strArgList & " " & objArguments(intCount)
Next
objWshShell.Run chr(34) & "d:\Test.bat" & chr(34) & strArgList , 7
Set objWshShell = Nothing
Set objArgs = Nothing
--------------------------------------------------
chr(34)はダブルクォーテーションの文字コードを返します。
私はこっちの記述のほうがスッキリしてて好きです。(笑)
間違えも防げます。
・・・というか、せっかくここのサイト紹介してもらったのなら、とりあえず見ましょう。説明あります(^^;;
ですよね、むたぐちさん(笑)

>HARUKAさん
こんにちは、初めまして^^
え〜と。共有出してるマシンのOSはXP Home?それともProでしょうか?
ネットワークの設定等はドメイン環境?それともワークグループ??
後、共有フォルダに接続しようとしているマシンのOSはなんでしょう?
普通にWSHではなく、手動で「ネットワークドライブの接続」をした場合はちゃんと接続できますでしょうか。
問題の2台のPCの名前(仮でもいいので)を簡単に構成含めて教えてください。
ちょっと環境が見えないので、答えようがないです(汗)
後、差し支えなければ作ったスクリプトのソースを見せてもらえると指摘しやすいかもです。(適度に省略しても構いません。)

接続するドライブがXドライブになっていますが、KとかJとかの他のドライブでも動作は同じでしょうか。
記憶があいまいですが、Windows95,98系は「xyz」の3つは何かで予約されていたような気がします。

>かやさんへ
うーむ。エラーになりますね。
私もはまりました(笑)
とりあえず、環境に依存しますが、こんな手もあります。
標準の環境ではコンポーネントが無くて動かないと思いますが・・念のため。
どっかで見つけたサンプルです。(VBの開発環境があれば入っていると思います)

--------------------Test2.vbs--------------------
Dim cdlg, sarrayfile, sdir, smsg, i
Set cdlg = CreateObject("mscomdlg.commondialog")

cdlg.dialogtitle = "ファイルを選択"
cdlg.initdir = "c:\"
cdlg.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*|"
cdlg.FilterIndex = 2
cdlg.flags = &H200 Or &H1000 Or &H80000 Or &H2000000
cdlg.maxfilesize = 255
cdlg.showopen
If cdlg.filename = "" Then
Else
smsg = cdlg.filename & ":" & cdlg.FileTitle
MsgBox smsg
End if
Set cdlg = Nothing
-------------------------------------------------
とりあえず、BrowseForFolderでやれるのか、私も気になるので、
調査してみます^^

かや さん 2003年 05月 29日 11時 02分 59秒

はじめましてあれこれWebサイトを参考にしていたらここにたどりつき教えてほしいことがありますのでよろしくお願いします。

ダイヤログからファイルを指定してもエラーになってファイル名(パス入り)の取得ができません。どうしてでしょうか?!
----------------------------
Const BIF_EDITBOX = &H10
Const BIF_BROWSEINCLUDEFILES = &H4000

Set Shell = WScript.CreateObject("Shell.Application")
Set oFolder=Shell.BrowseForFolder(0,"ファイルを開く。",BIF_BROWSEINCLUDEFILES+BIF_EDITBOX)

FilePath=oFolder.Items.Item.Path

MsgBox FilePath

Set Shell =Nothing

WScript.Quit
----------------------------




HARUKA さん 2003年 05月 29日 09時 54分 55秒

こんにちは、HARUKAと申します。

ネットワーク上のコンピュータにファイルのコピーを行いたいのですが、
ネットワークドライブを取得してやってみました。

Set FS = CreateObject("Scripting.FileSystemObject")
Set WshNetwork = Wscript.CreateObject("Wscript.Network")

'ネットワークドライブ操作
WshNetwork.MapNetworkDrive "X:","\\マシン名\D"

FS.CopyFile "D:\単価マスタ.mdb","X:\"

'ネットワークドライブの切断
WshNetwork.RemoveNetworkDrive "X:"

どうもここでエラーとなっているようです。
WshNetwork.MapNetworkDrive "X:","\\マシン名\D"

システムに接続されたデバイスが機能していませんというエラーです。
これは何を意味しているのでしょうか?

もうちろん、実際にネットワークからは見られています。

尚、Windows XPでDドライブを共有としてみました、パスワードの設定は
聞かれなかったのでなかったと思います。

宜しくお願いします。


ひろ さん (syoppana@sea.plala.or.jp) 2003年 05月 29日 08時 59分 08秒

http://winfaq.jp/cgi-bin/bbs2k/wforum.cgi?no=256190&reno=256161&oya=255556&mode=msgview
から誘導されて参りました。

DOS窓を出さずにbatファイルを起動したいのですが、
http://winfaq.jp/cgi-bin/bbs2k/wforum.cgi?no=255740&reno=255667&oya=255556&mode=msgview
によれば
> Windows Script Host を利用する方法も考えられます。
> 下記内容のテキストファイルを作成し、拡張子「vbs」で保存します。
> パスの記述は、実際に合わせて書き換えて下さい。
> このファイルをタスクに登録します。
>
> Dim WS
> Set WS = WScript.CreateObject ("WScript.shell")
> WS.Run """c:\Program Files\Batch\Test.bat""", 7 ' 7 -> 0 とすれば非表示
> Set WS = Nothing

だそうですが、引数も引き継いで実行するには
どのようにすれば良いのでしょうか?

即ち aaa.vbs bbb と引数を含めて起動してそれを
test.bat bbb という形でdos窓が出ない形で起動するようにです。
どうかお願いします。

nero さん 2003年 05月 29日 01時 11分 51秒
URL:http://alt.s31.xrea.com/

情報紹介です。Javascriptを使って Photoshop7 を操作することが可能らしいです。

◆ Photoshop 7.0 Scripting plug-in v.1.0.2a - Photoshop for Windows - Downloads
http://www.adobe.com/support/downloads/detail.jsp?ftpID=1536


それから、連想配列やオブジェクトの扱いは下記のページが詳しくまとまっています。

◆ オブジェクト指向プログラム言語としてのJavaScript
http://www.tokumaru.org/JavaScript/index.htm

takuma さん 2003年 05月 28日 22時 36分 35秒

takumaです。

AISANCEさんと あさ さんに親切に
教えてもらい感謝します。m(_ _)m

vbsがWindows上で動きあくまでも、
単独でもスクリプトとして機能するけれど、
web上で何かをするとしても、複雑な言語に
思えました。

javaやHTMLそしてPHPと色々言葉が出てきて
面白かったです。JavaScriptを見たらなんか
解りやすい様な感じがありました。
恐らく、あさ さんが書き出してくれた、
プログラムに当てはまっていたからだと思います。

教えてもらった事を大事にして勉強します。
また、お願いします。感謝。m(_ _)m


AISANCE さん 2003年 05月 28日 13時 01分 43秒
あさ さん 2003年 05月 28日 10時 41分 01秒


AISANCE さん 2003年 05月 28日 13時 01分 43秒

管理人むたぐちさん、どうもありがとうございます。
参考にさせていただきます。
<META>タグを入れれば、とは一応思いついたのですが、
詳しい指定の方法がわからなかったので、、、

takumaさん、よかったです。

あささん、また機会がありましたらどうぞよろしく。
応用範囲はJavaの方が、、、
は、私も同感です。
(ちなみに私の場合、MSXの頃から(年がばれる)
Basicになじんでいますので、
VBSやVBAも含めて使いやすいVBを愛用しています)

あさ さん 2003年 05月 28日 10時 41分 01秒

>takumaさんへ

ほんとだ・・・このサンプル間違ってますね(笑)
多分ソースをHTMLにするときに削ってしまったんでしょうね。

>IEの上でないとvbsが働かない
とっとっと。そういうわけではないですよ。(^^;;;
VBSといっちゃうと、今takumaさんがやってる以上の範囲の言葉になってしまうのですよ。

まぁ、これについては、場合によって、言葉の意味が変わるので難しいですねぇ。

今のみたいに、ブラウザ上で動くスクリプトを指して「VBScript」と呼ぶ場合もあれば、
Windows上で動くスクリプトを指して「WSH(VBScript)」と呼ぶし・・・
#多分実際は、ブラウザはiexplore.exe上で、
#WSHはcscript.exeやwscript.exe上で動いている(解釈されている)と思います。

言語そのものを指して「VB(VisualBasic)」といいますし、
ほかにもアプリケーション上で動作するVBを「VBA(Visual Basic for Applications)」なんて呼ぶものまでありますから、混同する原因はマイクロソフトにあると思われます(笑)
#VBAはExcelとかAccessなどで使えます。

まぁ、パソコンに命令するためのプログラム言語が「VB」というだけで、そのプログラムが「どこで動くか」が変わるということですね。
でも、それによってVBを覚えていれば、いろいろなことが出来るようになるわけです。(まぁあくまでマイクロソフトの手の上で踊ってるだけですけど。笑)
#そういう意味では、JavaScript覚えたほうが応用範囲が広いかも知れません。
#・・・まぁ私は言語仕様しか覚えてませんが(汗)
#私は最近、言語としてはPHPに注目してます。

高岡 さん 2003年 05月 28日 08時 57分 48秒

ほにょ さん、ありがとうございます。

丁度、JScriptでやっておりましたので、うまくいきました。
VBScriptではどうなのか興味のあるところではあります。

連想配列というものを知らなかったので、なかなか新鮮な解決方法でした。
今のスクリプトを作りがてら、また調べてみようと思います。

takuma さん 2003年 05月 27日 21時 29分 17秒

takumaです。
あさ さん 感謝します。m(_ _)m

これ、本当にサンプルです。
http://homepage1.nifty.com/kodayan/vbs/
web限定となっているけどできるのかなぁ?
と思いやってみました。

あさ さんの説明を読むとHTMLを主として
その中でvbsを使っていてIEの上でないと
vbsが働かないというのが、なんとなく
解りました。m(_ _)m



あさ さん 2003年 05月 27日 09時 41分 18秒


takuma さん 2003年 05月 27日 21時 09分 50秒

takumaです。
AISANCEさん、感謝です。m(_ _)m

vbsをhtmにしたら自分のデスクトップで
現れました。



AISANCE さん 2003年 05月 26日 23時 54分 56秒
AISANCE さん 2003年 05月 27日 00時 12分 51秒


ほにょ さん 2003年 05月 27日 19時 45分 16秒

> 高岡さん
> IE.Document.forms[0].bLogon.y.click();
IE.Document.forms[0]["bLogon.y"].click();
ではどうでしょう。
JScriptではオブジェクトを連想配列としても
扱える事を利用してこの問題を回避します。
VBScriptではできませんか?

高岡 さん 2003年 05月 27日 19時 15分 05秒

はじめまして、高岡と申します。
WSHでIEを起動し、ログインページを開いて、IDとパスワードを入れて自動的にログインするためのスクリプトを組んでいるのですが、
<INPUT type="submit" name="bLogon.y" value="ログイン">
のようにドットを含むnameのボタンをクリックしようと、
IE.Document.forms[0].bLogon.y.click();
のように記述しても、「bLogon」が見つからないと怒られてしまいます。
このようなドットを含む名前は、どのように記述すれば良いのでしょう?
ダブルクォーテーション、シングルクォーテーションなどで囲んでみたのですが、うまくいきませんでした。

何らかのメタ文字が必要なのかと思っているのですが、どなたか判るようでしたらお教え頂ければ幸いです。

管理人むたぐち@ちょっとだけ さん 2003年 05月 27日 16時 02分 36秒

To: AISANCE さん
<head></head>内で、
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
のようにエンコーディングを指定しておけば確実です。

IE(に限らないが)がエンコードを間違えるのは、ある程度仕方がないです。
というのも、プレーンテキストには元々、「これはShift_JISだ!」
「これはEUCだ!」という目印はなく、metaタグによる指定がない場合は、
文字の出現頻度等で判別しているからです。
よって、本文の内容しだいで、誤判断も起こり得ます。というか、頻繁に発生します。

ので、html(htaも含めて)で日本語を用いる場合は、必ずエンコーディングの
指定をしてやるべきです。

AISANCE さん 2003年 05月 27日 14時 56分 17秒

どうも、一人相撲みたいですが、
先ほど書きこんだ問題は、
いろいろいじっていたら解決してしまいました。
.hta アプリケーションの文字化けは、
script のせいでは、と最初に思ってしまったのが、
間違いの始まりでした。

これはIEの問題でした。

IEのエンコード設定で、自動選択を解除しておくと、
HTAアプリケーションの文字化けは起こりませんでした。
しかし何故なのかは謎です。
script の部分も含めて
日本語の文字が一定量を超えて多くなると、日本語で表示できなくなるって、
いったいどういうことなのでしょう???

VBscript を含まないHTMLではそんなこと絶対ないと思うんですが。

WSHには、直接関係ないかもしれませんが、
参考にしてください。

AISANCE さん 2003年 05月 27日 13時 32分 49秒

あささん、ていねいな説明をありがとうございます。
私の書きこみでは舌足らずで、わかりにくいと思います。

遅ればせながら、自己紹介をします。
AISANCE(えざんす)と言います。
はじめまして

VBやVBSで簡単なアプリを作っています。
一応、雑誌に投稿したこともあります。

で、どうしてここへ迷い込んだかと言いますと、
以前は問題のなかった.htaアプリケーションを
久しぶりに動かしたら、文字化けしたので
どこかに情報がないかと思いまして。

少し長くなりますが、

--------StopWatch.hta-------

<HTML>
<HEAD>
<TITLE>ストップウォッチ</TITLE>
<HTA:APPLICATION
applicationName="ストップウォッチ"
border="thick"
borderStyle="sunken"
caption="Yes"
contextMenu="No"
icon=""
innerborder="Yes"
maximizeButton="No"
minimizeButton="Yes"
navigable="No"
scroll="No"
scrollFlat="No"
selection="No"
showInTaskBar="Yes"
singleInstance="No"
sysMenu="Yes"
version="1.0
windowState="normal"/>

<SCRIPT LANGUAGE="VBScript">
Sub dispdateA()
document.MyForm.DayTextA.value=Now
End Sub

Sub dispdateZ()
document.MyForm.DayTextZ.value=Now
End Sub
</SCRIPT>
</HEAD>

<BODY BGCOLOR=#FFF0A0><CENTER>
<H1>ストップウォッチへようこそ!</H1><HR>
<FORM NAME="MyForm">
<BR><BR>
<INPUT TYPE="button" NAME="ButtonA" VALUE="開始">
<INPUT TYPE="text" SIZE=20 NAME="DayTextA"><BR><BR>
<INPUT TYPE="button" NAME="ButtonZ" VALUE="終了">
<INPUT TYPE="text" SIZE=20 NAME="DayTextZ"><BR><BR>
経過時間は : 
<INPUT TYPE="text" SIZE=2 NAME="HText">時間
<INPUT TYPE="text" SIZE=2 NAME="MText">分
<INPUT TYPE="text" SIZE=2 NAME="SText">秒です。<BR><BR>
<INPUT type='Button' NAME="Button1" VALUE='クリア'>
<INPUT type='Button' NAME="Button2" VALUE='閉じる'><BR><BR>
</FORM>
<SCRIPT LANGUAGE="VBScript">
Dim F
Set F=document.MyForm

Sub ButtonA_Onclick
dispdateA()
End Sub

Sub ButtonZ_Onclick
dim t
dispdateZ()
t=CDate(F.DayTextA.value)-CDate(F.DayTextZ.value)
F.HText.value=Hour(t)
F.MText.value=Minute(t)
F.SText.value=Second(t)
End Sub

Sub Button1_Onclick
F.DayTextA.value=""
F.DayTextZ.value=""
F.HText.value=""
F.MText.value=""
F.SText.value=""
End Sub

Sub Button2_Onclick
window.close()
End Sub
</SCRIPT>
</CENTER></BODY>
</HTML>

これを実行すると、文字化けします。(以前は化けませんでした)
ところが、46行目の"秒です。"を"秒"だけにすると文字化けしません。

他の例では、scriptの中でメッセージを直接表示させようとすると
文字化けするのが、メッセージを変数に格納しておいて
それを呼び出させると、文字化けしない、
という動作も確認しました。

これは MSHTA.exe(ver.6.00.2800.1106) が怪しいと思うのですが、
どなたかご存知でしたら教えてください。

あさ さん 2003年 05月 27日 09時 41分 18秒

え〜しばらく腹痛でお休みしてました(汗)

takumaさん、AISANCEさんはじめまして。
あさといいます。

結論から言うと正しくはこうですね。
----------Test.html-----------
<html>
<HEAD>
<script language="VBScript"><!--
Sub BGC(i)
For m = 0 To 255
For n = 0 To i
Document.bgColor = Hex(m+m*256+m*256*256)
Next
Next
End Sub
--></script>
</HEAD>
<BODY>
<DIV class="main">このページが開かれると,背景色が変化します。変化が止まるまでそのままお待ち下さい
<script language="VBScript"><!--
BGC(6)
--></script>
</DIV>
</body>
</html>
------------------------------

ものすごくタグが無かったので、いろいろと追加しましたよ(笑)

まず、HTMLがぜんぜんなってません。(ホントにサンプル?笑)
以下のタグは絶対に必要です。
VBScriptよりもHTMLを先に勉強するべきですね(笑)
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
AISANCEさんがおっしゃる通り、<!--と-->は、スクリプトを処理できないブラウザや、スクリプトを無効にしている場合に必要になります。
上記のブラウザは、<script language="VBScript">を無効なタグとして解釈し、(無効なタグは無視される)それ以降のプログラム部分をHTMLだと思って解釈しようとします。
これがないと、スクリプトを実行できないブラウザ等で見た場合に、ソースコードがそのまま表示されるような動作になってしまいます。
そこで、実行できないブラウザに、このソースコードを表示させないために、コメント化しているわけですね。^^;;

あ。で、これは、WSHじゃないですね(笑)
ブラウザ上で動作するVBScriptです。
まぁおんなじVisualBasicでプログラムが書けるので混同しがちですが、出来ることや目的が違うので、違いをしっかり理解しておいたほうがいいかも知れません。

Return