管理人むたぐち さん 2004年 04月 10日 18時 42分 08秒

To: ばんのしゃーによかばんた さん

私は、
Set fo=fso.GetFile(filename)
On Error Resume Next
fo.Name=newName
'++++++++++++++++++++
If Err=58 Then
' 同名ファイルがあったときの処理
ElseIf Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
End If
'++++++++++++++++++++
On Error GoTo 0

のような書き方をよくするのですが、これがまずい理由が
いまひとつよくわかりません。
エラー発生が起こりうる行、fo.Name=newNameに対するエラーは、
On Error Resume Next〜On Error Goto 0の間で処理できている
ように思えるのですが。
わざわざSubプロシージャ内で実行する理由はあるんでしょうか?

ばんのしゃーによかばんた さん 2004年 04月 10日 16時 13分 29秒

On Error Resume Nextの正しい使い方について、

よく、On Error Resume Nextを先頭に置いたスクリプトを見かけますが、
Option Explicitをスクリプトの先頭に置くような感覚で、
「適当にエラーをリカバるオプション」のように誤解しているのではないでしょうか。

その意味するところは、
「エラーがあっても無視して、どうなってもいいから暴走しろ」ですから、
そんな、自暴自棄に走らなくても、と思ってしまいます。

では、どう書くのが正しく、安全か、というと、

例えば、リネーム、
Set fo=fso.GetFile(filename)
fo.Name=newName
は、同じ名前があるとエラーになります。

そこで、まず、
Set fo=fso.GetFile(filename)
Sub Rename(fo,newName)
On Error Resume Next
fo.Name=newName
End Sub
Call Rename(fo,newName)
If Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
End If
と変えて、Err.Numberを調べます。すると、58と分かります。

最終的に、
Set fo=fso.GetFile(filename)
Sub Rename(fo,newName)
On Error Resume Next
fo.Name=newName
End Sub
Call Rename(fo,newName)
If Err=58 Then
' 同名ファイルがあったときの処理
ElseIf Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
' または Err.Raise Err.Number でも可。
End If
のようにします。

ポイントは、
エラーの想定される行だけに局限する。
想定されるエラーだけに局限する。

WSH2.0でOn Error GoTo 0が追加されましたが、要らんことです。

例えば、
Set fo=fso.GetFile(filename)
On Error Resume Next
fo.Name=newName
On Error GoTo 0
If Err<>0 Then
とすると、Err.Numberが分からなくなります。

また、
Set fo=fso.GetFile(filename)
On Error Resume Next
fo.Name=newName
'++++++++++++++++++++
If Err=58 Then
' 同名ファイルがあったときの処理
ElseIf Err<>0 Then
WScript.Echo Err.Number & " : " & Err.Description
WScript.Quit
End If
'++++++++++++++++++++
On Error GoTo 0
とすると、この区間でエラーを起こしても無視して暴走。

どちらももうひとつです。

また、もし、JScriptのtry catch風をVBScriptでもお望みの場合、

Sub Try()
' ここにtryのコード
End Sub
Sub Catch()
On Error Resume Next
Call Try()
End Sub
Call Catch()
If Err<>0 Then
' ここにcatchのコード
End If

で、似たようなことが出来ます。

でも、やっぱり、お勧めは最初に述べた通りです。

tall さん 2004年 04月 09日 15時 20分 26秒

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

> escape()/unescape()はJScriptのヘルプにだけ載っているため、
> VBScriptでは使えないと思われがちですが、
> 実際にはEscape()/UnEscape()はVBScriptにもちゃんとあって使えます。

確認しました。
有益な情報ありがとうございました。

ばんのしゃーによかばんた さん 2004年 04月 09日 13時 16分 37秒

> tall さん 2004年 04月 01日 01時 58分 05秒
> 置換文字列をユニコード番号で指定(検索語でいうと「\uxxxx」のような形)
> することはできるのでしょうか?

escape()/unescape()はJScriptのヘルプにだけ載っているため、
VBScriptでは使えないと思われがちですが、
実際にはEscape()/UnEscape()はVBScriptにもちゃんとあって使えます。

Escape("あいうえお")
UnEscape("%u3042%u3044%u3046%u3048%u304A")

詳細はJScriptのヘルプを参照。なんか変。

NAO さん 2004年 04月 08日 17時 30分 33秒

いつもお世話になっております。

Outlookのプロファイルへのサービスの追加を
WSHで自動化することが出来ないか、悩んでいます。

新しくOutlookをインストールした直後に社員番号だけを
入力させ、その番号をもとにOutlookの設定を自動で
行うようにしたいのです。

『企業/ワークグループ』用の設定でExchange Serverを
指定し、各種設定を行いたいのですが…。

OutlookのバージョンはOutlook2000です。
OSはWINDOWS2000です。

どうぞ宜しくお願いいたします。

なな さん 2004年 04月 08日 15時 52分 32秒

いりやさま

ありがとうございます、早速検証してみます。

いりや さん 2004年 04月 08日 15時 00分 02秒
URL:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/iadsuser_changepassword.asp

ななさん、

ChangePassword() メソッドの機能で実現できるようなできないような。。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/iadsuser_changepassword.asp

なな さん 2004年 04月 08日 14時 17分 56秒

初めまして、どうしてもわからないことがありますので質問させてください。

現在ADに登録をしているユーザーのパスワード変更を
行いたいと考えております。
ここで、ADSIを使用するとsetpasswordで変更できると思いますが
まず変更する前にOpenDSobjectでユーザーの旧パスワードを
確認してから行おうと思っているのですが変更した直後に
OpenDSobjectで変更前のパスワードを入力すると認証が通って
しまうのですが、これはどうしてでしょうか。
またこれを回避することはできないのでしょうか。
(変更したら旧パスワードでOpenDSobjectが通らないようにしたい)

ドメインに参加した端末のWinXPでVBSを作成し、
サーバ(2000サーバ)のADにアクセスしております。

ばんのしゃーによかばんた さん 2004年 04月 06日 19時 21分 36秒

AppActivateしても、タスクバーでピコ、ピコ、ピコと3回点滅するだけ。
また、
MsgBoxなどが、他のWindowに隠れて見えないことがある。
また、
最小化されていると、アプリにSendKeysが届きません。

ピコピコピコとMsgBoxが隠れる件は、

レジストリを変更する。
[HKEY_CURRENT_USER\Control Panel\Desktop]
"ForegroundFlashCount"=dword:00000003
"ForegroundLockTimeout"=dword:00030d40 (200000)
ForegroundLockTimeoutを0にします。TweakUIでも変更可。

または、
Set wShell=CreateObject("WScript.Shell")
wShell.Run "デスクトップの表示.SCF"
WScript.Sleep 100

自分の環境設定は前者、
他人の環境で動かすVBScriptは後者がよいでしょう。

因みに、「デスクトップの表示.SCF」と似てますが、
Set Shell=CreateObject("Shell.Application")
Shell.MinimizeAll
は、最小化してもFocusを放しません。うーん、しつこい奴。
「デスクトップの表示.SCF」はデスクトップにFocusが移って、Lockしないようです。

最小化のまま残るのが嫌なら、処理後、
Set Shell=CreateObject("Shell.Application")
Shell.UndoMinimizeAll
とすれば、「デスクトップの表示.SCF」を取り消すことができます。

最小化されたWindowの件は、以下。
Set wShell=CreateObject("WScript.Shell")
wShell.SendKeys "%( r)"

ここでは、わざと"%( r)"としています。
"% r"だとアプリに渡ったとき、rが受け取られるかも知れないので、
受け取りにくいように%を掛けておきます。
一般に^Cのように大文字をSendKeysすると、Shiftが付いて、受け取られなかったり、
異なる動作をすることが間々あるので、小文字を使います。
あ、それから、ついでですが、
wShellとVBAのSendKeysで日本語が送れないのは常識(?)ですが、
非常識(?)なことに、VBのSendKeysは日本語が送れます。

まとめて、サブルーチン化すると、

Sub Activate(title)
Set wShell=CreateObject("WScript.Shell")
wShell.Run "デスクトップの表示.SCF"
WScript.Sleep 100
wShell.AppActivate title
wShell.SendKeys "%( r)"
End Sub

Sub ForceMsgBox(text)
Set wShell=CreateObject("WScript.Shell")
wShell.Run "デスクトップの表示.SCF"
WScript.Sleep 100
MsgBox text
Set Shell=CreateObject("Shell.Application")
Shell.UndoMinimizeAll
End Sub

参考
"デスクトップの表示.SCF"の内容
----------------------------
[Shell]
Command=2
IconFile=explorer.exe,3

[Taskbar]
Command=ToggleDesktop
----------------------------
通常、Windows\SystemかWinNT\System32にある。Quick Launchにもある。

先に紹介した、WSHファイルのアイコンを変える方法で使用した、IconHandlerは
このSCFファイルのものでした。

管理人むたぐち さん 2004年 04月 06日 18時 53分 36秒

今更ですが、↑にGoogleの検索窓をつけてみました。
AKiOSさんの検索スクリプトの動作に支障が出るかどうか心配だったのですが、
特に問題は出ていないようです。

Wikiもだんだんと軌道に乗ってきているようですね。
たしかにこれだと、気軽にコンテンツをアップロードできます。
テクニック集やFAQ集は、1ページのサイズが巨大になりそうなので、
頃合を見て分割してみようかと思います。
Wikiにはアップローダーや簡易掲示板の機能まであるので、これも
そのうち利用してみようかと思っています。

あと、WikiのRSSが正常に出力されない問題を修正しました。

ばんのしゃーによかばんた さん 2004年 04月 05日 21時 55分 49秒

> じゅん さん 2004年 04月 05日 11時 18分 12秒

On Error Resume Next
Do While objIE.Visible
WScript.Sleep 1000
Loop
On Error GoTo 0
Msgbox "IE終了"
何かの処理
WScript.Quit

としてみては如何でしょうか。

因みに想定されるエラーは、
462 リモート サーバ マシンが存在しないか、利用できません。
です。Ummなんか変なメッセージですね。

ばんのしゃーによかばんた さん 2004年 04月 05日 20時 51分 49秒

CreateObjectで作ったShellオブジェクトを使ってプロパティなどをInvokeVerbすると、
スクリプトの終了と共にプロパティ表示が消えてしまいます。

InvokeVerbの処理は別スレッドで非同期に行われているが、
スクリプトの終了でプロセス空間が終了し、資源回収が走るのでしょう。

この問題を避けるには、既存のExplorer、または、なければ、新規に起こして、
別のShellオブジェクトを借りてInvokeVerbするとよい。

ただし、新規に起こしたExplorerのWindowが見えると、鬱陶しいので隠す。

wShell.Run "Explorer",0,True

For n=0 To 99
For Each Window In Shell.Windows
If InStr(TypeName(Window.Document),"IShellFolderViewDual")=1 Then
Set oShell=Window.Document.Application
Exit For
End If
Next
If Not IsEmpty(oShell) Then Exit For
WScript.Sleep 100
Next

wShell.Runの第2引数0でWindowを隠して起動する。Focusも移るのが少し難点。
第3引数Trueで待ち合わせているが、実体はDesktop Shellに引き継いで
復帰する。instanceは複数でも、プロセス空間は一つ。

スクリプトの終わりで隠しWindowを閉じる。

For Each Window In Shell.Windows
If Window.Visible=False Then
Window.Quit
End If
Next

Windowを閉じても、Desktop ShellはWindows終了(LogOut)まで終了しないので、
プロセス空間終了の資源回収が走ることもない。

ばんのしゃーによかばんた さん 2004年 04月 05日 20時 49分 43秒

ClipboardDataの続き、その3です。

最近は兎角物騒なので、「マイコンピュータ」ゾーンのセキュリティレベルも
高くしておかないと不安です。

しかし、そうするとクリップボードの定番ClipboardDataが動かなくなります。

そこで、
以下のようなセキュリティレベルに依存しないものを使っています。

SetData相当
Const OLECMDID_COPY = 12
Const OLECMDID_SELECTALL = 17 '(&H11)
Const OLECMDEXECOPT_DODEFAULT = 0
Dim ie
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.body.innerText="ほげほげ"
ie.ExecWB OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT
ie.ExecWB OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT
ie.Quit
Set ie=Nothing

GetData相当
Const OLECMDID_PASTE = 13
Const OLECMDEXECOPT_DODEFAULT = 0
Dim ie
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.document.write "<html><body><textarea id=txt></textarea></body></html>"
ie.document.all.txt.focus
Call ie.ExecWB(OLECMDID_PASTE,OLECMDEXECOPT_DODEFAULT)
WScript.Echo ie.document.all.txt.Value
ie.Quit
Set ie=Nothing

因みに、
WScript.Echo ie.Document.ExecCommand("Copy")
WScript.Echo ie.Document.ExecCommand("Paste")
はセキュリティレベルに依存して、成功/失敗をTrue/Falseで返します。

よしの さん 2004年 04月 05日 16時 53分 18秒

はじめまして。FileSystemObjectを使用した処理について質問させて下さい。
ネットワークドライブ接続したサーバにあるファイルの更新日が
取得したいのですが、
下記ソースだと、
filespec = ローカルのドライブのファイルなら取得できるのですが、
ネットワークドライブのファイルにすると、取得できません。
Set fso = CreateObject("Scripting.FileSystemObject")
IF fso.FileExists(filespec) THEN
Set f = fso.GetFile(filespec)
s = s & f.DateLastModified ''--- ファイル更新日
ELSE
s = s & "file not found"
END IF
ちなみにASPファイルサーバは、Windows2000Server(IIS5.0,ASP 3.0)で、
ネットワークドライブ先のサーバは、NT4.0(IIS4.0,ASP 2.0)です。

ドライブのプロパティを下記ソースで確認したところ、
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetDrive("H:\")
s = f.DriveLetter & "ドライブの状態:" & f.IsReady & "<BR>タイプ(3はNET):" & f.DriveType

IsReady=False、DriveType=3(ネットワークドライブ)となり、
ネットワークドライブの状態自体がまずいのかとも思います。
どのようにしたらよいのでしょうか?
宜しくご教授下さい。

いりや さん 2004年 04月 05日 16時 24分 24秒

To: じゅんさん

http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list93.shtml



93-17 管理人むたぐち さん 2003/10/29 19:49
93-16 いりや さん     2003/10/29 18:47
93-15 管理人むたぐち さん 2003/10/29 13:34
93-14 いりや さん     2003/10/29 12:17
93-13 いりや さん     2003/10/29 10:19
93-07 mikey さん      2003/10/27 19:21
93-06 管理人むたぐち さん 2003/10/27 17:44
93-05 mikey さん      2003/10/27 16:43
93-04 mikey さん      2003/10/27 15:51

のスレッドによれば、強制終了を検知するのであれば、
IEXPLORER.EXE プロセスの状態を監視する方式が一番適当かな、と
思いました。

ですので run() や exec() の使用を前提とするのがいいのかな、
とおもいます。

とはいえ、すでに確認いただいたとおり run(), exec() メソッド
を実行して InternetExplorer.Application オブジェクトへのリファ
レンスを捕捉できないので具合が悪い。

ただし、当該オブジェクトは Shell.Application オブジェクトの
windows() メソッドが返す集まり (Collection) オブジェクトの要
素として取得が可能です。こちらとの合わせ技で、強制終了の判断
とウインドウのサイズ変更の二つを達成されてはいかがでしょうか。

じゅん さん 2004年 04月 05日 11時 18分 12秒

こんにちは。質問させてください。
Set objIE = WScript.CreateObject "InternetExplorer.Application", "IE_")
URL = "http://xxxx.xxx
objIE.Width = 640
objIE.Height = 480
objIE.Navigate URL
objIE.Visible = True
としてInternetExplorerを起動して、ブラウザを操作し、その後、そのIEを閉じるのを
待って、閉じた後にまた何か処理をしたいと思ってます。
そこで下記のように書いて、IE終了時にIE_OnQuitが実行されることを確認しました。
で、普通にIEを閉じた場合はいいのですが、IEが強制終了された場合、IE_OnQuitが
実行されずにループしたままの状態になってしまいます。
強制終了した場合にもIEの終了を感知して、その後の処理を実行したいのですが
どのようにしたらいいでしょうか?
よろしくご教示ください。

--------------------
Set objIE = WScript.CreateObject("InternetExplorer.Application", "IE_")
URL = "http://xxxx.xxx"
objIE.Width = 640
objIE.Height = 480
objIE.Navigate URL
objIE.Visible = True
Do
WScript.Sleep 1000
Loop

Sub IE_OnQuit()
Msgbox "IE終了"
何かの処理
WScript.Quit
End Sub
------------------

ちなみに
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files\Internet Explorer\IEXPLORE.EXE""",1,True
MsgBox "IE終了"
としてRunで起動した場合は、強制終了しても大丈夫でしたが、ウィンドウのサイズ
とかを指定して起動したいのでRunではだめなんです。

管理人むたぐち さん 2004年 04月 03日 19時 00分 25秒

To: ばんのしゃーによかばんた さん

MSHTMLをWSHから直接呼び出せるとは知りませんでした。
たしかに、MSXMLが呼び出せるなら、さもありなん、
と言ったところでしょうか。

dialogHelperも面白そうですね。
TextStreamでhtmlを生成する部分も含め、関数化/WSC化しておくと
便利かもしれません。

管理人むたぐち さん 2004年 04月 03日 18時 31分 40秒

というわけで、Wikiを設置してみました。
http://winscript.s41.xrea.com/wiki/index.php

皆さんもどんどん書き込んでみてください。
多分、書くことは一杯あると思いますので。
簡単に枠組みだけ作ってみましたが、ページの構成等で
ご意見があれば、こちらで伺います。
まだページもできてない項目もありますが、それらも自由に
追加していただいてかまいません。

いりや さん 2004年 04月 03日 14時 26分 20秒

むたぐちさん、

| ・Windows Script FAQ Wiki
| せっかくPHPの使えるXREAのサーバーを借りているのだから、
| PukiWikiを設置してみたい。

WiKi たのしいですよ。ぜひ一度試験的でもよいからためしてみてください。

わたしも今年に入って WiKi を始動させましたが、ウェブサイトに情報をの
せることの手間が格段にへります。面倒だから、といったこれまでアップロー
ドするときに抱いていた否定的な感情が取り除かれると、こうもちがうもの
なのか、ということを実感できます。あれは横から見るものじゃない、自分
でおこすものですね。

ばんのしゃーによかばんた さん 2004年 04月 02日 18時 55分 39秒

clipboardDataの続き

GetDataだけならIEでなくても、MSHTMLだけで動きます。

Set Document=CreateObject("htmlfile")
WScript.Echo Document.ParentWindow.ClipboardData.GetData("Text")

この場合は、「インターネット」ゾーンのセキュリティレベルに依存します。

そこで、以下のようにすると、待ち合わせが必要になりますが、
「マイコンピュータ」ゾーンになります。

Set Document=GetObject(WScript.FullName,"htmlfile")
Do While Document.readyState<>"complete"
WScript.Sleep 100
Loop
WScript.Echo Document.ParentWindow.ClipboardData.GetData("Text")

IEを使った場合に比べて性能(レスポンスタイム)が相当程度改善されます。

一方、SetDataはWScript/CScriptが死にます。

因みに、
Set Document=CreateObject("htmlfile")
は、
Document.readyState="uninitialized"
です。

Set Document=GetObject("about:blank","htmlfile")

Set Document=GetObject("res://mshtml.dll/blank.htm","htmlfile")
は、IEのVersionに依存して、5.5 動く、5.0 動かないようです。
動く場合には、どちらも「マイコンピュータ」ゾーンになるようです。

環境依存を避けるため、上の例では、ローカルファイルなら、なんでもよいので、
スクリプトファイル自身を指定しています。

ばんのしゃーによかばんた さん 2004年 04月 02日 18時 54分 39秒

open file dialogの続き

<input type=file id=txtFile>は、簡単に使えてよいのですが、
初期ディレクトリやフィルタが指定できないのが難点です。

そこで、

COMDLG32.HTM
<HTML><BODY>
<OBJECT ID="dialogHelper" CLASSID="CLSID:3050f4e1-98b5-11cf-bb82-00aa00bdce0b">
</OBJECT></BODY></HTML>
HTMはここまで

Set ie=CreateObject("InternetExplorer.Application")
Ie.Navigate Left(WScript.ScriptFullName,Len(WScript.ScriptFullName)-Len(WScript.ScriptName)) & "COMDLG32.HTM"

Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop

WScript.Echo ie.document.body.all.dialogHelper.object.openfiledlg("", "", "GIF および JPEG (*.gif, *.jpg)|*.gif;*.jpg|", "Open File Dialog")

WScript.Echo ie.document.body.all.dialogHelper.object.savefiledlg("a", "", "GIF および JPEG (*.gif, *.jpg)|*.gif;*.jpg|", "Save File Dialog")

ie.Quit

<input type=file id=txtFile>を使ったときと比べて、
[initFile], [initDir], [filter], [title]が指定できるところが利点です。
逆に難点はセキュリティレベルが高いと使えないことです。
そのため、上ではHTML部分をローカルファイルにしています。

savefiledlgは、これで待望のSaveAsダイアログが出来ると思ったら間違いで、
openfiledlgと全く同じで、既存ファイルしか選択出来ません。がっかり。

参考、
Library OPTSHOLDLib
MSHTMLED.DLL
OptsHold 1.0 Type Library
Class HtmlDlgHelper HtmlDlgHelper Class
Function openfiledlg([initFile], [initDir], [filter], [title]) As String
Function savefiledlg([initFile], [initDir], [filter], [title]) As String

ProgIDもありますが、使い道は?
"HtmlDlgHelper.HtmlDlgHelper"
"HtmlDlgHelper.HtmlDlgHelper.1"

駆け出しのもの さん 2004年 04月 02日 13時 14分 59秒

いりや様
早速のご回答ありがとうございました。
3日ほど煮詰まっていましたので新風です、いろいろ試してみます。
ありがとうございました!

いりや さん 2004年 04月 02日 12時 18分 26秒

[ スクリプト2 実行例 ]

C:\Documents and Settings\iriyak\デスクトップ>cscript //nologo test.js
Index 0: [開く(&O)]
Index 1: [別のユーザーとして実行(&A)...]
Index 2: [Norton AntiVirus を使ってスキャン(&V)]
Index 3: [[スタート] メニューにアイコンを追加(&I)]
Index 4: []
Index 5: [切り取り(&T)]
Index 6: [コピー(&C)]
Index 7: [ショートカットの作成(&S)]
Index 8: [削除(&D)]
Index 9: [名前の変更(&M)]
Index 10: [プロパティ(&R)]

C:\Documents and Settings\iriyak\デスクトップ>

いりや さん 2004年 04月 02日 12時 17分 26秒

駆け出しのものさん、

| ご存知の方がいらしたら教えていただきたいのですが、windowsの「別のユー
| ザとして実行」、ができるようなコマンドはありませんでしょうか。"

FolderItem オブジェクト (COM オブジェクトの一つ) を使って試してみまし
たが、この方式ですとダイアログが出て invokeVerb() メソッドがスクリプ
トの実行がブロッキングされるようです。ダイアログで選択・入力を促され
ている情報をダイレクトに指示するその他の方式を模索する必要があるのか
もしれませんね。

以下は、WSH/JScript のスクリプトです。スクリプト1 が前述のスクリプト
です。スクリプト2 が実行プログラムで利用可能な動詞 (verb) の一覧を表
示するものです。ご参考まで。

//
// WSH/JScript スクリプト1 : 動詞 '別のユーザーとして実行(&A)...' を実行
//

var ShellApplication = new ActiveXObject('Shell.Application');
var aFolder = ShellApplication.nameSpace('C:\\Program Files\\UWSC');
var aFolderItem = aFolder.parseName('UWSC.exe');
aFolderItem.invokeVerb('別のユーザーとして実行(&A)...');
WScript.quit();

//
// WSH/JScript スクリプト2 : 実行プログラムで利用可能な動詞 (verb) の一覧を表示
//

var ShellApplication = new ActiveXObject('Shell.Application');
var aFolder = ShellApplication.nameSpace('C:\\Program Files\\UWSC');
var aFolderItem = aFolder.parseName('UWSC.exe');
var verbArray = new Enumerator(aFolderItem.verbs()).asArray();
try {
    var writeStream = WScript.stdout;
    var printBlock = function (each, anIndex) {
        writeStream.writeLine('Index ' + anIndex + ': [' + each + ']');
    }
    verbArray.doWithIndex_(printBlock);
} finally {
    writeStream.close();
    WScript.quit();
}

function Enumerator.prototype.asArray() {
    var anArray = new Array();
    for (; !this.atEnd(); this.moveNext()) {
        var each = this.item();
        anArray.push(each);
    }
    return anArray;
}

function Array.prototype.doWithIndex_(operation) {
    for (var i = 0; i < this.length; i++)
        operation(this[i], i);
}

駆け出しのもの さん 2004年 04月 02日 11時 22分 34秒

いつも参考にさせていただいており、大変助かっております。

ご存知の方がいらしたら教えていただきたいのですが、windowsの「別のユーザとして実行」、ができるようなコマンドはありませんでしょうか。"runas"コマンドのようなものがあればbestなのですが...。

tall さん 2004年 04月 01日 16時 30分 45秒

●いりやさま

> Chr() 関数の補足 (Note) 欄に載っているようです。

ほんとうですね。
WSH5.6を入れたときに同時にインストールされた
HTMLヘルプには記述がなかったので
(ChrBまでは載っていましたが)
ないものとばかり……。

みなさま、ありがとうございました。

いりや さん 2004年 04月 01日 12時 54分 14秒

tall さん、

> WSHのヘルプにChrW関数が載っていなかったので、

Chr() 関数の補足 (Note) 欄に載っているようです。

msdn, Visual Basic Scripting Edition, Chr Function
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsfctchr.asp

tall さん 2004年 04月 01日 12時 11分 17秒

●魔界の仮面弁士さま

> ChrW関数を使ってみては如何でしょう。

できました!
WSHのヘルプにChrW関数が載っていなかったので、
あきらめておりました。
AscWに対応する関数ということですね。

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

魔界の仮面弁士 さん 2004年 04月 01日 12時 04分 09秒

> 置換文字列をユニコード番号で指定(検索語でいうと「\uxxxx」のような形)

ChrW関数を使ってみては如何でしょう。例えば、
 『ChrW(&H5F01)』(16進数表記)
または
 『ChrW(24321)』(10進数表記)
で、「弁」という文字の指定となります。

tall さん 2004年 04月 01日 01時 58分 05秒

●管理人さま

> タブはvbTab、改行はvbCrLfというVBSの定数を使います。

なるほど、それでよかったのですか……。ありがとうございます。

あと、これもいくら調べても分からなかったのですが、
置換文字列をユニコード番号で指定(検索語でいうと「\uxxxx」のような形)
することはできるのでしょうか?

管理人むたぐち さん 2004年 03月 31日 20時 46分 50秒

●現在の計画
次期WindowsであるLonghornが発売されるのは2006年以降ということで、
Windowsが.NETな世界になるのもまだまだ先であり、COMというかWSHは
しばらくは廃れることもないでしょう。
というわけで、WSH布教活動の一環として思いついたことを書いておきます。

・Windows Script FAQ Wiki
せっかくPHPの使えるXREAのサーバーを借りているのだから、
PukiWikiを設置してみたい。
内容は、この掲示板での頻出質問事項、テクニック集、スクリプトコードの断片。
Wikiの特長を生かして、誰でも項目の追加・編集ができるようにする。
(リファレンス的なものは公式ヘルプに任せる。質問などは引き続きこの掲示板で)

・WSH Lab.掲示板の更新情報をRSSで配信
この掲示板は1998年に作製されたperlスクリプトで、非常に設計が古臭く、
機能としても大したものはありませんが、それなりに良い点もあって
なかなか移行できません。
しかし、そこにRSS配信機能をつければ、最新型掲示板に早変わり。
ちょこっとコードを足せば良さそうな感じなので、perlの勉強がてら、
検討してみたいと考えています。Blog的な(この書き込みのような)
こともやりやすくなるのではないかと思ったりしています。
また、RSSとは要するにXMLですから、MSXMLとの絡みで、WSH的にも面白い
応用が楽しめたりしたらいいなあとか漠然と考えています。 

管理人むたぐち さん 2004年 03月 31日 19時 14分 57秒

W32/NetSky.Qがメールでものすごい勢いで来ますね。
私のメールボックスはほとんど壊滅状態です。

W32.HLLW.Antinny.Gは別の意味でスゴイ…。


To: 魔界の仮面弁士 さん

IEのセキュリティと言えば、
http://username:password@www.roy.hi-ho.ne.jp/mutaguchi/bbs/index.shtml
のようにしてBasic認証をパスする方法が使えなくなりましたね。
これも最近の変更点だったと思います。

javascript:もそのうち使えなくなったりしないでしょうか。
最近、どうも悪用されている例が目に付く…。


To: tall さん

タブはvbTab、改行はvbCrLfというVBSの定数を使います。

たとえばこんな感じですね。
RegEx.Preplace(str,"hoge$1hoge" & vbTab & "$2" & vbCrLf)

VBSの文字列の取り扱いは、正規表現を含めて、めんどくさいですね。

tall さん 2004年 03月 31日 14時 59分 44秒

はじめまして。

VBScriptを利用して正規表現で検索置換を行いたいのですが、
置換文字列にたとえば「\t」や「\n」を含めると、
出力結果にタブや改行が出力されず、
上記文字列がそのまま出力されてしまいます。

これは機能的にできないことなのでしょうか?

魔界の仮面弁士 さん 2004年 03月 29日 05時 03分 26秒

セキュリティ上の問題からなのか、最近のバージョンでは、
ie.Navigate "about:<html><body><input type=file id=txtFile></body></html>"
の記述が利用できないようです。(IE6SP1からだったかな?)

ただし、“javascript Protocol”を使った、
ie.Navigate2 "javascript:document.write('<html><body><input type=file id=txtFile></body></html>');"
のような記述であれば、現在のバージョンでも動作するようです。

http://msdn.microsoft.com/workshop/networking/predefined/javascript.asp

管理人むたぐち さん 2004年 03月 29日 00時 39分 44秒

WSHBBS(WSH+CGIで動作する2ch互換スクリプト)
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/src/wshbbs_cgi.zip

ようやく公開できる形になりましたので公開します。
まだまだほんの形だけですけども。
概要については、以前も書きましたのでそちらをどうぞ。

http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list81.shtml
管理人むたぐち さん 2003年 04月 18日 20時 58分 41秒

で、これが何の役に立つかは謎です。
作ってはみたものの、使い道がないので、主に観賞用となるかもしれません。

ばんのしゃーによかばんた さん 2004年 03月 28日 17時 36分 56秒

IEを利用するときの定石
about:blank
について、

これまた、クリップボードを利用するときの定番、clipboardDataですが、

Set ie = WScript.CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.parentWindow.clipboardData.setData "text","あいうえお"
WScript.Echo ie.Document.parentWindow.clipboardData.getData("text")
ie.Quit

この場合、about:blankは「インターネット」ゾーンになります。
そのため、ユーザの設定で、そのセキュリティレベルが「高」になっていると、
クリップボードへ/からの貼り付けが出来ません。

そこで、
about:blank
ではなく、その実体である、
res://mshtml.dll/blank.htm
を指定します。

Set ie = WScript.CreateObject("InternetExplorer.Application")
ie.Navigate "res://mshtml.dll/blank.htm"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.parentWindow.clipboardData.setData "text","あいうえお"
WScript.Echo ie.Document.parentWindow.clipboardData.getData("text")
ie.Quit

こちらは「マイコンピュータ」ゾーンになるので、
通常の設定ではクリップボードへ/からの貼り付けが可能になります。

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

IEを利用するときの定石
about:blank
について、

これまた定番のfile open dialogですが、

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.Write "<html><body><input type=file id=txtFile></body></html>"
ie.Document.all.txtFile.focus
ie.Document.all.txtFile.click
WScript.Echo ie.Document.all.txtFile.Value
ie.Quit

この場合、
about:blankはまず、レジストリを見て、
HKLM\SOFTWARE\Microsoft\Internet Explorer\AboutURLs
res://mshtml.dll/blank.htm
に変換してファイルから読み込みが行われます。

そのあと、別のHTML文が書き込まれるので、先のHTML文は
無駄に読み込んだことになります。

つまり、
dllファイルからのhtml取り出し
の分だけ性能(レスポンスタイム)が悪くなります。

そこで、
about:HTML文
という直接的な記述を利用すれば、

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "about:<html><body><input type=file id=txtFile></body></html>"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.all.txtFile.click
WScript.Echo ie.Document.all.txtFile.Value
ie.Quit

となって、記述もすっきりしますし、性能も少し良くなります。


いりや さん 2004年 03月 28日 11時 38分 26秒

参考情報です。

[ リンク ]

exeal さん, Windows Script > Scripting ライブラリ > File オブジェクト
http://www.interq.or.jp/student/exeal/dss/ref/wsh/scripting/file.html

File オブジェクトの解説は msdn にもありますが、こちらの解説のほうが行き届いてい
ます。おすすめです。

いりや さん 2004年 03月 28日 11時 33分 53秒

スクリプトの実行例です。

[ スクリプトの実行例 (example3() をコメントアウト) ]

フォルダAとフォルダBはこんな感じです。

// ここから

D:\Documents and Settings\iriyak\デスクトップ>dir d:\フォルダA
ドライブ D のボリューム ラベルは VOL LABEL です
ボリューム シリアル番号は 1DD2-342B です

d:\フォルダA のディレクトリ

2004/03/27 18:09 <DIR> .
2004/03/27 18:09 <DIR> ..
2003/01/04 18:12 156 Galactic Conquest.url
2003/01/04 18:12 154 Galaxy Next Generation.url
2003/01/04 18:12 158 Galaxy PBeM Web Center (1996-2).url
2003/01/04 18:12 191 VGA Planets Home Page.url
2003/01/04 18:12 138 Donovan's - The best VGA Planets information site around.url
2003/01/04 18:12 186 Galactic Conquest -- another one.url
6 個のファイル 983 バイト
2 個のディレクトリ 2,749,308,928 バイトの空き領域

D:\Documents and Settings\iriyak\デスクトップ>dir d:\フォルダB
ドライブ D のボリューム ラベルは VOL LABEL です
ボリューム シリアル番号は 1DD2-342B です

d:\フォルダB のディレクトリ

2004/03/27 18:09 <DIR> .
2004/03/27 18:09 <DIR> ..
2003/01/04 18:12 138 Donovan's - The best VGA Planets information site around.url
2003/01/04 18:12 156 Galactic Conquest.url
2003/01/04 18:12 154 Galaxy Next Generation.url
3 個のファイル 448 バイト
2 個のディレクトリ 2,749,308,928 バイトの空き領域

D:\Documents and Settings\iriyak\デスクトップ>

// ここまで

実行結果はこんな感じです。

// ここから
D:\Documents and Settings\iriyak\デスクトップ>cscript //nologo file.js
フォルダA,B両方に含まれるファイル:

//
// Index: 0
//

Name = ['Galactic Conquest.url']
Path = ['D:\\フォルダA\\Galactic Conquest.url']
ShortName = ['GALACT~1.URL']
ShortPath = ['D:\\フォル~1\\GALACT~1.URL']
Size = [156]
DateCreated = [Sat Mar 27 18:09:05 UTC+0900 2004]
DateLastAccessed = [Sat Mar 27 00:00:00 UTC+0900 2004]
DateLastModified = [Sat Jan 4 18:12:42 UTC+0900 2003]

//
// Index: 1
//

Name = ['Galaxy Next Generation.url']
Path = ['D:\\フォルダA\\Galaxy Next Generation.url']
ShortName = ['GALAXY~1.URL']
ShortPath = ['D:\\フォル~1\\GALAXY~1.URL']
Size = [154]
DateCreated = [Sat Mar 27 18:09:05 UTC+0900 2004]
DateLastAccessed = [Sat Mar 27 00:00:00 UTC+0900 2004]
DateLastModified = [Sat Jan 4 18:12:42 UTC+0900 2003]

//
// Index: 2
//

Name = ['Donovan\'s - The best VGA Planets information site around.url']
Path = ['D:\\フォルダA\\Donovan\'s - The best VGA Planets information site arou
nd.url']
ShortName = ['DONOVA~1.URL']
ShortPath = ['D:\\フォル~1\\DONOVA~1.URL']
Size = [138]
DateCreated = [Sat Mar 27 18:09:05 UTC+0900 2004]
DateLastAccessed = [Sat Mar 27 00:00:00 UTC+0900 2004]
DateLastModified = [Sat Jan 4 18:12:42 UTC+0900 2003]


フォルダAにしか含まれないファイル:

//
// Index: 0
//

Name = ['Galaxy PBeM Web Center (1996-2).url']
Path = ['D:\\フォルダA\\Galaxy PBeM Web Center (1996-2).url']
ShortName = ['GALAXY~2.URL']
ShortPath = ['D:\\フォル~1\\GALAXY~2.URL']
Size = [158]
DateCreated = [Sat Mar 27 18:09:05 UTC+0900 2004]
DateLastAccessed = [Sat Mar 27 00:00:00 UTC+0900 2004]
DateLastModified = [Sat Jan 4 18:12:42 UTC+0900 2003]

//
// Index: 1
//

Name = ['VGA Planets Home Page.url']
Path = ['D:\\フォルダA\\VGA Planets Home Page.url']
ShortName = ['VGAPLA~1.URL']
ShortPath = ['D:\\フォル~1\\VGAPLA~1.URL']
Size = [191]
DateCreated = [Sat Mar 27 18:09:05 UTC+0900 2004]
DateLastAccessed = [Sat Mar 27 00:00:00 UTC+0900 2004]
DateLastModified = [Sat Jan 4 18:12:42 UTC+0900 2003]

//
// Index: 2
//

Name = ['Galactic Conquest -- another one.url']
Path = ['D:\\フォルダA\\Galactic Conquest -- another one.url']
ShortName = ['GALACT~2.URL']
ShortPath = ['D:\\フォル~1\\GALACT~2.URL']
Size = [186]
DateCreated = [Sat Mar 27 18:09:05 UTC+0900 2004]
DateLastAccessed = [Sat Mar 27 00:00:00 UTC+0900 2004]
DateLastModified = [Sat Jan 4 18:12:42 UTC+0900 2003]


D:\Documents and Settings\iriyak\デスクトップ>

// ここまで

いりや さん 2004年 03月 28日 11時 32分 54秒

om さん、むたぐちさん、

| WSHにおいて
| フォルダC:\AAAAフォルダ下にあるファイルと
| フォルダC:\BBBBフォルダ下にあるファイルを
| ファイル名で比較し、一致するファイル名が存在するか
| しないかを判別できるようなコードが
| わかれば教えて下さい。

JScript 言語での別解を用意してみました。

このスクリプトの特徴は、一致するファイル名のファイルの存在有無を、ファイルを要
素にもつ集合の共通集合の要素数がゼロかそうではないか、という問題に還元したとこ
ろです。

JScript 言語の Array オブジェクトを集合にみたてて、要素に ActiveX Object の一つ
である File オブジェクトをおきました。要素そのものの比較では別のオブジェクト・
リファレンス同士ですから当然一致しません。そのため、File オブジェクトの name 属
性をつかって、ファイル名が一致するか、ということを調べています。

スクリプトの intersection 変数には、フォルダAとBの両方に含まれる File オブジェ
クトを要素にもつ Array オブジェクトが束縛されています。difference 変数には、フォ
ルダAには含まれるがBには含まれない File オブジェクトを要素にもつ Array オブジェ
クトが束縛されています。

たぶん、存在有無の検査のあとに、intersection もしくは difference の要素に対する
操作がつづくとおもいます。File オブジェクトは copy(), delete(), move() などのメッ
セージに応えてくれますので、それぞれの要素に対して操作するスクリプトをつくりこ
んでいけばよいでしょう。

[ スクリプトの実行の仕方 ]

例題スクリプトを三つ用意しています。いずれか一つをコメントアウトしておきます。
(// をとる)

スクリプトを file.js に保存します。

example1(), example2() は wscript.exe から実行できますが example3() は
WScript.stdout にアクセスしますので cscript.exe からでしか実行できません。

そのため、コマンドプロンプトから次のように実行するのがよいでしょう。

D:\Documents and Settings\iriyak\デスクトップ>cscript //nologo file.js

[ WSH/JScript ソースコード ]

var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');

var fileArrayA = generateFileArray('D:\\フォルダA');
var fileArrayB = generateFileArray('D:\\フォルダB');

//example1(fileArrayA, fileArrayB);
//example2(fileArrayA, fileArrayB);
example3(fileArrayA, fileArrayB);

function example1(fileArrayA, fileArrayB) {
    var filenames = fileArrayB.collect_(function (each) { return each.name });
    var intersection = fileArrayA.select_(function (each) { return filenames.includes_(each.name) });
    if (intersection.length == 0)
        WScript.echo('フォルダAにはフォルダBと同じ名前のファイルはありません');
    else {
        WScript.echo('フォルダAにはフォルダBと同じ名前のファイルが存在します');
        WScript.echo('対象ファイルは次の通りです:');
        WScript.echo(intersection);
    }
    WScript.quit();
}

function example2(fileArrayA, fileArrayB) {
    var filenames = fileArrayB.collect_(function (each) { return each.name });
    var intersection = fileArrayA.select_(function (each) { return filenames.includes_(each.name) });
    var difference = fileArrayA.reject_(function (each) { return filenames.includes_(each.name) });

    var pickUpName = function (fileArray) {
        return fileArray.collect_(function (each) { return each.name }).printString();
    }
    WScript.echo('フォルダA,B両方に含まれるファイル:\n');
    WScript.echo(pickUpName(intersection));
    WScript.echo();
    WScript.echo('フォルダAにしか含まれないファイル:\n');
    WScript.echo(pickUpName(difference));
    WScript.quit();
}

function example3(fileArrayA, fileArrayB) {
    var filenames = fileArrayB.collect_(function (each) { return each.name });
    var intersection = fileArrayA.select_(function (each) { return filenames.includes_(each.name) });
    var difference = fileArrayA.reject_(function (each) { return filenames.includes_(each.name) });

    var listBlock = function (each, index) {
        var propertyArray = new Array(
            'Name', 'Path', 'ShortName', 'ShortPath', 'Size',
            'DateCreated', 'DateLastAccessed', 'DateLastModified'
        );
        var listPropertyBlock = function (property) {
            var p = each[property];
            var aString = typeof(p) == 'object' || typeof(p) == 'date' ? p + '' : p.printString();
            writeStream.writeLine(property + ' = [' + aString + ']');
            // Note that each[property] can be VT_DATE value as returned from some ActiveX(R)
            // objects, and it is not the same as Date object which is built-in object in
            // JScript, and whose typeof() value is 'date'. Hence it doesn't respond to toString()
            // while a build-in object does.
        }
        writeStream.writeLine('//');
        writeStream.writeLine('// Index: ' + index);
        writeStream.writeLine('//');
        writeStream.writeBlankLines(1);
        propertyArray.do_(listPropertyBlock);
        writeStream.writeBlankLines(1);
    }
    try {
        var writeStream = WScript.stdout;
        writeStream.writeLine('フォルダA,B両方に含まれるファイル:\n');
        intersection.doWithIndex_(listBlock);
        writeStream.writeBlankLines(1);
        writeStream.writeLine('フォルダAにしか含まれないファイル:\n');
        difference.doWithIndex_(listBlock);
    } finally {
        writeStream.close();
    }
    WScript.quit();
}

function generateFileArray(folderPath) {
    if (FileSystemObject.folderExists(folderPath)) {
        var files = FileSystemObject.getFolder(folderPath).files;
        return (new Enumerator(files)).asArray();
    } else
        return null;
}

function Array.prototype.includes_(target) {
    try {
        this.do_(function (each) { if (target == each) { throw true }});
    } catch (e) {
        return e;
    }
    return false;
}

function Array.prototype.printString() {
    var stringArray = new Array();
    printBlock = function (each) {
        var s = typeof(each) == 'object' || typeof(each) == 'date' ? each + '' : each.printString();
        stringArray.push(s, ', ');
    }
    stringArray.push('[');
    this.do_(printBlock);
    stringArray = stringArray.slice(0, -1);
    stringArray.push(']');
    return stringArray.join('');
}

function Array.prototype.do_(operation) {
    for (var i = 0; i < this.length; i++)
        operation(this[i]);
}

function Array.prototype.doWithIndex_(operation) {
    for (var i = 0; i < this.length; i++)
        operation(this[i], i);
}

function Array.prototype.select_(discriminator) {
    var anArray = new Array();
    this.do_(function (each) { if (discriminator(each)) anArray.push(each) });
    return anArray;
}

function Array.prototype.reject_(discriminator) {
    return this.select_(function (each) { return discriminator(each) == false });
}

function Array.prototype.collect_(transformer) {
    var anArray = new Array();
    this.do_(function (each) { anArray.push(transformer(each)) });
    return anArray;
}

function Number.prototype.printString() {
    return this.toString();
}

function String.prototype.printString() {
    var q = String.fromCharCode(39);
    var s = this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'');
    return new Array(q, s, q).join('');
}

function Enumerator.prototype.asArray() {
    var anArray = new Array();
    for (; !this.atEnd(); this.moveNext()) {
        var each = this.item();
        anArray.push(each);
    }
    return anArray;
}

管理人むたぐち さん 2004年 03月 28日 00時 37分 08秒

To: om さん

> フォルダC:\AAAAフォルダ下にあるファイルと
> フォルダC:\BBBBフォルダ下にあるファイルを
> ファイル名で比較し、一致するファイル名が存在するか
> しないかを判別できるようなコードが

関数を書いてみました。
ExistsSameFileName関数は、フォルダのパスを格納した配列を引数に取り、
それらの中に同名のファイル名があればTrueを返し、ない場合はFalseを返します。
ただし、指定したフォルダの直下のファイルしか調べません。

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

MsgBox ExistsSameFileName(Array("C:\AAAA","C:\BBBB"))

Function ExistsSameFileName(aFolderList)
Set Dic = WScript.CreateObject("Scripting.Dictionary")
For Each sFolder In aFolderList
For Each oFile In Fs.GetFolder(sFolder).Files
If Dic.Exists(oFile.Name) Then
ExistsSameFileName = True
Exit Function
Else
Dic.Add oFile.Name,oFile.Path
End If
Next
Next
ExistsSameFileName = False
End Function

ひまわりかな さん 2004年 03月 27日 10時 54分 09秒

口ばんのしゃーによかばんた様へ

丁寧にご返答くださいまして有難うございました。
ご挨拶が遅れまして、申し訳ありません。

一度、この方法で試してみます。
29日以降でないとちょっと試すことができないのですが、
また、進展しましたら報告いたしますね。


口nora4 様へ

先日書き込んだ後に気づいたのですが・・・。
エクスプローラーやマイコンピュータから
ドライブを非表示にできても、
アドレスバーに直接パスを入れるとアクセスできる事を
忘れてまして・・・。ごめんなさい。

たぶん、エクスプローラーのフォルダオプションで
「タイトルバーにファイルのパス名を表示する」を有効にしておいて
そのパスが非表示にするドライブのものだったら画面を閉じる、
みたいな方法なら回避できるような気がします・・・。

とりあえず、報告だけでごめんなさい。



インタビ さん 2004年 03月 26日 16時 11分 10秒

こんにちは。

VBSで不要なレジストリを削除(RegDelete)したいのですが、
レジストリの値がパス情報で、¥が入っているためにエラーになって
しまいます。(多分)
パス情報の値を削除するにはどのように記述したら良いのでしょうか?

ばんのしゃーによかばんた さん 2004年 03月 24日 17時 19分 40秒

スクリプトファイルのアイコンはみんな同じで、デスクトップやタスクパーなどにあると
一目で区別がつきません。
せめて、スクリプトファイルのリンクであるWSHファイルでは、アイコンが指定出来る
ようにしてほしいものです。

そこで、

WSHファイルのアイコンを任意のものに変えるには、

REGEDIT4

[HKEY_CLASSES_ROOT\WSHFile\shellex\IconHandler]
@="{57651662-CE3E-11D0-8D77-00C04FC99D61}"

を結合し、WSHファイルに以下を追加します。

[Shell]
IconFile=ファイル,番号

WSFFile、VBSFile、JSFileなども、同様に結合し、
それぞれの構文の中に誤魔化して入れます。

WSFFile
<package>
<comment>
[Shell]
IconFile=c:\windows\explorer.exe,1
</comment>
<job id=b>

VBSFile
Option Explicit
Dim shell,IconFile
[Shell] =0
IconFile="c:\windows\explorer.exe,1"

JSFile
/*
[Shell] =0
IconFile="c:\windows\explorer.exe,1"
*/

ただ、指定のない大多数のファイルがアイコンなしアイコンになってしまうので、
別に拡張子を作ったほうがよいでしょう。

ひまわりかな さん 2004年 03月 24日 13時 17分 51秒

ごめんなさい。
余分な行が含まれてました。(汗)

'Sh.RegDelete key & skey & "NoDrives"
は、いらないです・・・。
落ち着きなくてごめんなさい。

ひまわりかな さん 2004年 03月 24日 13時 15分 10秒

nora4 様へ (2004年 03月 18日 18時 20分 59秒 )
こんにちは。
先日nora4様の書き込んだすぐ後に書き込みをしたものです。
その時は、全然気づかなかったのですが、自分の書き込みと
少し問題が似通っているところもある事に後日気づきまして・・・。

あまり、スマートではないのですが下記の方法はいかがでしょうか。
・エクスプローラからFDDやUSBに割り当てているドライブ名を
 非表示にすることでユーザーの使用を制限する。

Set Sh = CreateObject("WScript.Shell")

key = "HKEY_CURRENT_USER\"
skey = "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\"
Sh.RegWrite key & skey & "NoDrives", 64, "REG_DWORD"
'Sh.RegDelete key & skey & "NoDrives"

「"NoDrives", 64」の64というのはドライブの値を10進で表したものです。
ここではGドライブを非表示にしてます。

例:Aドライブ=1,B=2,C=4,.....F=32,G=64


Shell.Application使えれば、もっとスマートになるかも。
とは思うのですが、自分ではソコまでできませんでした。
コレをご覧になって、ご教示くださる方をお待ちしてます・・・。
よろしくお願いいたします。


ちなみに、ご存知かもしれませんが、こんなページを参考にしました。

「エクスプローラから特定のドライブを隠すには?」を参照
http://homepage2.nifty.com/winfaq/c/custom.html
あと、ここ↑にも載ってましたが
WSHにこだわらなくてもよければ、windows2000ってことでこちらも
よいかもしれません・・・。
http://support.microsoft.com/default.aspx?scid=kb;JA;JP231289

om さん 2004年 03月 24日 10時 22分 50秒

初めて書き込みさせて頂きます。
再書き込みになるのですが・・・

WSHにおいて
フォルダC:\AAAAフォルダ下にあるファイルと
フォルダC:\BBBBフォルダ下にあるファイルを
ファイル名で比較し、一致するファイル名が存在するか
しないかを判別できるようなコードが
わかれば教えて下さい。

申し訳ありませんが、
もし、おわかりになられる方がおられたら
教えて戴きたく思います。
お手数ですが、どうぞ宜しくお願いします。

ただし さん 2004年 03月 24日 08時 10分 23秒

> (…CDOって、Windows Server 2003でも使えるのかな?)

Windows 2003 Server はまだ試してませんが2000でなら試しま
した。

CDONTSとCDOSYSの両方が使えます。SYSの方は出始めの頃大分
不調だったようですが最近は改善されているようです。私の
環境ではすんなり使えましたよ。

SYSになってよい点は認証が出来るようになり別のSMTPにに送り
出しを任せられることでしょうか。詳しくは、

www.developersdex.com/gurus/code/782.asp

スケジュール化メールは次が参考になるかと思います。

hp.vector.co.jp/authors/VA015367/vbs/WSH_CDONTS.txt

私はLinuxで見張りサーバー立ててSNMPを使ってました。

魔界の仮面弁士 さん 2004年 03月 24日 03時 59分 43秒

プログラムでCPU使用率を測定するには「WMI」を使う事ができます。
この場合使うのは、Win32_ProcessorクラスのLoadPercentageプロパティです。
細かい指定等を省けば、こんな感じでしょうか。
=============
Dim CPU
For Each CPU In CreateObject("winmgmts:").InstancesOf("Win32_Processor")
MsgBox CPU.LoadPercentage
Next
=============

以下は、WMIに関する資料です。
http://www.microsoft.com/JAPAN/developer/library/jptech/msdnnews/wmi.htm
http://www.showg.jp/tamper/wmi/index.htm
http://wmifun.atinfinity.net/

# なお、CPU使用率の測定には、プログラムを書かずとも、管理ツールの
# パフォーマンスログを利用する事もできるかも知れません。


> 特定の時間帯に vbs を利用し Mail でその値を通知させたいと思います。
特定の時間帯に測定するには、vbsをタスクスケジューラに登録しておくと良いでしょう。

メールの配信に関しては、BASP21を利用する方法、COMBLATJを利用する方法、Office 2003などの機能を利用する方法、CDOを利用する方法などが考えられます。
(…CDOって、Windows Server 2003でも使えるのかな?)

beginner さん 2004年 03月 23日 19時 15分 36秒

はじめまして。過去路ログを調べてみたのですが、確認を行えませんでしたので、皆様に質問を行わせていただきたくお願い致します。
私が行おうと考えております事は以下の内容です。

<行いたいこと>
10台存在する Windows Server 2003 の各 CPU 使用率の値を特定の時間帯に vbs を利用し Mail でその値を通知させたいと思います。

<質問させていただきたいこと>
各 CPU 使用率の値を Get するにはどのように致せば宜しいでしょうか。
CPUの値は数(十)秒間の平均値を取得できればと考えております。

恐れ入りますが、ご教示いただけますようお願い致します。

Return