魔界の仮面弁士 さん 2004年 10月 04日 10時 23分 14秒

いりやさん、ばんのしゃーによかばんたさん。
MSMVP受賞、おめでとうございます!
無事に審査を通過できたようで、何よりです。

私やむたぐちさんとは任期が半期ずれておりますが、同じ2004年度の
受賞者という事で、これからもよろしくお願いします。


なお、次期(2005年1月)MVP Awardのための認定プロセスが、来月中旬から
開始されるとの事で、私の方からは、新たに4名の方を事務局に
推薦させていただきました。
いずれも、Scripting分野としての推薦です。無事、認定されますように…。

いりや さん 2004年 10月 03日 23時 59分 41秒

まるさん、

| はじめまして なんとかWSHを使う方法を知ろうとしてる初心者です。
| 基本をつかむのが 難しくふって沸いてくる単語になやまされています
|
| 「オブジェクトを作る」という言葉に悩まされているのですが 
| WScriptの構成は、下記の通リという事でこれが 基本構成なのか と見てます
|  あとは、サンプルからどう追いかけるのか というのが、未だ分からず

私も Windows Script Host の勉強を始めたころそうでした。
script56.ch ファイルはちょっと馴染むのに時間がかかるんですよ
ね・・・今から思うと。

逆に、そのときとにもかくにも参考になったのはサンプルスクリプ
トの存在でした。

私が毎日のように見てはスクリプトを実行したのは、

AYA さん, 趣味のJavaScriptなページ by AYA
  Windows Scripting Host
  新JavaScript入門 (WSH のページ)
  http://homepage3.nifty.com/aya_js/

むたぐちさん, Windows Scripting Host Laboratory,
  VBS講座・応用編
  オブジェクトの解説
  http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

です。

また、最近では @IT で海津智宏さんが解説を書かれています。

海津智宏さん, Windows管理者のためのWindows Script Host入門
  第1回 WSHの内部構造
  第2回 WSHスクリプト・コーディングの第1歩
  第3回 WScriptオブジェクトの詳細(1)
  第4回 WScriptオブジェクトの詳細(2)
  第5回 WshShellオブジェクトの詳細(1)
  第6回 WshShellオブジェクトの詳細(2)
  http://www.atmarkit.co.jp/fwin2k/operation/wsh01/wsh01_01.html

このあたりを一通り実行し終えた後には、Windows Script Host の
世界が身近になっているはずです。ぜひがんばってください。

いりや さん 2004年 10月 03日 23時 39分 56秒

ばんのしゃーによかばんた さん、

| >いりや さん 2004年 03月 28日 11時 32分 54秒
| >om さん、むたぐちさん、
| >| フォルダC:\AAAAフォルダ下にあるファイルと
| >| フォルダC:\BBBBフォルダ下にあるファイルを
| >| ファイル名で比較し、一致するファイル名が存在するか
| >| しないかを判別できるようなコードがわかれば教えて下さい。
|
| の件に関し、
|
| いりや さんの
| >JScript 言語での別解を用意してみました。
| >スクリプトを file.js に保存します。
| ※[1]
| のソースは、ちょっと見て理解出来なかったのですが、
| 漸くやってることが分かるようになりました。
| こういう遣り方ってJScript/JavaScriptでは普通なんでしょうか。

プログラムをデータとして扱えるプログラミング言語処理系では普
通におこなわれていますね。私の好きな Lisp, Scheme, Smalltalk,
ECMAScript はもちろん Ruby もできると聞いています。

ただ、JavaScript の参考書籍の類にこういうプログラミングが普
通に載っているかどうかちょっと調べてみました。

で、結論として、私のさがした吉祥寺の本屋さんでは JavaScript
第 3 版の一冊しか見つかりませんでした。本数自体はかなりあっ
たんですけどね〜。

  http://www.oreilly.co.jp/books/4873110270/
  http://www.oreilly.co.jp/books/4873110270/toc.html
  11.6 静的スコープとClosureオブジェクト

理由については、Douglas Crockford さんが JavaScript: The
World's Most Misunderstood Programming Language でうまくまと
めていますが、それ以外に考えられることとして、関数型プログラ
ミング言語そのものがポピュラーではなかった背景もあるんじゃな
いかなと。

  http://www.crockford.com/javascript/javascript.html

面白いんですけどね〜、Functional Programming って。

いりや さん 2004年 10月 03日 20時 16分 23秒

ばんのしゃーによかばんた さん 、

| >こうした要素をきちんと理解してプログラムに反映させて初めて正しいプログラ
| >ムが得られるのでしょうが、そのためのハードルがなんと高いことか。
|
| いろいろ知っていると、つい使いたくなるものですが、そういう誘惑を抑えて、
| 筋のよい、堅実堅牢なプログラム作りを心掛けることが最重要だと思います。

そうですね。

[snip]
| 堅実堅牢なプログラム作りのほうで、私のお勧めのひとつは、
| 自己証明的プログラミングと呼んでるものです。
| 「〜のはず」をプログラム上でチェックします。

これは契約によるプログラミングに出てくる事前条件の満足に通じ
るものがありますね。

私は Bertrand Meyer さんのオブジェクト指向入門を読んで表明
(Assertion) などの必要なキーワードを知りました。

表明そのものは Jon L. Bentley さんのプログラマのうちあけ話の
アルゴリズムの検査や XP だっけか、単体検査の枠組みでも導入さ
れていますね。

[snip]
| このように、もし「はず」どおりでなかったら、プログラムがそれ以上走らないようにします。
| つまり、動いてるということは、「はず」どおりであることを意味します。
| このようなチェックのオーバヘッドは数%で、実用上は誤差範囲です。
| 実用上は、その程度の性能より品質のほうが、よほど重要です。

よくわかります。最近自分が遭遇するエラーのほとんどは「はず」
の精査 (洗い出し) が貧弱でそれゆえ「はずじゃなかった」ために
起こるものだからです。マニュアルの不備に文句をいっている場合
ではないですね。

いりや さん 2004年 10月 03日 19時 31分 01秒

ばんのしゃーによかばんた さん、

free(3c) で一つ読み落としていたことがありました。Linux の
malloc(3) の DESCRIPTION に二重起動に関する記述もありました。

| free() frees the memory space pointed to by ptr, which
| must have been returned by a previous call to malloc(),
| calloc() or realloc(). Otherwise, or if free(ptr) has
| already been called before, undefined behaviour occurs.

ここの if free(ptr) has already been called before がそうで
した。ということで同じポインタを引数に free(3c) を呼び出した
場合は、未定義の振る舞いに分類されます。二重起動は未規定であ
る、という説明は訂正します。

| 蛇の道は蛇。OS屋さんの考えそうなことを想像すると、
| MALLOC_CHECK_をセットすると、まず、mallocした領域にゴミを埋める。これは、
| mallocでやるより、ぺージ割り当て時とfree時にやる。
| それから、割り当て単位が16バイトなら、要求が端数のとき、次のバイトにマークを書く。
| freeでは、変なアドレスをエラーにする。マークを確認して消されていたらエラーにする。
| 次のmallocに備えてゴミを埋める。そんなところでしょうか。

これは malloc(3c) と合わせて時間があったときに見てみます。C
FAQ 7.14 で malloc(3c) で得られたメモリブロックへのアクセス
が発生するまで確保が先延ばしされる実装についての質問があって
興味のある話題です。

| | freeがfreeした領域にSEGVを起こすアドレスを埋め込んでいる?
| | 最近のOSは信頼性が強化されているのでしょうか。それともgdb環境だけ?
|
| MALLOC_CHECK_ がデフォルトで有効になってませんか?

ソースコードで調べてみます。というのは環境変数として設定して
いなかった場合のセマンティクスが明記されていなかったので。。

いりや さん 2004年 10月 03日 19時 17分 39秒

・Microsoft MVP, 2004

Visual Developer - Scripting 分野における Most Valuable
Professional のアワードを受賞しました。

魔界の仮面弁士さん、ご推薦ありがとうございます。ばんのしゃー
によかばんたさんも受賞おめでとうございます。

たまたま会社のメールサーバに接続したら通知メールで知ることが
出来ました。

| ※いりや さんはお名前だったのですね。

はい。最近は平仮名か漢字かはべつに本名をハンドルに使用してい
ます。

| 私はまた、0011 ナポレオン、ソロのイリヤ、クレアキンに由来するハンドル名かと
| 思ってました。BSフジで再放送してましたので、見てみましたが、がっかり。
| さすがに古くて、これはちょっと見るに耐えないです。残念。

私が中学生の頃にパソコン通信を始めたばかりのころ、徳島に本拠
地をおく Macintosh Users Group のメンバの方から、全く同様の
突込みを受けたことを思い出しました。

ロシアではイリヤという名前があるようですね。イレヤ・クレアキ
ンも役柄はロシア系です。

ばんのしゃーによかばんた さん 2004年 10月 03日 18時 28分 09秒

>いりや さん 2004年 10月 02日 02時 14分 34秒
>| あら、不思議。私の知っている(/いた頃の)OSでは、freeしても、
>| ページ全体が空にならない限り、また、他スレッドがmallocして書き換えない限り、
>| freeした領域はそのまま残っていましたが。。。
>いえこれは free(3c) の実装による話ですのでそういう実装もあるのでしょう。

所謂、Unixでは、そうでしたね。

freeは、OSのメモリ割り当て管理表を操作するだけで、freeするメモリには触りも
しなかったのです。

>| それに、変なアドレスを指定しても、freeはエラーにならなかったはずです。
>| マニュアル(man)にも、freeはエラーを返さないとわざわざ書いてあったりして。

メモリ割り当て管理表に該当アドレスがないのでNOPで帰りました。

>二重解放については Linux の malloc(3) の NOTES で
>| Crashes in malloc(), free() or realloc() are almost always
>| related to heap corruption, such as overflowing an allo-
>| cated chunk or freeing the same pointer twice. ←

malloc,freeなどでこけるのは、OSのメモリ割り当て管理表が壊れたときだけでした。

>HP-UX 11i v2 04/09 の free(3c) の WARNING で
>| The following actions are strongly discouraged and may be unsupported in
>| a future version of malloc():
>|
>| - Attempting to free() the same block twice. ←
>| - Depending on unmodified contents of a block after it has been freed.
>| - Attempting to realloc() a block after it is freed.
>|
>| Undocumented features of earlier memory allocators have not been
>| duplicated. Applications which used any of the above bad programming
>| practices or discouraged practices are not guaranteed to continue
>| functioning at future releases.

これが核心ですね。堅牢性強化の予告。Unix各社は、TPS(Transaction Per Second)
性能で競っていたので、性能低下になるし、非互換も出したくなかったのでしょう。
そうすると、既存資産が大量に動かなくなるでしょうね。こりゃ大変だ。
でも、まぁ、PurifyやBoundsCheckerなどの高価な外部ツール頼みだった障害検出は
随分楽になりそう。

>とはいえそうプログラミングすることに対して free(3c) を頑健にするための対
>処はとっているようで Linux の malloc(3) の NOTES で
>| Recent versions of Linux libc (later than 5.4.23) and GNU
>| libc (2.x) include a malloc implementation which is tun-
>| able via environment variables. When MALLOC_CHECK_ is
>| set, a special (less efficient) implementation is used
>| which is designed to be tolerant against simple errors,
>| such as double calls of free() with the same argument, or
>| overruns of a single byte (off-by-one bugs).
>と書いてある通り MALLOC_CHECK_ がセットされていれば二重解放についてロバ
>ストになる対策は施しているようです。これは「NOP になるだけで、エラーにな
>らない」事象の説明として適当で、きっと、このような実装を加えていたのでしょ
>う。

蛇の道は蛇。OS屋さんの考えそうなことを想像すると、
MALLOC_CHECK_をセットすると、まず、mallocした領域にゴミを埋める。これは、
mallocでやるより、ぺージ割り当て時とfree時にやる。
それから、割り当て単位が16バイトなら、要求が端数のとき、次のバイトにマークを書く。
freeでは、変なアドレスをエラーにする。マークを確認して消されていたらエラーにする。
次のmallocに備えてゴミを埋める。そんなところでしょうか。

off-by-one bugsという言葉は知りませんが、有りそうなのは、strcpyでterminating
NUL characterを忘れることです。私はstrcpyやstrncpyは使用禁止にして、memcpyを
使うべきだと考えています。

| freeがfreeした領域にSEGVを起こすアドレスを埋め込んでいる?
| 最近のOSは信頼性が強化されているのでしょうか。それともgdb環境だけ?

MALLOC_CHECK_ がデフォルトで有効になってませんか?

ばんのしゃーによかばんた さん 2004年 10月 03日 17時 31分 53秒

珍しく、UTF-8のメールが来ました。こんなの初めてです。

で、私の使っているメーラはtsworksというオーソドックスなもので、読めません。:-<
※メールは7bit JISと決まってる。

最近のメールサーバは8bitを通すようになっているのでしょうか、
幸い、経路で文字化けしなかったようです。

いざというときのために、メールがバラバラに格納されるメーラがいいですね。
私のメーラ選択の第一要件です。tsworksの前はAlMail。その前はDOSのH'PCM。

本文の方は既存のVBScriptでコード変換して読めましたが、
ヘッダは、UTF-8 B-encodingてなもんので、Subjectが読めません。:-<
※UTF-8は、以下でも読めます。
MS Word(ツール、オプション、全般、文書を開くときにファイル形式を確認する(O)をチェック)
IEに*.TXTをドロップ。[開く]はNG。

そういえば、先日のMHTML形式では、Shift JISのB-encodingなんてのが使われていましたね。

そうそう、私が趣味でプログラミングを始めたのは、e-mailの文字化け対策、
コード変換がきっかけでした。必要はプログラミングの母です。:-)

で、また、UTF-8 B-encodingのコード変換のVBScriptを作ってみました。

――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso
Dim iFile
Dim oFile
Dim re
Dim match
Dim matches
Dim str
Const START_ID="=?UTF-8?B?"
Const STOP_ID="?="
Dim line

Set fso=CreateObject("Scripting.FileSystemObject")
Set iFile=Wscript.Stdin
Set oFile=Wscript.StdOut

If Not iFile.AtEndOfStream Then
: line=iFile.ReadAll
: Set re=New RegExp
: re.IgnoreCase=True
: re.Pattern="=\?UTF-8\?B\?.+?\?="
: If re.Test(line) Then
: : Do
: : : Set matches=re.Execute(line)
: : : For Each match In matches
: : : : str=mime2sjis(Mid(match.Value,1+Len(START_ID),match.Length-Len(START_ID)-Len(Stop_ID)))
: : : : line=Left(line,match.FirstIndex) & str & Mid(line,1+match.FirstIndex+match.Length)
: : : Next
: : Loop While matches.count>0
: End If
End If
oFile.Write line
Wscript.Quit

Function mime2sjis(mime)
Dim bin

bin=Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,_
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,_
0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,63,_
52,53,54,55,56,57,58,59,60,61,0,0,0,0,0,0,_
0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,_
15,16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,_
0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,_
41,42,43,44,45,46,47,48,49,50,51,0,0,0,0,0)

Dim n
Dim m
Dim utf8

m=Len(mime)
For n=1 To m Step 4
: If n+1>m Then Exit For
: If Mid(mime,n+1,1)<>"=" Then
: : utf8=utf8 & ChrB((bin(Asc(Mid(mime,n,1)))*4+(bin(Asc(Mid(mime,n+1,1))) \ 16)) Mod 256)
: End If
: If n+2>m Then Exit For
: If Mid(mime,n+2,1)<>"=" Then
: : utf8=utf8 & ChrB((bin(Asc(Mid(mime,n+1,1)))*16+(bin(Asc(Mid(mime,n+2,1))) \ 4)) Mod 256)
: End If
: If n+3>m Then Exit For
: If Mid(mime,n+3,1)<>"=" Then
: : utf8=utf8 & ChrB((bin(Asc(Mid(mime,n+2,1)))*64+bin(Asc(Mid(mime,n+3,1)))) Mod 256)
: End If
Next
mime2sjis=UTF8toSJIS(utf8)
End Function

Function UTF8toSJIS(utf8)
Dim code
Dim code1
Dim code2
Dim code3
Dim k,sjis

For k=1 To LenB(utf8)
: code=AscB(MidB(utf8,k,1))
: If 0<=code And code<128 Then
: : sjis=sjis & Chr(code)
: ElseIf 128+64<=code And code<128+64+32 Then
: : code1=code
: : k=k+1
: : code2=AscB(MidB(utf8,k,1))
: : code=(code1 And &H1F) * 64 + (code2 And &H3F)
: : If Chr(Asc(ChrW(code)))=ChrW(code) Then
: : : sjis=sjis & ChrW(code)
: : Else
: : : sjis=sjis & "%" & Right(Hex(code1+256),2) & "%" & Right(Hex(code2+256),2)
: : End If
: ElseIf 128+64+32<=code And code<128+64+32+16 Then
: : code1=code
: : k=k+1
: : code2=AscB(MidB(utf8,k,1))
: : k=k+1
: : code3=AscB(MidB(utf8,k,1))
: : code=(code1 And &H0F) * 16 * 256 + (code2 And &H3F) * 64 + (code3 And &H3F)
: : If Chr(Asc(ChrW(code)))=ChrW(code) Then
: : : sjis=sjis & ChrW(code)
: : Else
: : : sjis=sjis & "%" & Right(Hex(code1+256),2) & "%" & Right(Hex(code2+256),2) & "%" & Right(Hex(code3+256),2)
: : End If
: Else
: : sjis=sjis & "%" & Right(Hex(code+256),2)
: End If
Next
UTF8toSJIS=sjis
End Function
――――――――――――――――――――――――――――――――――――――

これで、Subjectが読めました。
Subject: [MVP] Microsoft MVP アワード受賞おめでとうございます。

魔界の仮面弁士 さん、推薦ありがとうございます。

そして、いりや さんもおめでとうございます。

MVP Members
http://mvp.support.microsoft.com/default.aspx?scid=fh;en-us;mvpaward&style=toc
に、お名前が載ってました。

※いりや さんはお名前だったのですね。
私はまた、0011 ナポレオン、ソロのイリヤ、クレアキンに由来するハンドル名かと
思ってました。BSフジで再放送してましたので、見てみましたが、がっかり。
さすがに古くて、これはちょっと見るに耐えないです。残念。

ばんのしゃーによかばんた さん 2004年 10月 03日 17時 30分 27秒

エクスプローラのショートカットで、
開いたときに、マイドキュメントやマイコンピュータを選択させておくことは
explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
てな感じで出来ますが、ルートのデスクトップを選択させることができません。:-<
::{仮想デスクトップ}がない?

そこで、shell:???はどうかと試したら、
explorer.exe /e,"shell:desktop"
だと実デスクトップが選択されました。:-(

explorer.exe /e,"shell:desktopfolder"
でルートのデスクトップが選択できました。:-)
やれやれ。

[ファイル名を指定して実行]からshell:???だと、どちらも、ルートのデスクトップが
選択されます。変なの。

まる さん 2004年 10月 02日 07時 40分 40秒

はじめまして なんとかWSHを使う方法を知ろうとしてる初心者です。
基本をつかむのが 難しくふって沸いてくる単語になやまされています

「オブジェクトを作る」という言葉に悩まされているのですが 
WScriptの構成は、下記の通リという事でこれが 基本構成なのか と見てます
 あとは、サンプルからどう追いかけるのか というのが、未だ分からず

 質問(よろしくお願いします)
オブジェクトを作る

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")

のサンプル 下記のどの部分を使おうとしているかてどうやって分かるのでしょうか
又仕様から 
"Scripting.FileSystemObject"は、プログラムID と書いてるのですが
 このプログラムIDて ある機能のオブジェクトを作りたいという時に
 これが オブジェクトを作るIDだと 分かるには、どうすれば
 いいんでしょうか  
 よろしくお願い致します 


WScript
+WshArguments 黄色
 +WshNamed  黄色
 +WshUnnamed 黄色
+WshController
 +WshRemote
  +WshRemoteError
+WshNetWork
+WshShell
 +WshSortcut
 +WshUrlShrtCut
 +WshEnvlonment   黄色
 +WshSpecialFolders 黄色
 +WshScriptExec


いりや さん 2004年 10月 02日 03時 07分 36秒

ばんのしゃーによかばんた さん、

| あまり役に立たない情報ですが、
| .VBS の TypeName(Me) は VBScriptTypeInfo
| .JS の typeof(this) は object
| です。

いや、そうでもないんですよ。

というのは、この this 擬似変数にバインドされている global object を使う
とグローバルコンテクストの変更が可能になるからです。

グローバルコンテクストの変更が可能になるというのは具体的にどういうことか
というとある変数への代入は、グローバル変数への代入になる。ある変数に関数
オブジェクトを代入すると、実行中、どのコンテクストからでもその変数名を関
数名として呼び出しが可能となるわけです。

例えば、i-Unknown さんはこれを利用して DynWrap Helper で
Win32API.setGlobal() をインプリメントされています。
http://members.at.infoseek.co.jp/IUnknown/WSH/dwhelper/reference/win32api/setglobal.htm

それから、昔 InternetExplorer.Application オブジェクトを使ってダイアログ
ウインドウを作成する話題をしました。

いりや さん 2004年 06月 28日 00時 56分 03秒
ばんのしゃーによかばんた さん 2004年 06月 29日 15時 04分 01秒
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list109.shtml

そのとき OnQuit イベントハンドラを動的に書く書き方を議論しましたが、この
global object を通じてハンドラを定義する方法を採用すれば、一番外側のスコー
プでなくとも書きたいスコープで書くことができます。

ただ、もちろん、これは諸刃の剣。グローバルコンテクストの動的な変更は、環
境変数に依存して振る舞いをかえるプログラムで環境変数の値を動的に変更する
のとやっていることはかわりません。振る舞いをソースコードの特定の範囲だけ
で知ることができず保守容易性が損なわれます。

そのため、損なわれたとしてもそれに余りある利点が享受できる場合にのみ利用
すべきです。

さきのダイアログに話を戻すと Windows Script Host のイベントハンドラはグ
ローバルコンテクストにあらわれる (WScript.connect(), WScript.createObject()
の第二引数で指定する) Prefix + イベント名という変数名にバインドされた関
数オブジェクト、という実装仕様です。この実装では Prefix を実行時に決める
ときにそのイベントハンドラを作成できません。こういう時は global object
を使う方式を検討してよいのではないかと思っています。

いりや

[ 余談 ]

実は・・・本当のことを言うと、このメッセージと Douglas Crockford さんの
this のセマンティクスに関する解説を思い出してピキンときて ECMAScript 3rd
Edition と i-unkno^{..}wn さんの DynaWrapper Helper の解説を読んで、グロー
バルコンテクストにおける this 擬似変数にバインドされている global object
の存在を正確に理解できたのでした。

global object の解説については、ECMA Script 3rd Edition の PDF で検索に
かけて読み進めると拾い読みができて早いです。

  10.1.5 Global Object
  15.1 The Global Object

いりや さん 2004年 10月 02日 02時 14分 34秒

※ 引用が多いため長文です。

ばんのしゃーによかばんた さん、

| おっとっと、それは、ちょっと。
| ぱっと見て気付くくらいに、レビュー感度を上げなければ。:-p

そうですね。普段 C のコードを保守していてコードを追うことはよくあるので
それで C の何たるかをわかったような錯覚をしていたようです。まだまだ鍛錬
が足りませんな〜。

ところで、これを書きながら、ふと、積読 (つんどく) 状態にあった C プログ
ラミング FAQ (以下 C FAQ) を開いてみたら 7.20, 7.21 にドンピシャで書いて
あった。例題もぴったり。あちゃーです。

[snip]
| >下の gdb での逐次実行においては free() 後の 0x8049730 の 2 words にこの
| >プロセスのアクセスできるメモリ領域の境界を越えた数字が入ったので SIGSEGV
| >のシグナルを発したのですぐわかりましたが。
|
| あら、不思議。私の知っている(/いた頃の)OSでは、freeしても、
| ページ全体が空にならない限り、また、他スレッドがmallocして書き換えない限り、
| freeした領域はそのまま残っていましたが。。。

いえこれは free(3c) の実装による話ですのでそういう実装もあるのでしょう。

               ★☆

| それに、変なアドレスを指定しても、freeはエラーにならなかったはずです。
| マニュアル(man)にも、freeはエラーを返さないとわざわざ書いてあったりして。
| ※会社にめちゃくちゃ優秀なひとがいて、そのひとが、freeで二重解放しても、
| NOPになるだけで、エラーにならないから大丈夫、と豪語するのを聞いて、
| 優秀な頭脳とプログラム品質は連動しないものだと再認識しました。
| ※他スレッドのメモリを誤解放して、メモリ破壊障害を引き起こす。

このあたり free(3c) の解説が手元にない人にとっては文章を読み進めるのが難
しいでしょう。ちょっといくつかの実装の仕様 (man の出力) とさきの C FAQ
を引用しながら解説してみます。

(1) 「変なアドレスを指定しても、freeはエラーにならなかった」

これは C FAQ 11.33 で解説するところの未定義 (undefined) の動作に分類され
る free(3c) の仕様のようです。

例えば gdb を実行した Linux の malloc(3) の DESCRIPTION は

| free() frees the memory space pointed to by ptr, which
| must have been returned by a previous call to malloc(),
| calloc() or realloc(). Otherwise, or if free(ptr) has
| already been called before, undefined behaviour occurs.

「変な」が malloc() が返したポインタでないということを指すのであれば、
Otherwise で続く未定義の振る舞いをするということです。C FAQ 11.33 (書籍
版の解説) によれば、

| 本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さな
| い。コンパイルできないかもしれないし、誤った動きをするかもしれないし (ク
| ラッシュしたり黙って誤った結果を出したり) 、あるいはたまたまプログラマの
| 意図したとおりの動きをするかもしれない。

ということなので「エラーにならなかった」のは、C FAQ の「あるいは」で続く
節にたまたまヒットしたのでしょう。

(2) 「freeはエラーを返さない」

これは Linux の malloc(3) の DESCRIPTION の

| free() returns no value.

のことですね。ただ RETURN VALUE と今回の SIGSEGV シグナルの提起とは別の
ものです。

(3) 「freeで二重解放しても、NOPになるだけで、エラーにならない」

これに近い表現は Linux の malloc(3) の DESCRIPTION の

| If ptr is NULL, no operation is performed.

かな。でもこれはもちろん違うことを説明しています。

二重解放については Linux の malloc(3) の NOTES で

| Crashes in malloc(), free() or realloc() are almost always
| related to heap corruption, such as overflowing an allo-
| cated chunk or freeing the same pointer twice. ←

HP-UX 11i v2 04/09 の free(3c) の WARNING で

| The following actions are strongly discouraged and may be unsupported in
| a future version of malloc():
|
| - Attempting to free() the same block twice. ←
| - Depending on unmodified contents of a block after it has been freed.
| - Attempting to realloc() a block after it is freed.
|
| Undocumented features of earlier memory allocators have not been
| duplicated. Applications which used any of the above bad programming
| practices or discouraged practices are not guaranteed to continue
| functioning at future releases.

と注意が喚起されています。「エラーにならない」のは Undocumented features
と書いてある通り、C FAQ 11.33 で説明している未規定の (unspecified) 動作
に分類されるいるものだったのでしょう。

とはいえそうプログラミングすることに対して free(3c) を頑健にするための対
処はとっているようで Linux の malloc(3) の NOTES で

| Recent versions of Linux libc (later than 5.4.23) and GNU
| libc (2.x) include a malloc implementation which is tun-
| able via environment variables. When MALLOC_CHECK_ is
| set, a special (less efficient) implementation is used
| which is designed to be tolerant against simple errors,
| such as double calls of free() with the same argument, or
| overruns of a single byte (off-by-one bugs).

と書いてある通り MALLOC_CHECK_ がセットされていれば二重解放についてロバ
ストになる対策は施しているようです。これは「NOP になるだけで、エラーにな
らない」事象の説明として適当で、きっと、このような実装を加えていたのでしょ
う。

(4) 「他スレッドのメモリを誤解放して、メモリ破壊障害を引き起こす」

これは、スレッド A があるポインタの指す先を free(3c) で解放した後スレッ
ド B に制御がうつり malloc(3c) で割り付けたメモリのポインタが返される。

そのすぐ後にスレッド A が (意図してかしらずして) free(3c) をもう一度実行
し、メモリを解放する。

その後スレッド B に制御がうつり、スレッド B がそのメモリにアクセスしよう
としたら free(3c) されているので、私の Linux 環境だと SIGSEGV シグナルを
受け取る。

こういうシナリオのことを説明しています。

               ★☆

| freeがfreeした領域にSEGVを起こすアドレスを埋め込んでいる?
| 最近のOSは信頼性が強化されているのでしょうか。それともgdb環境だけ?

うーん。これは glibc の malloc.c をもう少し読んでみないと分からないです
ね〜。

| Program received signal SIGSEGV, Segmentation fault.
| 0x4009eff0 in __libc_free (mem=0x40150cd0) at malloc.c:3155
| 3155  malloc.c: No such file or directory.
|     in malloc.c

これを読むと 3155 行で No such file or directory のエラーを返す File I/O
関連の関数を呼んでいるようです。

NOTES とこのエラーメッセージだけで解放されたメモリ空間の値の変化がどこか
らくるのかまでは推理できませんね〜、さすがに。

いりや

[ リファレンス ]

comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/faq.html

CプログラミングFAQ―Cプログラミングのよく尋ねられる質問
新紀元社情報工学シリーズ
http://www.amazon.co.jp/exec/obidos/ASIN/4775302507/249-4308573-7025942

HP-UX 11i Version 2: September 2004
malloc(3c)
http://www.docs.hp.com/cgi-bin/onlinedocs.py?mpn=B2355-60105&service=hpux&path=00/26/2604&title=HP-UX%20Reference%20%2811i%20v2%2004/09%29

※ RedHatLinux の man についてはインターネット上で多数掲載されているので
  省略。

魔界の仮面弁士 さん 2004年 10月 01日 20時 37分 54秒

WScriptオブジェクトのGetObjectメソッド(GetObject関数に非ず)って、
URLの取得が出来たんですね。全く知りませんでした……。

----------------
URL = "http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list114.shtml"

Set Doc = WScript.GetObject(URL)
Do Until Doc.readyState = "complete"

WScript.Sleep 500

Loop

WScript.Echo Doc.documentElement.innerText

ヤーポンレン さん 2004年 09月 30日 17時 27分 11秒

はじめまして。Shellを使用したコマンドについて
宜しければご教授頂けますと助かります。

現在下記のようなソースを使ってファイル情報の詳細を
入手しようとしております。
Set Shell = CreateObject("Shell.Application")
Set OFJECTFOLDER = Shell.Namespace(FILEPATH)

'Get File Datail
For I = 0 To 39
Select Case I
Case 0
FILENAME = OFJECTFOLDER.GetDetailsOf(OFJECTFOLDER.ParseName(FILEOBJECT.GetFileName(OBJECTFILE)), I)
     .
.
.
Case 39
End Select
Next
この方法ですとShellを使いますのでWinNT4が入ったマシンではこちらの
サイトの説明どおり動きません。IEのバージョンは5.5でしたので
動くかなと思ったのですが・・・・。
FSOを使って取得できる情報は限られているため
Shellを使うようにしたのですが・・・・。

 ・シェル統合モードでインストールされているかどうかを確認する方法
 ・Shellを使う以外にファイルの所有者や作成者など、「概要」タブに
  表示される項目を取得できる方法

お手数ですが、以上をご存知の方はおられませんでしょうか?
あと半年で2000以上にサーバーを入れ替えるので待てばよいのですが、
現行のNTでも出来れば取得が出来ないかと思っております。


    

ばんのしゃーによかばんた さん 2004年 09月 29日 18時 10分 05秒

>いりや さん 2004年 09月 29日 02時 22分 49秒
>ふむ。ぱっと見てなぜ×なのか、わからなかったのですが、

おっとっと、それは、ちょっと。
ぱっと見て気付くくらいに、レビュー感度を上げなければ。:-p

>デバッガ (gdb) でおっかけたところ free() した後の不定値を p = p->next で
>代入してそこ (0x40150cd0 番地) に対して free() をしようとしてセグメンテー
>ション・バイオレーションを起こしています。
>free() した後の y (0x8049730) からの 2 words にもし、このプロセスがアク
>セス可能なメモリ領域のアドレスが書かれていると、free() して悲鳴をあげて
>いても露見するかといえばなかなか分からないですね。
>下の gdb での逐次実行においては free() 後の 0x8049730 の 2 words にこの
>プロセスのアクセスできるメモリ領域の境界を越えた数字が入ったので SIGSEGV
>のシグナルを発したのですぐわかりましたが。

あら、不思議。私の知っている(/いた頃の)OSでは、freeしても、
ページ全体が空にならない限り、また、他スレッドがmallocして書き換えない限り、
freeした領域はそのまま残っていましたが。。。
それに、変なアドレスを指定しても、freeはエラーにならなかったはずです。
マニュアル(man)にも、freeはエラーを返さないとわざわざ書いてあったりして。
※会社にめちゃくちゃ優秀なひとがいて、そのひとが、freeで二重解放しても、
NOPになるだけで、エラーにならないから大丈夫、と豪語するのを聞いて、
優秀な頭脳とプログラム品質は連動しないものだと再認識しました。
※他スレッドのメモリを誤解放して、メモリ破壊障害を引き起こす。

freeがfreeした領域にSEGVを起こすアドレスを埋め込んでいる?
最近のOSは信頼性が強化されているのでしょうか。それともgdb環境だけ?

ばんのしゃーによかばんた さん 2004年 09月 29日 16時 03分 54秒

>ばんのしゃーによかばんた さん 2004年 09月 28日 20時 23分 39秒
>>| フォルダC:\AAAAフォルダ下にあるファイルと
>>| フォルダC:\BBBBフォルダ下にあるファイルを
>>| ファイル名で比較し、一致するファイル名が存在するか
>>| しないかを判別できるようなコードがわかれば教えて下さい。

はRDBのJOINと同じ?
テーブルAAAAAとBBBBをNameキーでJOINする。

昔、超並列DBサーバOSを作っていたときに、DB屋さんから、
いろいろ聞きましたが、忘れました。DB屋さんの話は難しくって。:-p

RDBのJOINと言えば、RDBの重い処理の代名詞みたいなもので、
その性能を上げるために、いろんな方式が作られている。とか。

よく分かりませんが、以下のような対応でしょうか。

[1] いりや さんのJScript 言語での別解
は nested loop join

[2] むたぐち さんのScripting.Dictionaryを使うもの
は hash join

[3] むたぐち さんのfso.FileExistsを使うもの
は index join ?

[4] ばんのしゃーによかばんた さんのfor %0 in ( *.* ) do if exist %~nx0 echo %0")
も index join ?

[5] ばんのしゃーによかばんた さんのdir /b C:\AAAA\*.* C:\BBBB\*.* |sort|uniq -d
は merge join (sort merge join)

RDBに詳しい方、宜しくフォローをお願いします。

いりや さん 2004年 09月 29日 02時 22分 49秒

ばんのしゃーによかばんたさん、

| ばんのしゃーによかばんた さん 2004年 08月 27日 20時 41分 53秒
|
| >いりや さん 2004年 08月 24日 03時 43分 58秒
| >これを書いていて、並行プログラミングの難しさを実感しました。
| >ShellWindows コレクションに対して副作用を与える主体がこのプロセス内に閉
| >じていて、ie.Quit() が非同期ではなく同期で実行されるような、そんなシンプ
| >ルな実行モデルであれば、このようなタイミングイシューも発生しない。
|
| うーん、そうでしょうか。以下はそんなシンプルな実行モデルです。
|
| よくある制御表チェインを想像してください。
| [anchor]->[next]->[next]->>->[0]
| これを解放してください。
|
| ×案
| for(pTable=anchor;pTable;pTable=pTable->next){
| free(pTable);
| }

ふむ。ぱっと見てなぜ×なのか、わからなかったのですが、

function LinkedList(value, next) {
    this.next = next;
    this.value = value;
}

var z = new LinkedList('z', null);
var y = new LinkedList('y', z);
var x = new LinkedList('x', y);
var w = new LinkedList('w', x);
var v = new LinkedList('v', w);

for (var p = v; p; p = p.next)
    WScript.echo(p.value);

for (var p = v; p; p = p.next)
    p = null; // the object bound to var p will be gc'ed.

と JScript に書いてみてわかりました。

p = p.next の p.next を解釈しようとして p にバインドされている (とプログ
ラマが思っていた) オブジェクトがいないのにそのオブジェクトの next プロパ
ティーを参照しようとしてエラーが提起されます。ここですね。

ただポイントは分かったのですが JScript だと free() はガベジコレクタにま
かせるので単純に null をバインドしたので「現実にはなかなか露顕しません」
という所の重みがいまいち感じられません。

で、久しぶりに C 言語でぽちぽち書いてみました。(インデントを有効にするた
め、全角スペースを多用しています。あらかじめご了承ください)

www2[Wed]$ cat -n linkedlist.c
   1 #include <stdio.h>
   2
   3 typedef struct _LinkedList {
   4     char *value;
   5     struct _LinkedList *next;
   6 } LinkedList;
   7
   8 int main() {
   9     LinkedList *p, *y, *z;
  10     y = (LinkedList *)malloc(sizeof(LinkedList));
  11     z = (LinkedList *)malloc(sizeof(LinkedList));
  12     y->value = "y";
  13     y->next = z;
  14     z->value = "z";
  15     z->next = NULL;
  16
  17     for (p = y; p; p = p->next)
  18         printf("value : %s\n", p->value);
  19     for (p = y; p; p = p->next)
  20         free(p);
  21 }

コンパイルして実行させると、

www2[Wed]$ ./a.out
value : y
value : z
Segmentation fault

セグメンテーション・バイオレーション (みちゃいけない所をみようとした) を
おこしてしまいました。

デバッガ (gdb) でおっかけたところ free() した後の不定値を p = p->next で
代入してそこ (0x40150cd0 番地) に対して free() をしようとしてセグメンテー
ション・バイオレーションを起こしています。

free() した後の y (0x8049730) からの 2 words にもし、このプロセスがアク
セス可能なメモリ領域のアドレスが書かれていると、free() して悲鳴をあげて
いても露見するかといえばなかなか分からないですね。

下の gdb での逐次実行においては free() 後の 0x8049730 の 2 words にこの
プロセスのアクセスできるメモリ領域の境界を越えた数字が入ったので SIGSEGV
のシグナルを発したのですぐわかりましたが。

これを見ると、○案もしくは△案のように、次に free() する LinkedList 型の
オブジェクトへのポインタをコピーしておいてから、free() をやらなければな
らない、ということがよくわかりますね。

さきほどの JScript の例をふりかえってみてもコピーするタイミングは一緒で
すね。

エラーが起きるタイミングは JScript は p = p.next の右辺の評価時ですが、C
の例では p = p->next を実行した後の free() のライブラリのコードの内部の
メモリアクセス時とそれぞれ違ってはいますが。

//
// ここから
//

www2[Wed]$ gdb a.out
GNU gdb Red Hat Linux (5.2-2)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) break 19
Breakpoint 1 at 0x8048550: file linkedlist.c, line 19.
(gdb) run
Starting program: /home/iriyak/tmp/a.out
value : y
value : z

Breakpoint 1, main () at linkedlist.c:19
19       for (p = y; p; p = p->next)
(gdb) step                          // free(p); の実行のすぐ前に移動
20           free(p);
(gdb) print p                        // p = y 後の p の値
$4 = (LinkedList *) 0x8049730
(gdb) print y                        // y の値
$5 = (LinkedList *) 0x8049730
(gdb) print z                        // z の値
$6 = (LinkedList *) 0x8049740
(gdb) x/2xw p                        // p : LinkedList 型 2 words (8 bytes) を表示
0x8049730:   0x080485e8   0x08049740
(gdb) x/2xw y                        // y : LinkedList 型 2 words (8 bytes) を表示 (後の word は y->next の値が格納)
0x8049730:   0x080485e8   0x08049740
(gdb) x/2xw z                        // z LinkedList 型 2 words (8 bytes) を表示 (後の word は NULL 0x00000000 が格納)
0x8049740:   0x080485ea   0x00000000
(gdb) next 1                         // free(p); の実行を終える
19       for (p = y; p; p = p->next)
(gdb) x/2xw p                        // p の値は y と等しい
0x8049730:   0x40150cd0   0x40150cd0
(gdb) x/2xw y                        // y の値は、free() 後のためゴミが格納
0x8049730:   0x40150cd0   0x40150cd0
(gdb) x/2xw z                        // z の値、まだ生きている
0x8049740:   0x080485ea   0x00000000
(gdb) step
20           free(p);
(gdb) x/2xw p                        // p = p->next を実行した後の状態
0x40150cd0 <main_arena+16>:   0x40150cc8   0x40150cc8
(gdb) x/2xw y                        // y の値は、free() 後のためゴミが格納
0x8049730:   0x40150cd0   0x40150cd0
(gdb) x/2xw z                        // z の値、まだ生きている
0x8049740:   0x080485ea   0x00000000
(gdb) next 1                         // ここで 0x40150cd0 へのアクセスを free() ライブラリでやってしまう!!!

Program received signal SIGSEGV, Segmentation fault.
0x4009eff0 in __libc_free (mem=0x40150cd0) at malloc.c:3155
3155  malloc.c: No such file or directory.
    in malloc.c
(gdb) x/2xw p                        // おまけに p の値が 0x40150cd0 から 0x40150cc8 にかわっている。
0x40150cc8 <main_arena+8>:   0x08049748   0x40150cc0
(gdb) quit
The program is running. Exit anyway? (y or n) y
www2[Wed]$

//
// ここまで
//

さの さん 2004年 09月 28日 22時 42分 34秒
URL:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/setsecuritydescriptor_method_in_class_win32_logicalfilesecuritysetting.asp

<フォルダのセキュリティ属性の複写>

 以前質問した件ですが、上記のソースでできるようでした。

 また不明点などありましたら、質問させていただきます。
 

ばんのしゃーによかばんた さん 2004年 09月 28日 20時 23分 39秒

>いりや さん 2004年 03月 28日 11時 32分 54秒
>om さん、むたぐちさん、
>| フォルダC:\AAAAフォルダ下にあるファイルと
>| フォルダC:\BBBBフォルダ下にあるファイルを
>| ファイル名で比較し、一致するファイル名が存在するか
>| しないかを判別できるようなコードがわかれば教えて下さい。

の件に関し、

いりや さんの
>JScript 言語での別解を用意してみました。
>スクリプトを file.js に保存します。
※[1]
のソースは、ちょっと見て理解出来なかったのですが、
漸くやってることが分かるようになりました。
こういう遣り方ってJScript/JavaScriptでは普通なんでしょうか。

しかし、分かって見ると、性能が悪そうです。
そこで比較してみました。

>管理人むたぐち さん 2004年 03月 28日 00時 37分 08秒
>関数を書いてみました。
※[2]
Scripting.Dictionaryを使うものですが、
C:\AAAAフォルダ下にあるファイルをAddして、
C:\BBBBフォルダ下にあるファイル名でExistsして、
同ファイル名をカウントするようにちょっと手直ししました。

>管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 11月 07日 02時 07分 04秒
>To: ひっし さん
>こんなんどうですかあ?
>ファイル名のチェックだけで、ファイルの中身まではチェックしてませんし
※[3]
fso.FileExistsを使うものですが、
同ファイル名をカウントするようにちょっと手直ししました。

3者で、同じC:\Windows\System32とC:\Windows\System32を比較すると、
[1]16.7sec
[2]5.2sec
[3]3.8sec
でした。

なんか、凝った作りにするほど、性能が悪くなるみたいです。
やっぱり、Simple is best.

[1]はarrayを繰り返し走査するので、n*m=n**2のorder
[2]はn+m=2nのorder
[3]はnのorder

因みに、
>ばんのしゃーによかばんた さん 2004年 05月 02日 19時 30分 19秒
>Set oExec=wShell.Exec("cmd.exe /c for %0 in ( C:\AAAA\*.* ) do if exist C:\BBBB\%~nx0 echo %0")
[4]2.3sec
ちょっと速い。

>ばんのしゃーによかばんた さん 2004年 05月 08日 20時 09分 23秒
>Set oExec=wShell.Exec("cmd.exe /c dir /b C:\AAAA\*.* C:\BBBB\*.* |sort|uniq -d")
[5]0.6sec
えらく速い。ディレクトリアクセスがシーケンシャルリードっぽくなるのかな。
unix流も捨て難いですね。

いりや さん 2004年 09月 28日 11時 30分 32秒

ここ最近いろいろと忙しく掲示板の記事にほとんど追従できていま
せんが、三つばかし小話を。

1. JScript のライブラリを WiLiKi に掲載

http://iriyak.adam.ne.jp/wiliki/uwsc.cgi?iriyak%3aJScript%3aLibrary&l=jp

一度ご連絡をしました JScript のライブラリが少し増えました。

Smalltalk のクラスライブラリのポーティングの他に Windows
Script Host に特化したものも作成しています。

ScriptEngineSwitcher : スクリプトを実行するスクリプトエンジ
ン (wscript.exe, cscript.exe) を切り替えを引き受けるオブジェ
クト

Benchmark: ベンチマークをとってレポートを得るまでの枠組みを
提供するオブジェクト

Clipboard : クリップボードへのアクセスを提供するオブジェクト


2. WScript.sleep() の引数の有効な最小値

http://iriyak.adam.ne.jp/wiliki/uwsc.cgi?iriyak%3aJScript%3aWScript.sleep%a5%e1%a5%bd%a5%c3%a5%c9%a4%ce%b0%fa%bf%f4%a4%ce%ba%c7%be%ae%c3%cd&l=jp

どうやら 10 ミリ秒未満は NG のようです。


3. Smalltalk Object>>perform: のポーティング

http://iriyak.adam.ne.jp/wiliki/uwsc.cgi?iriyak%3aJScript%3aObject%3e%3eperform%a5%e1%a5%bd%a5%c3%a5%c9%a4%ce%ca%fd%bc%b0%b8%a1%c6%a4&l=jp

Smalltalk の Object>>perform: (Lisp でいうところの apply や
call) を JScript にどうポーティングするかベンチマークを取り
ながら進めました。

Benchmark オブジェクトを使うと試験シナリオの構築や試験操作の
繰り返しも簡単にできました。

いりや

ばんのしゃーによかばんた さん 2004年 09月 28日 11時 20分 25秒

>ろく さん 2004年 09月 24日 12時 57分 13秒
>簡略化していった結果のソースは下記なのですがこれがローカルにおいて
>実行する分には問題ない(メモ帳が開く)のですがネットワーク上において
>ブラウザから読み込んで実行するとエラーになってしまいます。

インターネットオプションのセキュリティタブのイントラネットゾーンの
セキュリティレベルを思いっきり下げると動くのではないでしょうか。

※※※

ただし、私は、セキュリティレベルを下げることや、
HTMLファイルでスクリプトを使うことには反対です。
マイコンピュータゾーンのセキュリティレベルを上げてるくらいです。
おかげでセキュリティダイアログのうるさいこと。:-(
ヘルプくらいセキュリティダイアログ出さずに使わせて欲しいものです。:-<

※※※

皆さんはインターネットからローカルディスクに保存したHTMLファイルを
どうしてます?
私は、マイコンピュータゾーンのセキュリティレベルを上げるだけでなく、
セキュリティダイアログが出たら、VBScriptで<script>〜</script>類を
削除して、セキュリティダイアログが出なくなるのを確認します。
スクリプトが何をしてるか、いちいちソースを確認してられませんからね。
これって、心配し過ぎでしょうか。

※※※

スクリプトなどの機能がないブラウザはないのでしょうか。
さらに、保存するときにスクリプト類を削除してくれるともっとよい。
こういう安全なブラウザのニーズは結構あると思うのですが。。。

ばんのしゃーによかばんた さん 2004年 09月 28日 11時 19分 32秒

>toraneko さん 2004年 09月 27日 17時 01分 44秒
>HTTPスクリプトとして表示されないものなので
>WEBページのソースを表示させて、名前をつけて保存という処理という方法を
>とっております。

??? HTTPスクリプトとして表示されない ???

どういうことか分かりませんが、一度このViewHTML.VBSを験してみて、
もし、そのNotePadに表示されたものでよければ、よし。
もし、不足なら、以下の記事を参照。view-sourceをファイルに保存します。

>ばんのしゃーによかばんた さん 2004年 07月 31日 17時 05分 50秒
>修正です。
>>ばんのしゃーによかばんた さん 2004年 07月 28日 17時 51分 19秒
>>これだけだと、NotePadが開きますので、view-sourceの設定を変更します。

ばんのしゃーによかばんた さん 2004年 09月 27日 17時 11分 15秒

あまり役に立たない情報ですが、
.VBS の TypeName(Me) は VBScriptTypeInfo
.JS の typeof(this) は object
です。

そのメンバは、
WSH
WScript

.WSFではそれに加えて、
getResource
createScriptlet
createComponent

createScriptletはヘルプにはないようです。createComponentのobsolete?

<job>
<script language=jscript>
for(var m in this){
WScript.Echo(m);
}
</script>
</job>

ばんのしゃーによかばんた さん 2004年 09月 27日 17時 10分 44秒

>ばんのしゃーによかばんた さん 2004年 09月 25日 17時 15分 05秒
>>XP使用中にセキュリティダイアログが定期的に出ます。
>ALT+TABでタスク切り替えダイアログを出すと、
>名前はInternet Explorerだけど、アイコンがアプリのになっているので、
>それで判別できますね

アイコンが分からないときもあります。

そういうときは、タスクマネジャを表示しておいて、セキュリティダイアログを
上下左右に揺さ振ります。再描画のためか、CPU使用率が変動します。
うーん、なんか原始的ですね。

toraneko さん 2004年 09月 27日 17時 01分 44秒

9月7日に書き込みをしましたToranekoです。
お世話になっております。
以前こちらで教えていただいた通り行ってみて、
以前よりはエラーがなくなりました。
有難うございました。(たまーにエラーなんですが・・・)

ばんのしゃーによかばんたさん。
レス有難うございます。
HTTPスクリプトとして表示されないものなので
WEBページのソースを表示させて、名前をつけて保存という処理という方法を
とっております。

また、質問するかと思いますので宜しくお願いいたします。

まちゃ! さん 2004年 09月 26日 21時 08分 29秒

9月17日に書き込みしました まちゃ!です。

質問事項がとりあえず解決しましたので、報告いたします。

Dim wshshell
Set wshshell=createobject("wscript.shell")
wshshell.run "C:\ABC\アプリ名.exe"

でアプリを起動させ、Sleep でタイミングを見計らいながら SendKey で
アプリを操作することにしました。

また分からないことが出たら質問させて下さい。

nic さん 2004年 09月 26日 18時 32分 48秒

>>魔界の仮面弁士さん
ご指摘ありがとうございます。
1から3の内容にしたがってみましたが、class factoryは
要求されたクラスを提供できない、といわれてしまいます。

<script language=VBScript>
<!--
Dim WSH
Set WSH = CreateObject("WScript.Shell")
Sub exBtn_OnClick
WSH.Run """1.exe"""
End Sub


-->
</script>
<P><input type=button name=exBtn value=ヘルプ形式で見る STYLE="BORDER-STYLE:solid;BORDER-WIDTH:1px;BORDER-COLOR:WHITE;COLOR:white;BACKGROUND:#0080FF"></P>

魔界の仮面弁士 さん 2004年 09月 26日 17時 45分 46秒

》 nic さん
実験可能な環境が無いので、とりあえず気になった点だけ。

1. script要素の終了タグが書かれていません。
2. input要素の最後の「>」がありません。
3. </P>が書かれていますが、対応する<P>が見当たりません。

nic さん 2004年 09月 25日 23時 00分 21秒

すいません。途中書き込みしてしまいました。

このスクリプトを改良して、動作できるように
できないでしょうか?

nic さん 2004年 09月 25日 22時 58分 43秒

はじめまして。HTAを起動し、そこからEXEを起動ることに何とか成功した
のですが、最近出たWSH 5.6.0.8825 (http://www.microsoft.com/downloads/details.aspx?FamilyID=c717d943-7e4b-4622-86eb-95a22b832caa&DisplayLang=ja)

をインストールすると、起動できなくなりました。
具体的には、HTAを起動すると「XX行目にエラーあり」といわれて
うまく動作しなくなってしまいました。
その問題あるスクリプト部分は以下の通りです。

<script language=VBScript>
<!--
Dim WSH
Set WSH = CreateObject("WScript.Shell")
Sub exBtn_OnClick
WSH.Run """1.exe"""
End Sub


-->
<input type=button name=exBtn value=ヘルプ形式で見る STYLE="BORDER-STYLE:solid;BORDER-WIDTH:1px;BORDER-COLOR:WHITE;COLOR:white;BACKGROUND:#0080FF"</P>

windows2000SP4を使用しています。

ばんのしゃーによかばんた さん 2004年 09月 25日 17時 16分 01秒

>魔界の仮面弁士 さん 2004年 02月 25日 11時 09分 23秒
>》 いりや さん
>> エラー「ウィンドウハンドルが無効です。」と。なんでやねん。。
>うーむ。何故でしょうね。
>投稿された monitor.js を試してみましたが、問題なく Terminate されました。

追試しました。

エラー: ウィンドウ ハンドルが無効です。
コード: 80070578

当初はエラー続きでしたが、あるときからはエラーが出なくなりました。
その逆もありました。

この振る舞いは、どうも、誰かがメモリのゴミを見ているようですね。

きっと例の原則を守っていないひとがいるのでしょう。
「自己証明的プログラミング」(「〜のはず」をプログラム上でチェック)
「変数は常に(変数の意味どおりの)正しい値を持たせよ」

確実な再現性はありませんが、

>[ A.js, B.js ]
>while (true) {
>    WScript.sleep(1);
>}
だと、発生し易く、

[ A.js, B.js ]
WScript.Echo("!");

だと、発生し難い、という傾向があるようです。

ばんのしゃーによかばんた さん 2004年 09月 25日 17時 15分 05秒

>ばんのしゃーによかばんた さん 2004年 09月 10日 19時 25分 05秒
>XP使用中にセキュリティダイアログが定期的に出ます。
>Internet Explorer
>ActiveXコントロールやプラグインなどのソフトウェアを実行できるよう
>にしますか?
>はい(Y) いいえ(N)

簡易な調べ方。

ALT+TABでタスク切り替えダイアログを出すと、
名前はInternet Explorerだけど、アイコンがアプリのになっているので、
それで判別できますね。

ばんのしゃーによかばんた さん 2004年 09月 24日 16時 55分 25秒

>えどや さん 2004年 09月 18日 20時 37分 52秒
>win2000serverのIIS(ASP)でbatを実行し、
>そのbat中からvbs(or wsf)を実行したいのですが
>うまく実行できません。というより実行されません。
>bat自体は動作しているようです。
>タスクマネージャでみると、wscript.exeが残りっぱなしとなります。

IISは、知りませんが、

>c:\WINNT\system32\wscript.exe "D:\project\aaa.wsf"



c:\WINNT\system32\cscript.exe "D:\project\aaa.wsf" 2>&1 > D:\project\hello2.txt

のように変えて実行することで、もしエラーがあれば、ファイルに出るでしょうから、
原因が特定できるかもしれません。

ばんのしゃーによかばんた さん 2004年 09月 24日 16時 54分 32秒

>てんちゃん さん 2004年 09月 22日 19時 16分 48秒
>以下のソースで処理を行うと、writeline後err.numberが500になります。

それは、どうでしょう。
「writeline後に見たら、既にerr.numberが500になっていた。」
ということではありますまいか。

writelineの前から、500になっていた可能性を排除するには、
writelineの直前にerr.clearまたはon error resume nextを入れる必要があります。

それより何より、writelineより前のfunction/sub内に、on error resume nextがないと、
エラーが捕捉できないですよね。

想像するに、メインルーチンに、on error resume nextの記述があって、
そのどこかで、500のエラーが起こっているのではありますまいか。

そのon error resume nextを削除してやれば、500の原因が分かるでしょう。

ばんのしゃーによかばんた さん 2004年 09月 24日 16時 53分 31秒

>いりや さん 2004年 08月 25日 02時 55分 23秒
>Smalltalk with Style という Smalltalk 言語のプログラミング・スタイルを説
>く本があるのですが、今回の配列を操作するときの指針が紹介されていました。
>// ここから
>Guideline 100
ここ、↑この数字

そうなんですよね。ちょっと、指針集を作ると、すぐ、100を超えて、
とても覚え切れなくなります。また、それだけ多くなると、具体的な場面で、
ある指針は右と言い、別の指針は左と言ったりして、使えません。
で、私は作るのも使うのも諦めました。

それで、原則を絞りました。
ひとつは、先日の「自己証明的プログラミング」。
もうひとつは、「変数は常に(変数の意味どおりの)正しい値を持たせよ」です。

△案
for(pTable=anchor;pTable;pTable=next){
next=pTable->next;
free(pTable);
}
anchor=NULL;

ループ処理中、anchorは解放済メモリの不正な値を持ちます。
原則は、こういうタイミングが発生することを嫌います。

で、私の推奨する○案は、
while(anchor){
pTable=anchor;
anchor=anchor->next;
free(pTable);
}

anchorは常に正しい値を持ちます。

さて、×案ですが、
for(pTable=anchor;pTable;pTable=pTable->next){
free(pTable);
}

なぜ、障害なのに、発現しにくいか。メモリを解放しても、多くの場合、そのページは
まだ使われているので、解放されず、アクセスできるからです。
たまたま、ページが空になると、ページが解放される。そこをアクセスすると、
ページ変換例外が起きて障害が露見する。
したがって、マルチスレッドでなくても起こる。
しかし、マルチスレッドならもっと悲惨なことが起こる。所謂、メモリ破壊障害。

--------------------------------------------------------------------------------
>ばんのしゃーによかばんた さん 2004年 06月 24日 21時 00分 11秒
>>        if (onQuit) {
>>            // onQuit が d および d に付随する資源を解放する引き金とする。
>>            // d は InternetExplorer.Application オブジェクトなので quit()
>>            // メソッドを明示して呼ばないと対象ウインドウ (外部資源) を解放
>>            // しない。そのため、wscript.exe 処理系の実行を終了する前に、
>>            // quit() メソッドを呼び、資源の解放を依頼する。
>>            d.quit();
>>            WScript.quit();
>>        }
>>    }
>>}
>>
>>function Dialog_OnQuit() {
>>    onQuit = true;
>>}

の件も、最初から、
>IEをGUI(X buttonなど)でQuitした後で、またd.quit()してエラーになりそう。
と、思ったわけではなく、この障害発生シーケンスは後から探したのでした。

では、何が先かと言うと、onQuitの意味(定義)が変。ということです。

原則「変数は常に正しい値を持たせよ」から、まず、指針「変数の意味を定義せよ」
が派生します。onQuitの意味は、前のほうでは、to quit all(ie and wscript)
なのに、後のほうでは、ie quitedです。
これは、指針「ひとつの変数に複数の意味を持たせてはならない」に反します。
この指針も特に明文化せずとも、原則から派生します。
これら、原則から派生する個々の指針は覚える必要はありません。

ここで、意味を英語にしているのは、日本語だと曖昧になりがちだからです。
例えば、「終了指示フラグ」なんて書きそうですが、こんなのは意味不明です。
そのまま変数名にし易いし。

原則に照らして、堅実に修正すると、

if (to_quit_all) {
    if (! ie_quited) d.quit();
    WScript.quit();

function Dialog_OnQuit() {
    ie_quited = true;
to_quit_all = true;

var onClickHandler_cmdCancel = function () {
    to_quit_all = true;

といったところでしょうか。※先のtristateはちょっと技巧的でした。

また、テストでこの障害を検出するのは、タイミング障害なので、難しいです。

このように、少数の原則に注力することで、最大の品質が得られます。お験しください。

ろく さん 2004年 09月 24日 12時 57分 13秒

自分なりには色々試してみたつもりなのですがどうにもならず
WEBを探してもヒントが見つからないのでご質問させて頂くことにしました。
(検索のキーワードが悪いのかもしれませんが...)

*.HTMLファイル内に書いたVBScriptから他の*.VBSファイルを実行しようと
してたのですがどうにもならず、仕方なく少しずつ余分な部分を削って
いったらひとつ困ったことになってしまいました。

簡略化していった結果のソースは下記なのですがこれがローカルにおいて
実行する分には問題ない(メモ帳が開く)のですがネットワーク上において
ブラウザから読み込んで実行するとエラーになってしまいます。

出来上がったものはネットワークフォルダに置いてどのPCからでも使える
ようにしておきたいのでどうにか解決の方法がありませんでしょうか?
ヒントでも結構なので何方かご存知の方がいましたら宜しくお願いします。

PS.関係ないかもしれませんが...
  目的のネットワークフォルダにネットワークドライブを割り当てたり
  逆に割り当てを削除したりもしてみたのですがどちらもダメでした。

<html><head>
<meta http-equiv=Content-Type content=text/html; charset=shift_jis>
<script language=VBScript>
<!--
Sub Run_onClick
Set WSHShell = CreateObject("WScript.Shell")
WSHShell.Run("notepad.exe")
End Sub
-->
</script>
<title>たのむよ...</title>
</head><body>
<input type="button" name="run" value="実行"><div>
</body></html>

ちゃっぴ さん 2004年 09月 23日 00時 18分 33秒

> Micky さん (miki_yokohata@lasata.com.au)
> 2004年 09月 22日 18時 25分 12秒

> "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
> \SharedDLLs"の中にあるエントリーが存在するかを調べたい場合、
> どうすればいいですか?

RegReadメソッドでエラーになるかどうかで調べられると思います。

てんちゃん さん 2004年 09月 22日 19時 16分 48秒

初めて投稿します。

VBSで関数を作ったのですが、不思議な現象が起こりました。
以下のソースで処理を行うと、writeline後err.numberが500になります。
これが正しいのかわかりませんが、ちゃんと書き込まれています。
どこかおかしい点があるのでしょうか?
よろしくお願いします。

function arraytofile(array_data(),str_file_name)
Dim obJ_FSO: Set obj_FSO = CreateObject("Scripting.FileSystemObject")
set file_write = obj_fso.opentextfile(str_file_name,2,true)
dim i: i=0
dim j
if isarray(array_data) = true then
j = ubound(array_data)
if j=0 then exit function
for i = 0 to j
file_write.writeline array_data(i)
wscript.echo err.number
next
file_write.close
end if
end function

Micky さん (miki_yokohata@lasata.com.au) 2004年 09月 22日 18時 25分 12秒

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs"の中にあるエントリーが存在するかを調べたい場合、どうすればいいですか?

ちゃっぴ さん 2004年 09月 20日 19時 44分 44秒

はじめまして、ちゃっぴです。

WshShellオブジェクトにRegReadメソッドがありますが、
これで"\"が含まれたキーを指定するにはどうしたらよいでしょうか?

Const PRINTERPORT_REGPATH As String _
= "HKCU\Software\Microsoft\Windows NT" _
   & "\CurrentVersion\PrinterPorts"

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

strPrtPort = wshShell.RegRead(PRINTERPORT_REGPATH _
& "\" & "\\192.168.1.10\Brother MFC-5200J Printer")

これだとエラーになります。
エスケープ文字等あるのでしょうか?

えどや さん 2004年 09月 18日 20時 37分 52秒

はじめまして。えどやと申します。
場違いな質問かもしれませんが、
ご存知の方いらっしゃいましたら教えていただけますでしょうか?

win2000serverのIIS(ASP)でbatを実行し、
そのbat中からvbs(or wsf)を実行したいのですが
うまく実行できません。というより実行されません。
bat自体は動作しているようです。
タスクマネージャでみると、wscript.exeが残りっぱなしとなります。

記述(指定)がおかしい、これでは駄目等ありましたら
ご意見を賜りたいと思います。

サーバ環境:
Microsoft Windows 2000 5.00.21.95
Service Pack 4


■[bat]中には以下2行を記述してあります。
-----------------------------------------
dir > D:\project\hello.txt
c:\WINNT\system32\wscript.exe "D:\project\aaa.wsf"


■[aaa.wsf]中は以下のように記述してあります。
-----------------------------------------
<job id="default">
<script language="VBScript">
call aaa()
sub aaa()
Dim obj, fl
Set obj = CreateObject("Scripting.FileSystemObject")
set fl = obj.OpenTextFile("D:\project\aaa.txt", 8, true)
fl.WriteLine "--------------------"
fl.WriteLine now
fl.Close
end sub
</script>
</job>

ばんのしゃーによかばんた さん 2004年 09月 17日 20時 22分 54秒

>ばんのしゃーによかばんた さん 2004年 08月 16日 18時 16分 49秒
>>魔界の仮面弁士 さん 2004年 08月 14日 20時 40分 11秒
>>body から parentNode/parentElement で辿る以外の手法としては、
>> Set objHtml = IE.document.documentElement
>そんな便利なのがあるとは、知りませんでした。これからは、これを使わせて頂きます。

なんて言ってましたが、

>ばんのしゃーによかばんた さん 2004年 06月 09日 14時 20分 57秒
>「DHTMLEditコントロール」は、
>で聞いていたので、試してみたのですが、
>Document.Title="bbbb"
>とすると、
>documentElement.outerHTMLは変わるのですが、
>DocumentHTMLとSaveDocumentは変わらないので、IEと同じで駄目、
>と早合点していました

で使っていながら、気付いてなかったのでした。:-p

さて、

>toraneko さん 2004年 09月 07日 11時 59分 02秒
>Notesスクリプト上からWSHスクリプトを起動し処理を行ってますが不安定です。
>WEBページのソースを表示させて、名前をつけて保存という処理なのですが、
>Notesにて自動処理で動いている際に最初から失敗(名前をつけて保存ダイアログで停止)したり、
>何度か動いて失敗したりしております。

の件ですが、アクティブな(i.e.メモリ上の)HTMLソースでは駄目なんでしょうか。

>ばんのしゃーによかばんた さん 2004年 08月 14日 17時 22分 01秒
>サンプル
>アクティブな(i.e.メモリ上の)HTMLソースを表示するコンテクストメニュー拡張です。

のVBS版です。
documentElement.outerHTML

shell.windows.item
を使ってます。
お気に入りやリンクから起動します。

---ViewHTML.VBS---
Option Explicit
Dim fso
Dim wShell
Dim Shell
Dim ie
Dim File
Dim TempName

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Set Shell=CreateObject("Shell.Application")

Set ie=Shell.Windows.Item
If ie Is Nothing Then
WScript.Echo "No IE Found."
WScript.Quit
End If
If TypeName(ie.Document)<>"HTMLDocument" Then
WScript.Echo "IE is not active."
WScript.Quit
End If

TempName=fso.BuildPath(fso.GetSpecialFolder(2).Path,fso.GetTempName())
Set File=fso.CreateTextFile(TempName)
File.Write ie.Document.documentElement.outerHTML
File.Close
Call wShell.Run("NotePad.Exe " & TempName,,True)
fso.DeleteFile TempName

toraneko さんの用途では、
最後の2行を削除すれば、ファイル保存になります。
命名方法は適宜変更。
Notesから単にこれを起動すればよいでしょう。

ばんのしゃーによかばんた さん 2004年 09月 17日 20時 21分 58秒

>りぐりぐ さん 2004年 09月 02日 18時 40分 56秒
>Webの動作確認用スクリプトの作成を行っております。
>実際人が確認するような動きをスクリプトで実現したいと思い
>(ボタンをクリック、文字を入力して検索等)、Sendkeysで作成に取り掛かりました。
>その中でリンクをクリックした際、別ウィンドウが開く時があります。
>IEオブジェクトを取得して確認して、そのオブジェクト上で確認作用の実現を考えて
>おりますが(テキストを取得したり、Busyで同期を取る等)、
>別ウィンドウが開いた時、そのウィンドウはWSHの制御下でなくなってしまいます。
>制御をそのウィンドウに移す事、若しくはその他の良い方法等がありましたら、
>ご指導頂けないでしょうか?

別ウィンドウが開く動作をお望みですか。
開かないほうが制御しやすいのではありますまいか。

Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
ie.Navigate "〜"
Do While ie.Busy Or ie.ReadyState<>4
: WScript.Sleep 100
Loop
Do While TypeName(ie)="IWebBrowser2"
: WScript.Sleep 100
Loop

Sub IE_DocumentComplete(pDisp,URL)
For Each a In ie.document.all
: If a.getAttribute("target")<>"" Then a.removeAttribute("target")
Next
End Sub

※当然ながら、target属性以外の方法には、効きません。

ばんのしゃーによかばんた さん 2004年 09月 17日 18時 15分 59秒

>ばんのしゃーによかばんた さん 2004年 09月 10日 19時 25分 05秒
>XP使用中にセキュリティダイアログが定期的に出ます。
>Internet Explorer
>ActiveXコントロールやプラグインなどのソフトウェアを実行できるよう
>にしますか?
>はい(Y) いいえ(N)

「誰が」「何を」使おうとしているのか、この二つがセキュリティで決定的に重要なのに、
このセキュリティダイアログには、どちらもない。一体何を考えているのでしょうね。:-<

>管理人むたぐち さん 2004年 09月 13日 18時 24分 23秒
>IEのActiveXコントロール使用時の確認ダイアログの内容って、イベントビューアでは
>見られないんでしたっけね。

イベントビューアを覗いてみましたが、それらしいものはありませんでした。
何か設定が必要なのでしょうか。
セキュリティの根幹であるAudit Trailに、もしセキュリティダイアログが残らないとしたら、
これまた、一体何を考えているのでしょうね。:-<

今回は、たまたまDLL名から分かりましたが、一般には、どうするのでしょう。
ウィンドウのハンドルからプロセスを調べるのかな。API使って。それも大変。:-<

まちゃ! さん 2004年 09月 17日 17時 19分 57秒

はじめまして。作業の効率化のためWSH(VBS)を始める者です。
教えていただきたいことができ、検索サイトでここを見つけました。


複数のファイルに対し一括して同じ処理をしたいと思っています。
やりたい処理はアプリに対しメソッドを送って、
 1)ファイルを開き
 2)編集し
 3)別名で保存する
です。これを特定フォルダー内の全てのファイルに処理してやりたいのです。

業務用の特殊なアプリなのでフォルダー名やアプリ名は書けませんので、
 アプリ: C:\ABC\アプリ名.exe
 作業フォルダー: C:\ABC\作業フォルダー
と表記させて下さい。(わがまま言ってすいません)

次のソースを実行すると3行目で
 「オブジェクトでサポートされていないプロパティまたはメソッドです。:'exec'」
というエラーになります。

Dim wshshell,appli,pid
Set wshshell=createobject("wscript.shell")
set appli=wshshell.exec("C:\ABC\アプリ名.exe")
pid=appli.programid
msgbox pid
(※4,5行目は実行状況の確認のためにあります)

アプリを起動させるだけなら

Dim wshshell
Set wshshell=createobject("wscript.shell")
wshshell.run "C:\ABC\アプリ名.exe"

で成功したのですが、このソースを見るとアプリを起動しただけで
その後WSHで操作できない感じがします。素人判断ですが。。。

それと、もう一点。
このアプリはカレントが作業フォルダーになっていないとうまく作動しないみたいなので、
バッチファイルなら、

cd C:\ABC\作業フォルダー
C:\ABC\アプリ名.exe

と書く処理も必要となります。
今はまだテスト中なので作業フォルダーにVBSファイルを直接置いています。
過去ログにDOSのプログラムの実行をJScriptで行うソースファイルを見つけましたが、
JAVAが分からないので、ちょっと参考になりませんでした。


OSはWin2000です。どうかよろしくお願いいたします。

さの さん 2004年 09月 17日 16時 00分 26秒

たびたび申し訳ありません。
質問があります。

フォルダのセキュリティ属性を複写する方法を
ご存知の方はおられるでしょうか?

考えていることは、
C:\testFolder\aa
C:\testFolder\bb
C:\testFolder\dd
というフォルダ構成のtestFolder\aaというフォルダのみを
移動先の D:\moveFolder の下に
D:\moveFolder\testFolder\aa
というような形式でセキュリティ属性込みで
複写したいと思っています。

最初はXCOPYで考えていましたが、
XCOPY C:\testFolder\aa D:\moveFolder\testFolder\aa /T /K /X
だと複写できません。

XCOPY C:\testFolder D:\moveFolder\testFolder\aa /T /K /X
ですと、
D:\moveFolder\testFolder\aa
D:\moveFolder\testFolder\bb
D:\moveFolder\testFolder\dd
上記のようにほかのフォルダまで複写されてしまいます。

WSH等でよい方法がありましたらお教えください。

環境は Windows2000Serverで、WSH 5.6 です。

さの さん 2004年 09月 17日 15時 32分 22秒

>いりやさん
 補足説明ありがとうございました。
 JScriptだと、こんな風に記述するんですね。

くじら さん (djm_mk9@jupiter.livedoor.com) 2004年 09月 17日 01時 36分 56秒

To:いりや さん

貴重な情報ありがとうございます。
早速確認に行ってきます。

あんのうん さん 2004年 09月 16日 13時 01分 47秒

To: たるら さん

メッセンジャーサービスが動いているPC(WindowsNT,2000,XP)に対してで
あれば、net send コマンドでメッセージを送る事はできます。
たしか、WinPopupも互換性があるので、WinPopupが立ち上がっていれば
Windows95,98等であっても問題なかったような、、
但し、IPアドレス指定ではなくNETBIOS名指定です。

また、各クライアントにIPメッセンジャー(フリーソフト)等が導入すれば
サーバからスクリプトでメッセージを送る事もできます。

------------net send コマンドを使ったサンプル----------------
Option Explicit
Dim Wshell
Dim Message,MachineName

MachineName = InputBox("マシン名を入力して下さい")
If MachineName = "" Then
MsgBox("マシン名が入力されていません")
WScript.Quit
End If
Message = InputBox("メッセージを入力して下さい")
If Message = "" Then
MsgBox("メッセージが入力されていません")
WScript.Quit
End If
Set WShell = CreateObject("WScript.Shell")
WShell.Run "net send " & MachineName & " """ & Message & """",0,True
Set WShell = Nothing

------------IPメッセンジャーを使ったサンプル----------------
Option Explicit
const C_IPMSG_PATH = "C:\Progra~1\ipmsg147\ipmsg.exe"
Dim Wshell
Dim Message,MachineIP

MachineIP = InputBox("IPアドレスを入力して下さい")
If MachineIP = "" Then
MsgBox("IPアドレスが入力されていません")
WScript.Quit
End If
Message = InputBox("メッセージを入力して下さい")
If Message = "" Then
MsgBox("メッセージが入力されていません")
WScript.Quit
End If
Set WShell = CreateObject("WScript.Shell")
WShell.Run C_IPMSG_PATH & " /MSG /SEAL " & MachineIP & " " & Message ,0,True
Set WShell = Nothing

いりや さん 2004年 09月 16日 11時 31分 51秒

くじらさん、

Windows Script Host ではありませんが UWSC と DLL を使った例
がこちらに紹介されています。

清水さん, USB/PCMCIAデバイスの切り離し
http://park14.wakwak.com/~simizu/cgi-bin/uwscbbs2/cocoqa.cgi?log=42

また、山本 幸一さんがアプリケーションとして UnplugDrive を公
開されていらっしゃいます。デスクトップのコンテクストメニュー
から実行できるということは FolderItem の invokeVerb() メソッ
ドが利用できるということですから、WSH + UnplugDrive で連携動
作させる可能性はあるかもしれません。

山本 幸一さん, UnplugDrive
http://homepage3.nifty.com/yamakox/Others/UnplugDrive.html

Return