AISANCE さん 2003年 05月 27日 00時 12分 51秒

takuma さんへ これでおしまい

というわけで、私もうっかりしていましたが、
<!-- と --> を使うのは、
VBScript をサポートしていないブラウザで、
おかしな表示をさせないおまじない、というのが正しいのでして
これをとればいい、というのは間違いでした。

(ごめんなさい)


AISANCE さん 2003年 05月 26日 23時 54分 56秒

takumaさんへ つづき

一回りして戻ってきました。
で、もうひとつ気づいたんですが、拡張子を変えるって
何を何に変えたのでしょうか。

このサンプルは、
<HTML>で始まって、</HTML>で終わっているはずで、
その場合、拡張子は .htm です。
「ページが開かれると、、、」というのは、ブラウザで開かれると、
ということで、これはWSHではないわけです。
もし拡張子を .vbs にしているのでしたら、
はずれです。

ステートメントがない、などと言われるということは、
もしかして、、、。




AISANCE さん 2003年 05月 26日 23時 24分 30秒

takumaさんへ
たまたま訪れたこのページで拝見しまして、、、
スクリプトの
<!-- と --> とを
削除してください。
これは、ここからここまではコメントですよ、というタグですから、
<script> から </script>の中身がただのコメントになっています。
スクリプトとしては無視されてしまうんです。
よって動作しません。




まつたけごはん さん 2003年 05月 26日 22時 27分 26秒

バッチ非同期の件、解決いたしました。
リファレンスを見落としていてバッチリ書いてありましたね。
失礼致しました

takuma さん 2003年 05月 26日 22時 01分 26秒

はじめまして、サンプル集をダウンロードして
拡張子の変換も終えてダブルクリックしても、
ステートメントがありませんとなります。

os:Windows Me

scd56jp
以下 サンプルですm(_ _)m
<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>

まつたけごはん さん 2003年 05月 25日 21時 22分 20秒

vbsの中で連続してバッチファイルを実行すると
非同期的に次へ進んでしまうのですが
一つ目のバッチが終了するまで待つ事は可能でしょうか?
サンプルとしてspoolerサービスの再起動を連続して行う物を作りましたが
これだと重複してサービスを止めに行ってエラーになってしまいます。

現在のところバッチとバッチの間にメッセージボックスを表示して
一つ目が終わったらOKボタンを押して次へ進む位しか思いつきません・・・



-------------test.vbs-----------
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")

WSHShell.Run "c:\test.bat"
WSHShell.Run "c:\test2.bat"
---------------------------------

----------test.bat---------------
net stop spooler
net start spooler
---------------------------------

--------test2.bat-----------------
net stop spooler
net start spooler
---------------------------------

あさ さん 2003年 05月 24日 09時 44分 10秒

>いちにいのさんへ

あれじゃ、ダメでした?(笑)
ここのBBSは過去ログに残るので、ここでフィードバックしてもらえるとうれしいかも。
問題点が残っていれば教えてください。(^^;;
私もせっかく頑張ったので(笑)

>みきさんへ
う〜ん(笑)
「スクリプチングホスとのエラー」ですか(汗)
もうちょっと正確にエラーの内容や、そのエラーの出るタイミング、最近やった操作、設定変更。OS(WindowsMeとかXP Homeとか)の種類。気になるその他の動作等を書いてもらえないと、何も答えられないです。

・・・というか、「スクリプティング ホスト エラー」で検索してここのページにたどり着いたのだと思いますが、おそらくその現象と、WSH(Windows Scripting Host)とは関係ありません(笑)
適切なサイトの掲示板に書き込みすることをお勧めします(^^;;
その方が、すばやい回答を得られることでしょう。
(そこでも上記の内容は最低でも記載しないと、誰も答えられませんよ。みきさんの画面にどんなエラーが出ているのかは、基本的にみきさんにしかわかりません。^^;;;)

まぁ、まさかとは思いますが、ウィルスチェックソフト入れてますよね?
ウィルスバスターとかノートンアンチウィルスとか・・・
ある意味ウィルスに感染しているならWSHが関係なくも無いかもしれません(笑)

とりあえず、他人任せであれですが、その質問はこちらへ・・・
■J'Factory
http://www.infomadonna.ne.jp/~j1012/sitetop1/
ここの「質問BBS」に書き込みお願いします。

最近顔を出していませんでしたが、過去、パソコントラブルで私もお世話になっていました。(J'Factoryさん親切に対応してくれます!)
みきさんの名前で書き込みしてもらえれば、私も顔だしますね。

あ、あと最悪のケースを想定して、ウィルスチェックもしましょうか。
以下のアドレスでオンラインでウィルスチェックできます。
■ウイルスバスターオンラインスキャン
http://www.trendmicro.co.jp/hcall/index.asp

・・・という方向でいいですかね?むたぐちさん(汗)

みき さん 2003年 05月 24日 03時 36分 38秒

すみません。パソコン初心者です。最近パソコンを開くとスクリプチングホスとのエラーと出るのですがこれは一体どういうことなんでしょうか?すみませんが教えてください。おねがいします。

市新野 さん 2003年 05月 23日 20時 03分 07秒

市新野(いちにいの)です。
やはり、難しいっすか。
私はすでに、あきらめの境地です。
みなさん、ありがとうございます。

あさ さん 2003年 05月 23日 16時 21分 30秒

出来ました。
とりあえず、姑息な手で(笑)

------------Test1.vbs------------
Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objExec = objWshShell.Exec("d:\test2.bat")
Do While objExec.Status = 0
WScript.Sleep 100
Loop
If Not objExec.StdOut.AtEndOfStream Then
WScript.Echo objExec.StdOut.ReadAll()
End if
---------------------------------

------------Test2.bat------------
echo テストです。
---------------------------------

バッチの中でpause使うとStdInで何かしないといけないので、
とりあえず、echoだけのバッチを呼び出しました。

Exec使う時点で、WSH5.6必須になってしまいますが、標準出力に出ている文字を全て取得し、スクリプトで再度吐き出すような仕組みにしました。

う〜ん。
こんなんでいいですかね?(笑)
私はRunメソッドではうまく出来ませんでした。
後、WScript.StdInとWScript.StdOutを使って出来ないか、
考えて見たのですが、挫折しました(笑)
・・・もうちょっとやって見ます。(初めて使うので(汗))

参考になれば幸いです。

あさ さん 2003年 05月 23日 15時 41分 49秒

はう。
バッチファイル。普通にフルパスで呼び出したら動きました。

Set objWshShell = WScript.CreateObject("WScript.Shell")
objWshShell.Run("d:\test2.bat")

とりあえず、市新野さんと同じ現象にまではたどり着きました(汗)
確かに別画面が立ち上がってしまいますね・・・

あさ さん 2003年 05月 23日 15時 34分 35秒

>AAさんへ
う〜む。それは出来ないと思います。
MsgBoxはメッセージを表示するだけの機能なので・・・

VBSだけでは、グラフィカルな処理は出来ないと思いますよ。
やるのであれば、COMコンポーネント等を使うしかないですね。
何が適切かは、ごめんなさい。私もわかりません。


>市新野さんへ(読み方が分からないぃ。笑)

「えぇ?うそん?できない?」と思いやって見ました。
出来ませんねぇ(汗)

------------Test1.vbs------------
Set objWshShell = WScript.CreateObject("WScript.Shell")
'objWshShell.Run("%comspec% /c test2.bat")
'objWshShell.Run("%comspec% test2.bat")
objWshShell.Run("%comspec% call test2.bat")
---------------------------------

------------Test2.bat------------
echo テストです。
pause
---------------------------------
というのでやってみました。

・・・というか、私の場合、バッチファイルも動かない(汗)
「テストです。」が表示されません。
どうやってバッチファイルを動かしています?
逆に教えて欲しい(^^;;;


後、思いつく方法としたら、バッチファイルをVBSに置き換えるとか・・・
って、それじゃ解決になってませんね(汗)
まぁ、何をやっているのかで、簡単に置き換えるというわけにもいかないですよね・・・

私も気になるので、引き続き調べて見ます。

市新野 さん 2003年 05月 23日 13時 55分 36秒

はじめまして。市新野です。
VBスクリプトからバッチスクリプトを呼び出す際、VBスクリプトと同じDOS窓でバッチスクリプトを実行させるには、どうしたらよいですか。
バッチスクリプトから出力したメッセージを同DOS窓に表示したいのですが。
(普通にやると一瞬開いてすぐ閉じちゃいます。バッチを単独で実行したときみたいに)

AA さん 2003年 05月 23日 09時 58分 31秒

MsgBox "AAABBBCCC"のプログラムなのですが、
表示するAAA,BBB,CCCをそれぞれ、フォント、大きさ、色を
変更したいのですが、方法がわかりません。

 誰か教えてください。

あさ さん 2003年 05月 22日 14時 31分 53秒

むたぐちさんへ
■Win32_PingStatusなPing
デバッグありがとうございます(笑)
これで、誰かに使ってもらえれば、作ったかいがあります(^^;;

■GetObjectとCreateObjectの違い。
なるほど。VBScriptしか見ていなかったので気が付きませんでしたが、確かに他の言語の事を考えたら、むたぐちさんの言う通りですね。
勉強になります(^^;;
#イベントが取得できるって大きいですよね(^^;;
#出来る事が広がりますし。

■WMI
WMI Object Browser早速DLしました。今から使って見ます。
でも、英語読めないからドキュメント関係つらいっす(><
私にとって今のところ、こないだ紹介してもらった「WMI Fun」が一番の教科書ですね(汗)

■ケイさんの質問
うーん。さすがに私もこれ以上はわかりません(汗)
WMIもっと勉強しないと、いけないなぁ・・・便利そうだし。
私、トンチンカンな回答をしてますね。きっと(汗)反省します。
ケイさんの書き込みが無いので、この件はもうあきらめちゃったんですかね?(汗)

■さざなみさんの質問
私もやったことないですけど、Telnet使うとか・・・ダメ?(汗)

http://ash.jp/net/telnet_pop3.htm
こーんな感じで、Exec使って標準出力でぇ・・・(以下略)
あぁ、ホントバカの一つ覚えだなぁ。(笑)

でも、さざなみさんがやってるのはASPなのかな?(汗)

さざなみ さん 2003年 05月 22日 10時 09分 28秒

さざなみです。

> むたぐちさん
> 私もちょっと探してみたんですが、なんかなさそうですね。
> サンプルがないというわけではなく、そもそもCDOにメール受信(POPサーバーへのアクセス)機能
> がないようです。

ご回答ありがとうございます。
そうですか。むたぐちさんにそういっていただけるのでしたら、
検索をあきらめられます。

> 参考になるかわかりませんが、こういう記事がありました。
> http://www.users.gr.jp/ml/archive/aspx/396.asp

なるほど。
ソケットを利用する方法ですか。
情報、ありがとうございます。

管理人むたぐち さん 2003年 05月 21日 17時 41分 31秒

To: CKS さん
●リモートWSHを使う方法

まずはこちらをご覧ください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wstsksetupofremotewsh.asp

ここの「メモ」に「管理者がリモート WSH を有効にするには、Windows 2000 リソース キットを
入手するか、http://msdn.microsoft.com/scripting にアクセスして WSH の設定値が記述されて
いる windowsscript.adm ファイルを入手する必要があります。」とありますが、実は
この世のどこにも(いや、少なくともWeb上には)windowsscript.admというファイルは
存在しないのです。

ので、対応するレジストリキーを直接編集してやる必要があります。
リモートコンピュータのHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settingsキーの
Remoteという文字列値を0→1にすると、リモートWSHの実行が許可されるようです。

ぜひ結果を教えてくださいね。
(いまだに、リモートWSHが動作しているという報告を聞いたことのない私)

管理人むたぐち さん 2003年 05月 21日 17時 24分 52秒

To: ひみつ さん
> Win2000から仕様が変わって、前面に持ってくる代わりに
> タスクバーで点滅するようになったようです。
> (IEの仕様ではなくOSの仕様としてです。)

TweakUIの「一般」タブで、「アプリケーションにフォーカスを横取りさせない」のチェックを
はずすと、点滅しなくなる…はずですが…。
(対応するレジストリキーは調べてないです)


To: さざなみ さん
> CDO.Messageを使用したメール送信
> サンプルは、たくさん見つかりますが
> 受信のサンプルはありますでしょうか。

私もちょっと探してみたんですが、なんかなさそうですね。
サンプルがないというわけではなく、そもそもCDOにメール受信(POPサーバーへのアクセス)機能
がないようです。

参考になるかわかりませんが、こういう記事がありました。
http://www.users.gr.jp/ml/archive/aspx/396.asp


To: あさ さん
Win32_PingStatusを使ったスクリプト、WinXP Homeでの動作を確認しました。

> #Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}")
> #と
> #Set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
> #Set objService = objLocator.ConnectServer
> #の違いがわからないです。(汗)

違いはないんじゃないでしょうか?
ないというのは語弊がありますけど、複数の利用方法があるということなのでは。

GetObject関数を使う場合、権限、名前空間、IPアドレス、ユーザー名、パスワード
などがまとめて指定できます。
CreateObjectする場合は、security_プロパティで権限などを、ConnectServerメソッドの引数で
名前空間、IPアドレス、ユーザー名、パスワードなどを指定します。

また、GetObject関数に相当するものがないスクリプトエンジンもありますからね。
(PerlScriptとか)
そういう場合は、CreateObjectを使うしかないでしょう。
(さすがにCreateObjectができないスクリプトエンジンはないはずだけど、
WScriptオブジェクトはちゃんとCreateObjectメソッドを用意してくれている。
もっともこいつは、VBS等のCreateObject関数等にはない機能を持っている、すなわちイベントの
バインドを可能にしてくれるという優れものではありますが)


To: ケイ さん & あさ さん
WMIだとWin32_LogicalDiskクラスが怪しいと思ったんですが、デバイスパスに相当するプロパティは
ないようです。

余談ですが、WMIのクラスを調べるときは、WMI Object Browserが便利です。
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=6430F853-1120-48DB-8CC5-F2ABDC3ED314

ちなみにWMIのドキュメントはこちら。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_start_page.asp
昔はWMIのドキュメントをchm形式にした奴がダウンロードできたはずなんですが、
今はもうなくなってるみたいですね。

あさ さん 2003年 05月 20日 15時 09分 37秒

>EEEさんへ
ズバリ答えになっちゃうのですが、このままでいけると思います。
ただし、指定したフォルダのみのファイル抽出で、そのサブフォルダまでは参照しません。
サブフォルダの中の中の中の・・・と検索する場合は、再帰処理を作り、全てを検索する必要があります。
その場合は「SubFolders」を活用しましょう。

strFolderName = "c:\"
Set objFso = WScript.CreateObject("Scripting.FileSystemObject")
Set objTargetFolder = objFso.GetFolder(strFolderName)
'ファイルがあるだけ実行する。
For Each objWKFile In objTargetFolder.Files
msgbox objWKFile.Path & ":" & objWKFile.Name
Next

後、マイクロソフトからScript56.CHMという日本語のヘルプファイルが提供されています。(一部英語ですが、十分使えます)
これを読むだけでも、ぜんぜん違いますので、参考にしてはいかがでしょう。
サンプルなどもたくさん載ってます。(^^

■Microsoft Windows Script Version
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=E74494D3-C4E1-4E18-9C6C-0EA28C9A5D9D

それでは、頑張ってください(^^

EEE さん 2003年 05月 20日 12時 58分 28秒

申し訳ないです。説明不足でした。
特定のフォルダ(フォルダ名はわかっており、プログラム上指定)の中に
ファイル(不特定多数のファイル、ファイル名はわからない)が存在しているかどうかをプログラム上からファイルの有無を判定したいのです。
 もし、そのフォルダー内に何かのファイルが存在していれば、ファイルの数とファイル名を取得しようと思います。

 説明不足ですみません。アドバイスください。

あさ さん 2003年 05月 20日 12時 19分 10秒

あ。
ファイルの存在有無でなくてフォルダの存在有無でした(汗)

ファイルの場合は、FolderExistsをFileExistsに変えればOKかな?

あさ さん 2003年 05月 20日 12時 17分 00秒

>ケイさん
う〜ん。こまりましたねぇ・・・
トラブルシューティングの為なら、素直にdmdiag.exeを使ったほうが早いと思いますよ。怪しいツールというわけではないですし。
わざわざプログラミングする必要があるとは思えないです(汗)
大事なのは問題を解決する事だと思いますよ^^;;

>CKSさん
ごめんなさい。私はよくわからないので、お答えできません(汗)

>EEEさん
何がやりたいのか、ちょっと文面からピンとこないのですが、
フォルダを選ぶなら
Set objShellApp = CreateObject("Shell.Application")
Set objbfFolder = objShellApp.BrowseForFolder(0, "フォルダを選んで下さい", 0, "c:\")
If Not objbfFolder Is Nothing Then
MsgBox objbfFolder.Items.Item.Path
End If
こんな感じで。

ファイルの存在有無を確認するなら、
strFolderName = "c:\test"
Set objFso = WScript.CreateObject("Scripting.FileSystemObject")
If objFso.FolderExists(strFolderName) = True Then
'ファイルが存在するなら
Else
'ファイルが存在しないなら
End If
という感じでしょうか。

EEE さん 2003年 05月 20日 11時 21分 34秒

化けたので、もう一回、入れます。

WSH初心者で、苦戦してます。
あるフォルダを指定してそこの中の存在するファイルの有無を確認する
プログラムを作ろうとしているのですが、うまくできません。
 その後、ファイル名も取りたいのですが

 誰かご教授ください。

EEE さん 2003年 05月 20日 11時 19分 50秒

WSH初心者で、苦戦してます。
ある湊拈泙鮖慊蠅靴討修海涼罎梁減澆垢詭Р戮陵k気魍稜Г垢襯廛蹈哀薀爐
作ろうとしているのですが、うまくできません。
 その後、箕荷名も取りたいのですが

 誰かご教授ください。

CKS さん 2003年 05月 20日 08時 51分 58秒

自己レスです。

DCOM設定のうち、WSHのプロパティで
"このアプリケーションを起動できるユーザーを編集できます"
の部分を、
"独自の起動アクセス許可を使う"
にかえたところ、どうやらエラーは出なくなりましたが、
肝心の動作をしてくれませんでした。
前レスの「test.wsf」のなかで、

WSHShell.Run "D:\AppExec.bat",1,True

というような、batはメモ帳を開くだけなのですが・・・。
なにもせずに処理が終了してしまいます。

WSHって難しい・・・。

CKS さん 2003年 05月 19日 15時 06分 48秒

はじめまして。
WSHを初めて使うものですが、大苦戦中です。
(サーバー、クライアントともにWin2000、IE6という環境です)

@行 SVNAME = args(0)
A行 set oController = CreateObject("WSHController")
B行 set oProcess = oController.CreateScript("D:\test.wsf", SVNAME)

このようなプログラムで、最初、A行目で、
ActiveXコンポーネントはオブジェクトを作成できません。
というエラーがでていました。
これは、DCOM設定をするというこちらの掲示板での情報で解決できたようなのですが、
その後、B行目で、

VBScript実行時エラー:書き込みできません。

と出てしまいます。
記述は間違えていないと思うのですが・・・。
他にも設定などがあるのでしょうか?


nero さん 2003年 05月 17日 17時 39分 44秒

できました! 的確なご教示ありがとうございました。
おかげさまで HTA のウィンドウ内に進捗を表示できるようになっただけでなく、
動作速度も改善されました。

# 別ウィンドウを書き換えるよりは高速なのかな?


ケイ さん 2003年 05月 16日 16時 25分 50秒

>あささん>度々ありがとうございます。ドライブ文字とドライブの種類しかわからないのですよね、、、残念。

こちらの掲示板はWSHのものであるということでWSHに直接結びつかないことは書かなかったのですがこういうのはWSHでは難しいかも、という情報は残したほうがよいだろうと思い書いておきます。

環境:Win2000SP3、IE5.5
目的:以下のエラーポップアップで表示された。(たまに出ている模様。どうもMOがらみらしい、、)
------------------------------------------
Windows - 遅延書き込みデータの紛失 : ファイル \Device\Harddisk1\DP(1)0-0+2\ のためのデータを一部保存できませんでした。データを損失しました。 このエラーは、コンピュータのハードウェアまたはネットワーク接続の障害によって発生した可能性があります。このファイルをどこか別の所に保存してください。
------------------------------------------

”\Device\Harddisk1\DP(1)0-0+2\”が何か知りたい。

1)dmdiag.exeで自分がほしいと思っている情報
手元のマシン(上のエラーを吐いていない)では似たようなデバイス文字はMOドライブしかなかった。ログからしか判断できないのですが、おそらくQueryDosDeivice()(Win32API)で出力している。

2)QueryDosDevice()で表示されるもの。
MSDNによると”特定の MS-DOS デバイス名に対する現在のマッピングを取得します。”とのこと。

結局MS-DOSデバイス名とドライブ文字の対応はレジストリからは見つけられなかった。

'困難な気がしてきました。dmdiag.exeの使用許可をもらうか書籍のリソースキットを探した方が早いかも。

あさ さん 2003年 05月 16日 14時 42分 46秒

すんません。
途中で書き込みボタン押してしまいました。^^;;;

DriveTypeで、
0:"不明"
1:"リムーバブル ディスク"
2:"ハード ディスク"
3:"ネットワーク ドライブ"
4:"CD-ROM"
5:"RAM ディスク"
までは判断できるみたいです。

うう。これ以上書き込むと掲示板あらしになってしまう(汗)
ごめんなさい。むたぐちさん(笑)

あさ さん 2003年 05月 16日 14時 30分 45秒

と・・・いうか、
素直にこれでいいのかな・・・

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
For Each objDrive in colDrives
Wscript.Echo "Available space: " & objDrive.AvailableSpace
Wscript.Echo "Drive letter: " & objDrive.DriveLetter
Wscript.Echo "Drive type: " & objDrive.DriveType
Wscript.Echo "File system: " & objDrive.FileSystem
Wscript.Echo "Free space: " & objDrive.FreeSpace
Wscript.Echo "Is ready: " & objDrive.IsReady
Wscript.Echo "Path: " & objDrive.Path
Wscript.Echo "Root folder: " & objDrive.RootFolder
Wscript.Echo "Serial number: " & objDrive.SerialNumber
Wscript.Echo "Share name: " & objDrive.ShareName
Wscript.Echo "Total size: " & objDrive.TotalSize
Wscript.Echo "Volume name: " & objDrive.VolumeName
Next

ダメ?(笑)

あさ さん 2003年 05月 16日 14時 14分 21秒

なるほど^^;;
dmdiag.exeがダメだとすると、困りましたな(笑)

目的のWindowsの種類はなんでしょう?2000?XP?
ひょっとしたら、Windows標準のCOMコンポーネントで、似たような情報を取得できるものがあるかもしれません。

WMIですが、Win32_DiskDriveToDiskPartitionあたりから引っ張り出せないですかね・・・理解していないので的外れかもしれません(汗)
間違ってたらごめんなさい。

ケイ さん 2003年 05月 16日 13時 44分 00秒

>あささん
ありがとうございました。

dmdiag.exeでどういう動きをするか分からないからどうしても必要と判断されない限り使用させてもらえない状況にいるので、Windowsのもともとの機能として搭載されているならそれを利用しようとスクリプトを思いついたのです。

開発環境も手元にないのでAPIを呼び出すプログラムも組めないし、レジストリを探しても見つからないし。

WMIについてはただいま検索中です。

あさ さん 2003年 05月 16日 13時 22分 24秒

あ。後、既にあるCOMコンポーネントを探すって手もありますね(汗)

DynaCallとか使えないですかね?
使ったことないので、わかりませんが、ここのサイトのリンク集に「Borns BookP@age」というサイトが紹介されています。

■Borns BookP@age
http://ourworld.compuserve.com/homepages/Guenter_Born/index0.htm
VBSにはないDeclareステートメントと同等の働きをする、DynaCall(DLLの呼び出し;Win32APIが利用可)・・・省略・・・だそうです。(笑)

役に立つかわかりませんが、とりあえず。^^;;

あさ さん 2003年 05月 16日 13時 12分 14秒

ども。こんにちは^^
ケイさんの言うとおり、WSHからは直接API呼び出せないと思いますので、COMコンポーネントを自作するか、既存のプログラムの出力を読み出すかしかないのかなぁ。っと思います。

要件としては、多分、ドライブレターをそれぞれ取得しないといけないんですよね?
「D:」は「\Device\HarddiskVolume2」で、「F:」は「\Device\CdRom0」です、見たいに。

私なら(あきらめて、汗)ここのBBSの下の方で私が出したPing送信プログラムのように、
Execメソッドでdmdiag.exeを実行して、標準出力(StdOut)から
InStrとか正規表現(RegExpオブジェクト)にて取得したい場所を特定し、
その文字列から判断するような形にしますねぇ。(5.6必須ですが。)

dmdiag.exeを実行してみた感じでは、出力内容が多いので、正規表現の方が簡単だと思います。(同じような行が複数行でますし。)


WMIだとすんなり解決できるのかは・・・
すみません。私にはわかりません(汗)勉強不足です^^;;
フォローお願いします(笑)

ケイ さん 2003年 05月 16日 11時 00分 08秒

現在デバイスパス名の取得をスクリプトにて行うためにいろいろ調べたのですが分かりませんでした。ご存知の方教えてください。

ドライブレター(ドライブ文字)とデバイスパスとの関係を取得したいのです。
Win32SDK(WinNT系)ではQueryDosDevice()という関数で取得できるらしいのですがAPIであるためスクリプトからは使用できないと考えています。
同様の情報は取得可能でしょうか。

取得したいものとしてはWin2000リソースキットツールのdmdiag.exeの以下の部位です。
---------- Drive letter to device name, QueryDosDevice() ----------

D: \Device\HarddiskVolume2
E: \Device\HarddiskVolume3
F: \Device\CdRom0
G: \Device\HarddiskVolume4
A: \Device\Floppy0
C: \Device\HarddiskVolume1


よろしくお願いします。

あさ さん 2003年 05月 15日 17時 04分 47秒

うぅ。原因わかりました。
Win32_PingStatusって、WindowsXPでないとダメなのね・・・・
Windows2000の私には作っても意味のないものでした。(泣)

とりあえず、簡単なものをせっかく作ったので、貼り付けておきます。
動作確認してませんが(汗)

Dim objLocator
Dim objService
Dim objPingSet
Dim objPing
Set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer
Set objPingSet = objService.ExecQuery("Select * From Win32_PingStatus Where Address = '172.16.1.1'")
For Each objPing In objPingSet
If objPing.StatusCode = 0 Then
MsgBox "Success"
Else
'11010とかほんとは判断必要。以下参照。
'http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_pingstatus.asp
MsgBox "Request Timed OutとかError"
End if
Next

#しかし、WMIまだまだ勉強しないとダメですね。
#Win32_PingStatusキーワードに探してたら英語のがあったんですが、
#Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}")
#と
#Set objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
#Set objService = objLocator.ConnectServer
#の違いがわからないです。(汗)
#
#さて、次はtracert?(汗)

あさ さん 2003年 05月 15日 16時 37分 08秒

むたぐちさん、WMIのページを紹介して頂き、ありがとうございます。
ものすごく、参考になりました。(^^;;;

正規表現まで勉強してPing作ったのに、なんだか簡単にWMIでやられてしまってるので、かなりへこみましたよ(笑)
まぁ、勉強ついでだったので、いいのですが(汗)

今まで、WMIはちょっと難しそうで、避けて通っていたのですが、紹介してもらったサイトは、分かりやすく、ただいま読み読み中です。

で、早速、VBSでWMI使ってPingを飛ばそうと、VBSに置き換えをしているのですが、動かなくて困ってます(笑)

#ExecQueryがうまくいっていないっぽい・・・

また、ちょくちょく書き込みしますね。
これからもよろしくお願いします^^;;

さざなみ さん 2003年 05月 15日 10時 13分 50秒

さざなみです。

CDO.Messageを使用したメール送信
サンプルは、たくさん見つかりますが
受信のサンプルはありますでしょうか。
探したのですが、見つかりませんでした。

MAPI、BASP21以外の方法として注目いたして
おります。

ひみつ さん 2003年 05月 15日 00時 07分 32秒

はじめまして。ひみつと申します。
ちょっと覗いたついでに。

>To: マック さん
>> 現象は、前にでない+最小化されて点滅状態になります。
>> IEの設定でしょうか?
>
>IEというよりOSの設定のような気がします。
>TweakUI等で、アクティブウィンドウの挙動を変更できるので、
>試してみてはいかがでしょうか。
>(そういえば、VBSで出したMsgBoxもよくそういう状態になったりしますね
>私は、面倒なのでそういうもんだと思って特に対策してません)

Win2000から仕様が変わって、前面に持ってくる代わりに
タスクバーで点滅するようになったようです。
(IEの仕様ではなくOSの仕様としてです。)
VBやCなどでやるならAPIを使ったサンプルが最近は出回っているようです。
何年か前に調べたときは日本語のサイトには全然情報がなく苦労しました。
英語サイトにはいくつかあったんですがね。
やっぱりみんな困るようで、いろいろなところで解説されています。
MSDNにもドキュメントがあったと思いますよ。

それと今までは気にしてなかったんですけど、コマンドライン引数に
ダブルクォーテーションが入れられないんですね。
今回試してみて初めて気づきました。必要になることはそんなにないと思うので
実害は少ないと思いますが。

管理人むたぐち さん 2003年 05月 14日 22時 13分 41秒

ここからこのページの回答に入ります。


To: あさ さん
●Ping
コマンドラインツール&WshExecは色々応用が効いていいですね。
ぜひ、tracertとかも作ってください(w

Pingなら、WMIを使った方法もあるみたいです。

- Pingの結果を取得する -
http://homepage2.nifty.com/tcubic/wmifun/wmisample/win32_pingstatus.html

ここ、他にもWMIのサンプルがたくさんあってお勧めですよ。
WMI Fun !! 〜 WMI に興味がある方・システム管理者必見 !! 〜
http://homepage2.nifty.com/tcubic/wmifun/

System Scripting Runtime 1.0 ってのを使う方法もあります。
nslookupもできるみたいですね。
http://www.jwntug.or.jp/tech/technote/dev/netal_ssr-j.html


To: toshi さん
> ”実行時エラー'430' クラスはオートメーションまたは予測したインターフェースをサポートしていません”
> このエラーを出す場合というのは、どういった場合なのでしょうか?
> 単純にscrrun.dllを呼び出すと起こるのでしょうか?
> それとも、特定の関数・メソッドを使用すると起こるのでしょうか?

うーん、これは実際にそういう環境を用意して実験するのが早いかもしれませんね。
というより、もしこのエラーが出た場合、最新のIEなりWindows Scriptなりをインストール
してもらえばいいのでは?


To: nero さん
> とりあえずは ブラウザのウィンドウを別に立ち上げてそこに進捗を表示させて
> いますが、これを HTA のウィンドウ内ですませる方法はないでしょうか?

JScriptのコードですが、これが参考になると思います。
http://www.microsoft.com/japan/msdn/columns/dude/dude02262001.asp

心は、setTimeoutメソッドと、setIntervalメソッドです。


To: Nomuq さん
> さて、WSHまたはASPから呼び出す前提で
> 作成する場合、DLLまたはEXE側の公開
> クラスのメソッドやプロパティの
> 引数はVariant型にしておいたほうが
> 無難なのでしょうか。

VBSやJSでは型宣言はできないという仕様はあるものの、内部的には
VBと同様、厳密に型が扱われています。
ですので、メソッドの引数やプロパティの値は、ちゃんと型を指定してあげたほうが
いいと思います。
実際、WSHやASPで使われることを想定している多くのコンポーネントが、
そういう仕様になっていますしね。

> clsPublicObj.propertyLong = CLng( 変数名 )
> とすれば、型変換の問題は特に起きないのでしょうか。

たとえば、次のようなコードを実行してみてください。

Dim a,b
a=10
b=139028075
msgbox typename(a)
msgbox typename(b)

型を宣言していないにも関わらず、aはInteger、bはLongに勝手になっていることがわかります。

clsPublicObj.propertyLong = a
とした場合、問題が起こるかどうかですが、こういうケースで型が違うと怒られた記憶はないです。
それがコンポーネント側で解決しているのか、VBSが自動的に型変換してるのかは
私にはわからないですけど。
まあ、a=Clng(a)としてやれば、Long型に変換されるのは間違いないので、こっちの方が
確実だとは思います。

管理人むたぐち さん 2003年 05月 14日 20時 18分 41秒

To: INSTALL さん
●アプリケーションのインストールを自動化する。

これは完全にソフト依存となるため、一概には何とも言えないですが、
いくつかの場合分けをしてみます。

たとえば、IEならIEAKというものがあります。
http://www.microsoft.com/japan/ieak/
(これは自動化というのとはちょっと違うかな?)

また、InstallShieldを使ったインストーラでは、コマンドラインオプションの指定で
インストールを自動化できるようです。
この掲示板で昔そういう話題が出たと思うんですが、ちょっと忘れました。

MSI(Microsoft Windows Installer)だと、comコンポーネントとしてWSHからも
アクセスできたかも?すいません、これも調査してません。

あと、ただ単に実行ファイルがlzhやzipで圧縮されてるだけであれば、
解凍し、適切なフォルダに実行ファイルをコピーし、それにショートカットを張る、
という操作をすれば自動インストールということになるでしょうね。
これらの操作なら、WSHで柔軟に対応できると思います。
設定ファイルやレジストリキーをあらかじめ用意しておき、これらの設定も同時にコピーして
やるようにすれば、自動設定も可能になりますね。
書庫ファイルの解凍は、コマンドラインツールを使うか、適当な書庫操作用comコンポーネントを
併用すると良いでしょう。


To: KKC さん
> 始めましてwindows2000sp3でフォルダをweb表示にした時に
> mp3やavi等のメディアファイルをシングルクリックしても
> プレビューするためのメディアプレイヤーを起動しないで
> ファイルサイズだけ表示出来るようにカスタマイズは出来ないでしょうか?

sp2までだと、C:\WinNT\Web\folder.httの
<span id=MediaPlayerSpan>
</span>
という部分を単に削除すれば良かったのですが、
sp3だとfolder.httを一字でも改変すると、フォルダのWeb表示が解除されてしまう
仕様になってしまいました。

ただし、この現象を回避する方法もあるようです。
詳細はこちらを追うと分かるかも。(2chのスレです)
「このフォルダのカスタマイズ」
http://pc2.2ch.net/test/read.cgi/win/1011536679/585-
ここの>>629,632ですね。私は試してません。

(というか、最近Win2000よりXPを触ってる時間の方が長かったりする私。
そんなこんなで、フォルダカスタマイズの熱がすっかり冷めたのは秘密だ)


To: なるなる さん
> HTMLドキュメントに適したobject等、修正すべき点のご指示をよろしくお願いします。

単にHTMLをファイルとしてGETして保存する分なら、あの方法がベターだと思います。

ただ、HTMLの中身を解析、たとえば<span id="hoge">ふにゃふにゃ</span>の
「ふにゃふにゃ」という文字列を取得したい、等のニーズがあるならば、
DynamicHTMLのdocumentオブジェクトを経由した方が便利かもしれません。


To: ishi さん
> 引数の文字列の中に"(ダブルクォテーション)を含めたいのですが

コマンドラインに"を含めても消えてしまうというのは、
WSHのArgumentsオブジェクトの仕様じゃないでしょうか?

管理人むたぐち さん 2003年 05月 14日 19時 33分 08秒

まずは過去記事の回答からです。

To: マック さん
> 現象は、前にでない+最小化されて点滅状態になります。
> IEの設定でしょうか?

IEというよりOSの設定のような気がします。
TweakUI等で、アクティブウィンドウの挙動を変更できるので、
試してみてはいかがでしょうか。
(そういえば、VBSで出したMsgBoxもよくそういう状態になったりしますね
私は、面倒なのでそういうもんだと思って特に対策してません)


To: 初心者A さん
> WSHでDB(たとえばACCESS)の値をWORD文書の特定の位置に挿入してWORD文書を保存したい

WSHからはADO等を用いてデータベースにアクセスすることが可能です。
また、WORDの操作はオートメーションにより可能です。
二つを組み合わせれば、お望みの操作が自動化できると思います。


To: 初心者B さん
> Windows95+IE5.5SP2でWSHは動作するのでしょうか。

WSHの一つ前のバージョンであるWSH2.0は、IE5.01以上に含まれていたと思うので、
多分動くのではないでしょうか。ちょっと自信がありませんが。
(もっとも、IEインストール時にオプションで選択しなかった場合は、動作しないでしょう)

最新版のWSH5.6は、Win95では動作対象外になっているので、WSH5.6からの機能を
利用したスクリプトは、Win95で動作させることはできないでしょうね。


To: おお さん
> 起動中のIEから現在アクティブなものを特定することはできますか
>(タイトルを指定せずに)

おそらく、IEのコンポーネントでは無理な気がします。
DynaCallというWin32APIを呼び出せるコンポーネントを使えば可能だと思います。


To: kuro さん
> 通常”RegRead”は、レジストリの値が無い場合エラーを返してくれるのですが、
> PCによりそのエラーが帰って来ずにスクリプトが終了してしまいます。
> (PCにより動作したり動作しなかったりします。)

On Error Resume Nextの使い方が不味い気がします。

このスクリプトだと、
rg = WSHShell.RegRead("HKLM・・・",1,True)
の行で、仮にキーが無かった場合はエラーが発生するものの、On Error Resume Nextの
おかげでrgはEmptyのままスクリプトは続行します。

で、If rg = 1 Then は当然Falseなので、Msgox "・・"&rgが実行されて終了となります。

正しくは、このような感じじゃないでしょうか。
キーが存在する=RegReadでエラーが発生しない=Err.Number=0である
というわけです。
ついでに言うと、RegReadもRegDeleteも引数は一つしかとりませんね。(これは単なる表記ミス?)

On Error Resume Next
Dim WSHShell,rg
Set WSHShell = WScript.CreateObject("WScript.Shell")
rg = WSHShell.RegRead("HKLM・・・")
If rg = 1 And Err.Number = 0 Then
WSHShell.RegDelete("HKLM・・・")
Else
MsgBox "・・"&rg
End If


Nomuq さん 2003年 05月 14日 19時 01分 02秒

今から自作するActiveX EXE または
ActiveX DLLについてアドバイスを下さい。

WSHまたはASPのVBScriptから呼び出すための
ものです。開発環境はVB6.0です。

さて、WSHまたはASPから呼び出す前提で
作成する場合、DLLまたはEXE側の公開
クラスのメソッドやプロパティの
引数はVariant型にしておいたほうが
無難なのでしょうか。

それとも、
CreateObjectした後、
例えばLong型のプロパティに対して
WSHやASPから
clsPublicObj.propertyLong = CLng( 変数名 )
とすれば、型変換の問題は特に起きないのでしょうか。

以上、WSHとちょっと違うかもしれませんが、
あくまでもWSHからの使用が
メインのDLLないし、EXE作成の視点で
アドバイスを頂ければ幸いです。

nero さん 2003年 05月 14日 18時 18分 08秒

はじめまして nero と申します。
ちょっと処理の重い HTA プログラムの作成中で困っています。

処理中はプログレスバーを表示しようと思い、 HTA のウィンドウに書き出す
ようにしてみました。ところが、どうも処理中はウィンドウ描画がお休みのよ
うで 0% のままで、処理後いきなり 100% になってしまいます。

とりあえずは ブラウザのウィンドウを別に立ち上げてそこに進捗を表示させて
いますが、これを HTA のウィンドウ内ですませる方法はないでしょうか?

どなたかご存知の方、教えてください。

さざなみ さん 2003年 05月 13日 13時 23分 12秒

さざなみです。

> ishi さん

ダブルクォテーションを出力するだけなら、

CScript test.vbs

test.vbs
--------------------------------
Wsh.Stdout.Write "ab""c"
--------------------------------

でどうでしょう。

toshi さん 2003年 05月 12日 09時 56分 47秒

以前、scrrun.dllで質問させていただきましたtoshiです。
またお世話になります。

今回もscrrun.dllについてなのですが、このDLLが古いバージョンでは

”実行時エラー'430' クラスはオートメーションまたは予測したインターフェースをサポートしていません”

とエラーを出すと記述しているHPがありました。他のHPにも”バージョンが古い場合は新しいのに入れ替えてください”等の記述があるHPが存在するのですが、
このエラーを出す場合というのは、どういった場合なのでしょうか?
単純にscrrun.dllを呼び出すと起こるのでしょうか?
それとも、特定の関数・メソッドを使用すると起こるのでしょうか?

ご存知の方がいらっしゃいましたら、教えていただきたいのですが・・

あさ さん 2003年 05月 10日 16時 53分 31秒
URL:Ping

はじめまして。かろうじてシステム管理者やってるあさといいます。
WSHの事をこのサイトで知って、勉強させてもらいました(^^;;

Pingを打つ関数を作って見たので、ぜひ使ってやって下さい。
5.6必須ですが、テキストファイルを使わないので、
気持ちきれいです(笑


Const D_RE_PING = "Reply from .+: bytes.+ time.+ TTL.+"

Function ExecutePing(strIPAddress)
Dim blnPing
Dim objWshShell
Dim objExec
Dim strRetPing
Dim objRegExp
Dim objColMatches
Dim objMatch
Dim strCommand

Set objWshShell = WScript.CreateObject("WScript.Shell")

blnPing = False

strCommand = "%comspec% /c ping.exe -n 1 -w 1000 " & strIPAddress
Set objExec = objWshShell.Exec(strCommand)
Do While objExec.Status = 0
WScript.Sleep 100
Loop

strRetPing = ""
If Not objExec.StdOut.AtEndOfStream Then
'Pingの実行成功
strRetPing = objExec.StdOut.ReadAll()

'正規表現にて成功メッセージの検索
Set objRegExp = New RegExp
With objRegExp
.IgnoreCase = True
.Global = True
.Pattern = D_RE_PING
Set objColMatches = .Execute(strRetPing)
End With

For Each objMatch in objColMatches
'見つかれば成功とみなす。
blnPing = True
Next
Else
'Pingの実行失敗
End If

ExecutePing = blnPing
End Function

これからも頑張ってください。
応援します!^^

・・・あとADSIがらみスクリプト希望(ボソ

Nomu さん 2003年 05月 08日 18時 03分 19秒
URL:Re>BASP21でHTTPダウンロード(自己レス)

Nomuです。自己レスです。
直接BASP21とは関係ないサンプルを偶然発見し、解決できました。

パスワード関係で、弊社環境ではProxyサーバを使用しているので、
-p proxy.aaa.bbb.co.jp:××××
××はポート番号(例80)
の組み合わせが正解でした。

Nomu さん 2003年 05月 08日 17時 10分 24秒
URL:BASP21でHTTPダウンロード

Nomuです。御教示ください。

インターネット上にあるファイルがあり、FTPではなく、HTTPで取ることが
許可されています。
実際、IEでアドレスを直打ちすると、間違いなく、
対象ファイルをダウンロードできます。

さて、そのファイルをVBScriptの中からBASP21でダウンロードしようと
すると、CannnotConnectエラーが発生します。

パスワード認証などは相手方では設定されていないので
(実際IEで直打ちすると取得できるので)
Proxyを通過できていないか、Basic認証ができていないようです。

BASP21のパラメータでは -A を設定すればよいと思うのですが、
このようなノンユーザID,ノンパスワードの場合、
どのように書けばよいのでしょうか。

色々試したのですが、うまくいかなくて・・・。

なお、社内の環境はProxyサーバがありますので、
-Aではなく、-Pオプションを使用するべきでしょうか?
(-Pも当然試してみたのですが・・・)

ishi さん 2003年 05月 03日 16時 21分 15秒

> Nomuさん
VBSの中ではなく、DOSで起動する場合なので、chr(34)という訳にはいかないのです。。。

Return