ばんのしゃーによかばんた さん 2005年 11月 30日 16時 01分 36秒

>YU-TANG さん 2005年 11月 28日 17時 13分 05秒
>これで今度からは大丈夫そうです。

記事が役立ったと分かって、うれしいです。
投稿しても、反響がないと、需要がないのかなぁと思えて、
そろそろ引き時かなと考えていたところです。
需要があるなら、もう少し続けますかね。

># でも何でサイズ指定で出てくるのかしらん。

これは、既にIEを開いていて、あっ「オフライン作業」がない!、というときに、
「お気に入り」や「リンク」から起動して、制御パネル風に常駐表示させよう、
という制作意図です。IEの起動に用いるのは、用途外使用です。と言うか、

実は、初めから、IEを「オフライン作業」メニュー付きで起動するだけなら、
スクリプトを使うまでもなく、もっと簡単に出来ます。
ただ、そうなると、WSH/スクリプティングと関係のない話になってしまうので、
この掲示板向きに、スクリプト話に仕立てたのです。
なので、こちらで割愛したWindows/障害の話は、どこか余所で聞いてください。


魔界の仮面弁士 さん 2005年 11月 29日 16時 55分 27秒

》kagilinn さん 2005年 11月 29日 14時 19分 04秒
> 起動中のプロセス(実行ファイル名が分かっている)を監視して
> そのプロセスが全て終了した際に処理を行う事は可能でしょうか?

WMI の Win32_Process クラスを使えば、できるように思います。

1. Win32_Process にて、対象のプロセスが存在するかチェック。
2. 存在している場合には、__InstanceDeletionEvent にて待機。       http://wmifun.atinfinity.net/wmistep/step09.html
3. プロセスの終了を検知したら、再度 1 に戻ってチェック。
4. プロセスが存在しなくなったら、処理開始。

頻繁に起動と終了を繰り返すプロセスでなければ、多分いけるかと。(未確認)

kagilinn さん 2005年 11月 29日 14時 19分 04秒

ここではお初になります。WSH(VBS or JS) で
起動中のプロセス(実行ファイル名が分かっている)を監視して
そのプロセスが全て終了した際に処理を行う事は可能でしょうか?

宜しくお願いいたします。

管理人むたぐち さん 2005年 11月 29日 06時 41分 21秒

To: けいじ さん
location.pathnameがWScript.ScriptFullNameに対応するDOMのプロパティになります。
ただし、空白スペースが%20に置換されているなど、そのままでは
使用できないので、適宜変換を入れてやる必要があります。
詳しくはlocation.pathnameを検索キーにして
ログを当たってみてください。
ちょっとどれだけ項目があったか忘れてしまったので…。

新米MCP さん 2005年 11月 29日 00時 34分 30秒

いつも勉強させていただいております。
諸先生方がお忙しそうなので、間違ってるかもしれないけど僭越ながら。

>To みん さん 2005年 11月 28日 10時 22分 50秒

まず、VBSファイル側の出力は、WScript.Echoを使用します。

VBS側:
WScript.Echo "出力したい内容"

っていう書き方ですね。
その上で、VBSファイルをcscriptを使用して起動すれば、VBSファイルの出力は標準出力に出ます。
標準出力を受け取るには、WshShell.Execで起動して、StdOutプロパティで読み取ります。

HTML側:
Set WshShell = CreateObject("WScript.Shell")
Set objExec = WSHShell.Exec("cscript //nologo ***.vbs")
strOutput = objExec.StdOut.ReadAll

というようにすれば、VBSファイルの出力を受け取れると思います。
でもHTMLじゃなくHTAを使えば、VBSを別ファイルにしなくてもいいような気もしますね。

YU-TANG さん 2005年 11月 28日 17時 13分 05秒

>ばんのしゃーによかばんた さん 2005年 11月 25日 16時 15分 39秒
>IEの「ファイル」メニューに「オフライン作業」を表示する.VBS

たまに、少し前に見たけど今は消されているページの内容を確認
したいときがあったりして、今までは [オフライン作業] コマンドが
出てこないのでキャッシュをあさりに行ったりしていました。

これで今度からは大丈夫そうです。
ありがとう。

# でも何でサイズ指定で出てくるのかしらん。

みん さん 2005年 11月 28日 10時 22分 50秒

よろしくお願いします。

HTMLファイルにVBSで記述したプログラム中から.vbsファイルを実行し、その戻り値をプログラムで受け取るような処理は可能でしょうか?

HTML上のパスワードボックスにログオンユーザのパスワードを入力してもらい、「OK」ボタンが押下されるとそのパスワードを認証し、「認証成功
」か「認証失敗」か判定したいと思っています。しかし、どうやら認証のプログラムはVBSのプログラムをHTMLに埋め込んだ状態では実行することが出来ず、.vbsファイルをクリックすることで実行した場合は処理が可能なようです。
(スクリプトの実行エンジンの問題かと思っているのですが、解釈があっているかどうかわかりません。)

↓このようにして戻り値をとることはできませんでした。
'入力されたパスワード
Dim strPass
set wshShell =CreateObject("WScript.Shell")
ans = wshShell.Run("cmd.exe /c **.vbs " & strPass ,0,true)

ちゃっぴ さん 2005年 11月 27日 12時 14分 38秒

To じょに さん 2005年 11月 27日 11時 32分 54秒

おそらく、Computer に疎い人のための対策と想定しますが、
そういうことを User に理解させずに使わせること自体が
Virus とか Malware を蔓延させる原因となります。

EXE の実行が認められていないから、VBS でということに
なったのでしょうけど、 VBS も削除される Mail Client もありますよ。

このようなことは、Malware の作者がやろうとすることで、
そんなことはせずに、地道に User 教育をなさることをお勧めします。

じょに さん 2005年 11月 27日 11時 32分 54秒

txtファイルとvbsファイルをメール送信して、受信者がvbsを開いたら
txtをexeファイルに変換して、exeファイルを実行させたいのですが、
パスの取得がうまくいきません。

誰かアドバイスお願いします。

ばんのしゃーによかばんた さん 2005年 11月 25日 16時 15分 56秒

>ばんのしゃーによかばんた さん 2005年 11月 21日 17時 13分 02秒
>ローカルのHTMLファイルを「信頼済みサイトゾーン」で動かすことは可能です。

同様に、
「about:TrustedSite」を「信頼済みサイト」に登録して、以下にドロップ。
ローカルのHTMLファイルを「信頼済みサイトゾーン」で動かす.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim wShell
Dim URL
Dim ie

URL=WScript.Arguments(0)

Set wShell=CreateObject("WScript.Shell")
wShell.RegWrite "HKLM\SOFTWARE\Microsoft\Internet Explorer\AboutURLs\TrustedSite",URL,"REG_SZ"

Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:TrustedSite"
ie.Visible=True
――――――――――――――――――――――――――――――――――――――
すると、確かに右下のインディケータは「信頼済みサイト」になりますが、
どうも、実際には、マイコンピュータゾーンで動いているようです。
これは障害ですね。残念。将来的には修正されて使えるかも。


ばんのしゃーによかばんた さん 2005年 11月 25日 16時 15分 39秒

>管理人むたぐち さん 2000年 08月 03日 13時 27分 50秒
>また、Win2000では一度オフライン状態にしておけば窓を閉じてもずっとオフライン状態の
>ままなのはいいのですが、IEの「ファイル」メニューに「オフライン作業」の
>チェック項目がないので、わざとキャッシュにないURLの表示を試みてダイアログを出し、
>「オフライン作業」に移行するしかないので大変不便です。

IEの「ファイル」メニューに「オフライン作業」を表示する.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim ie

Set ie=CreateObject("InternetExplorer.Application")
ie.ToolBar=True
ie.MenuBar=True
If WScript.Arguments.Count Then
 ie.Navigate WScript.Arguments.Item(0)
Else
 ie.Width=350
 ie.Height=52
 ie.Top=0
End If
ie.Visible=True
――――――――――――――――――――――――――――――――――――――


けいじ さん 2005年 11月 23日 11時 13分 23秒

はじめまして。
初めての書き込みです。

スクリプト自体のパスを取得する方法として、
こちらにもありますように
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
オブジェクトを作成して
objFSO.GetParentFolderName(WScript.ScriptFullName)
でスクリプトのフルパスを取得できるところまでは確認できました。

ここからが質問なのですが、
WScriptの構文を使用せずにスクリプトのあるパスを取得する方法は
ありますでしょうか。

HTAに組み込むために使用せずにしたいのですが、
何かよい方法がありませんでしょうか。
ご存知の方がいらっしゃいましたら教えていただけませんでしょうか。


みんA さん 2005年 11月 22日 21時 36分 41秒

自己レスです。

どうやら「V2」はバージョン番号だったようです。

参考↓
http://bbs.hotfix.jp/ShowPost.aspx?PostID=3929
ちょっと勘違いをしして・・・ 失礼しました。

みんA さん 2005年 11月 22日 15時 54分 41秒

処理対象端末で適用されているホットフィックスのIDを取得しようとしています。


Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer( strComp,strUser, strPass )
objWMIService.Security_.authenticationLevel = wbemImpersonationLevelImpersonate

If Err.Number <> 0 Then
 '指定コンピュータが存在しない等
 Err.Clear
 MsgBox strComp & "のパッチ適用状況を確認できません。", ,
End If

Set colQuickFixes = objWMIService.ExecQuery("Select * From Win32_QuickFixEngineering")

時折、ホットフィックスID + V2というような番号が取得されるのですが、
これは何を示すものなのか、ご存知ありませんでしょうか。

例えば 「KB893803V2」等
*コントロールパネルのプログラムの追加と削除からみると、該当するホットフィックスIDは「KB893803」となっています。

mokumoku さん 2005年 11月 22日 10時 28分 38秒

やろうとしていることは、「ネットワーク内の実行ファイルを実行させる」ということなのですが、ドライブの割り当て→実行→ドライブ解除をするとランタイムエラーが出てしまいます。
どうすればよいでしょうか。どなたかお力を貸してください。

きたきつね さん 2005年 11月 21日 23時 00分 03秒

To: 管理人むたぐちさん
アドバイス有難う御座います。

[DCOMCnfg.exe]→[コンポーネントサービス]→[コンピュータ]→
[マイコンピュータ]→[DCOMの構成]→[WSHRemote]のプロパティに
適切な値をセットする。

この部分の設定に詳しい方が居ましたアドバイスを頂けませんでしょうか。

また、ネットワークの設定でNetBEUIプロトコルなどをインストールする
必要がありますでしょうか。

管理人むたぐち さん 2005年 11月 21日 20時 31分 42秒

To: きたきつね さん
http://winscript.s41.xrea.com/wiki/index.php?%5B%5BRemoteWSH%5D%5D
は参照されましたでしょうか?

実は私自身もRemoteWSHには一度も成功したことがないので、
成功例の報告が欲しいところだったりします。

きたきつね さん 2005年 11月 21日 19時 55分 01秒

はじめて投稿します。WSH初心者です。
Web上でWSHを調べているうちに、このサイトのことを知りました。

WshController/WshRemoteオブジェクトを使用したスクリプト(testWSH.vbs)を
制御PC上で実行し、リモートPC上でリモート・スクリプト(testRmt.vbs)を
実行したいのですが、制御PC上に以下のエラーが出てしまい、どうもうまく
いきません。

Windows Script Host
スクリプト:C:\work\testWSH.vbs
行    :2
文字   :1
エラー  :リモートサーバマシンが存在しないか、利用できません。
コード  :800A01CE
ソース  :Microsoft VBScript実行時エラー

制御PCとリモートPCは、クロスケーブルで接続して2台でネットワークを
構成しています。制御PC/リモートPCとも以下のレジストリ値は設定
してあります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings
Remote REG_SZ 1

C:\work\testWSH.vbsの内容は以下の通りです。

set objController = WScript.CreateObject("WshController")
set objRemote = objController.CreateScript("testRmt.vbs", "DEF")
objRemote.Execute

C:\work\testRmt.vbsの内容は以下の通りです。

Set objFSO = WScript.CreateOBject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(D:\work\test.txt", 8, True)
objFile.WriteLine "Test of Remoto Script"
objFile.Close

制御PCはWindows2000SP4、リモートPCはWindowsXP Professional SP2です。制御PC/リモートPCともWSHのバージョンは5.6です。

制御側PC/リモートPCのネットワーク設定は以下の以下の通りです。
・Microsoft ネットワーク用クライアント
・Microsoft ネットワーク用ファイルとプリンタ共有
・インターネットプロトコル(TCP/IP)
  IPアドレス   :xxx.xxx.131.60(制御PC), xxx.xxx.131.70(リモートPC)
  サブネットマスク:255.255.248.0
  WINS
   LMHOSTS の参照を有効にする
   NetBIOS over TCP/IP を有効にする。

制御PC/リモートPCのシステムのプロパティで以下のように設定しています。
・コンピュータ名:ABC(制御PC), DEF(リモート)
・ワークグループ:WORKGROUP

制御PC−リモートPC間ではそれぞれ相手のコンピュータ名およびIPアドレスでpingは通っています。

一体何が駄目なのでしょうか?どなたか、ご教授いただけると幸いです。
これからも、このサイトで勉強させて頂ければと思います。

ばんのしゃーによかばんた さん 2005年 11月 21日 17時 13分 02秒

「信頼済みサイトゾーン」のフォルダを作る方法ではありませんが、
ローカルのHTMLファイルを「信頼済みサイトゾーン」で動かすことは可能です。

「about:blank」を「信頼済みサイト」に登録して、
ローカルのHTMLファイルを以下にドロップ.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso
Dim ie
Set fso=CreateObject("Scripting.FileSystemObject")
Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 1000
Loop
ie.Document.write fso.OpenTextFile(WScript.Arguments(0),,,vbUseDefault).ReadAll()
ie.Refresh
――――――――――――――――――――――――――――――――――――――
ところで、この「about:blankを信頼済みサイトに登録する」のは、どうなんでしょう?
ひょっとして危険なことかも。

同様に、「信頼済みサイトゾーン」のフォルダが作れないものかと、
任意のフォルダをabout:hogeやshell:hogeに登録して、それを「信頼済みサイト」や
「イントラネットサイト」に登録してみましたが、ゾーン制御は効かないみたいです。
ショートカット代わりには使えますが。


ばんのしゃーによかばんた さん 2005年 11月 21日 17時 12分 44秒

>ばんのしゃーによかばんた さん 2005年 10月 04日 17時 11分 45秒
>どうせなら、Mark of the WebやZoneIDのようなファイル単位の制御は
>もうやめてしまって、フォルダ単位で制御したほうが筋がよいと思います。
>唯一、Cookiesフォルダで制限付きサイトゾーンだけは出来ますが、
>他のゾーンのフォルダを作る方法はないもんでしょうかね。

「インターネットゾーン」のフォルダも作れます.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim TargetPath
Dim fso
Dim wShell
Dim ShortCutPath
Dim Folder
Dim TextFile
Dim Link
Dim FolderName
Dim Shell
Const ssfINTERNETCACHE=32 '(&H20)     shell:Cache

FolderName=InputBox("インターネットゾーンのフォルダ名",WScript.ScriptName,"インターネット")
If FolderName="" Then WScript.Quit

Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(ssfINTERNETCACHE)

Set fso=CreateObject("Scripting.FileSystemObject")
TargetPath=fso.BuildPath(Folder.Items().Item().Path,FolderName)
Set Folder=fso.CreateFolder(TargetPath)
Folder.Attributes=1
Set Folder=Nothing

Set TextFile=fso.CreateTextFile(fso.BuildPath(TargetPath,"desktop.ini"))
TextFile.WriteLine "[.ShellClassInfo]"
TextFile.WriteLine "IconFile=%SystemRoot%\system32\inetcpl.cpl"
TextFile.WriteLine "IconIndex=7"
TextFile.Close
Set TextFile=Nothing

Set wShell=CreateObject("WScript.Shell")
ShortCutPath=fso.BuildPath(wShell.SpecialFolders("desktop"),fso.GetFileName(TargetPath))
Set Link=wShell.CreateShortcut(ShortCutPath&".lnk")
Link.TargetPath=TargetPath
Link.Save
Set Link=Nothing
WScript.Quit
――――――――――――――――――――――――――――――――――――――

「制限付きサイトゾーン」のフォルダを作る方法はこちら.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim TargetPath
Dim fso
Dim wShell
Dim ShortCutPath
Dim Folder
Dim TextFile
Dim Link
Dim FolderName
Dim Shell
Const ssfCOOKIES=33 '(&H21)          shell:Cookies

FolderName=InputBox("制限付きサイトゾーンのフォルダ名",WScript.ScriptName,"制限付きサイト")
If FolderName="" Then WScript.Quit

Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(ssfCOOKIES)

Set fso=CreateObject("Scripting.FileSystemObject")
TargetPath=fso.BuildPath(Folder.Items().Item().Path,FolderName)
Set Folder=fso.CreateFolder(TargetPath)
Folder.Attributes=1
Set Folder=Nothing

Set TextFile=fso.CreateTextFile(fso.BuildPath(TargetPath,"desktop.ini"))
TextFile.WriteLine "[.ShellClassInfo]"
TextFile.WriteLine "IconFile=%SystemRoot%\system32\inetcpl.cpl"
TextFile.WriteLine "IconIndex=22"
TextFile.Close
Set TextFile=Nothing

Set wShell=CreateObject("WScript.Shell")
ShortCutPath=fso.BuildPath(wShell.SpecialFolders("desktop"),fso.GetFileName(TargetPath))
Set Link=wShell.CreateShortcut(ShortCutPath&".lnk")
Link.TargetPath=TargetPath
Link.Save
Set Link=Nothing
WScript.Quit
――――――――――――――――――――――――――――――――――――――
こうやって、「インターネット/制限付きサイト」ゾーンのフォルダを作って、
HTMLファイルをそこに入れると、「インターネット/制限付きサイト」ゾーンで
開くように出来ます。これなら安全確実です。


ばんのしゃーによかばんた さん 2005年 11月 20日 16時 46分 54秒

>ばんのしゃーによかばんた さん 2005年 11月 12日 16時 09分 34秒
>また、以前は確か、
>Set Folder=Shell.NameSpace(ssfINTERNETCACHE)
>が使えなかったように思うのですが、今、験すと使えます。なぜだろう?
>desktop.iniはUICLSIDのままなのに。

これは、2000/IE5.0とXP/IE6.0の違いなのかも知れません。

>ばんのしゃーによかばんた さん 2005年 11月 10日 17時 52分 58秒
>スクリプトだけで!、Cacheファイルのフルパスを得ることが出来ます!

ところが、Cacheフォルダの一覧には、どうもすべてが表示されている訳では
ないようです。実際には、表示されてるファイルより1桁多いファイルが
非表示で存在します。これは一体どういうことでしょう?
どうにも困ったもんです。こうなると、スクリプトでは手に負えませんね。


ばんのしゃーによかばんた さん 2005年 11月 20日 16時 46分 27秒

プロセスの終了を待ち合わせる方法には、
SWbemServices.ExecNotificationQueryを使う方法もありますが、
これを「正しく」使うにはコツが必要なようです。

よくやりそうなミス。
――――――――――――――――――――――――――――――――――――――
Set SWbemLocator=CreateObject("WbemScripting.SWbemLocator")
Set SWbemServices=SWbemLocator.ConnectServer
Set Win32_Process=SWbemServices.Get("Win32_Process")
RC=Win32_Process.Create("MSHTA.exe",null,null,ProcessID)
If RC Then
 MsgBox RC
 WScript.Quit
End If

'WScript.Sleep 1000     'タイミングをシミュレート

Set ExecNotificationQuery=SWbemServices.ExecNotificationQuery _
("select * from __InstanceDeletionEvent within 1 " & _
"where targetinstance isa 'Win32_Process' " & _
"and targetinstance.ProcessID="&ProcessID)

Set NextEvent=ExecNotificationQuery.NextEvent(5000)
MsgBox NextEvent.TargetInstance.ExecutablePath & " Ended."
――――――――――――――――――――――――――――――――――――――
プロセスを起動してから監視を開始するまでの間にプロセスが終了すると、
事象が抜けます。「脱送」

一般に「脱送」を防止するには、「冗送」側に倒します。
つまり、事象が抜けないように監視開始を先にします。
しかし、そうすると監視開始時にはプロセスIDが分からないので、
広く監視して、後で絞り込みが必要になってちょっと面倒です。
――――――――――――――――――――――――――――――――――――――
Set SWbemLocator=CreateObject("WbemScripting.SWbemLocator")
Set SWbemServices=SWbemLocator.ConnectServer

Set ExecNotificationQuery=SWbemServices.ExecNotificationQuery _
("select * from __InstanceDeletionEvent within .1 " & _
"where targetinstance isa 'Win32_Process' " & _
"and targetinstance.Name = 'mshta.exe'")

Set Win32_Process=SWbemServices.Get("Win32_Process")
RC=Win32_Process.Create("mshta.exe",null,null,ProcessID)
If Rc Then
 MsgBox RC
 WScript.Quit
End If

For k=1 To 5
 Set NextEvent=GetNextEvent(ExecNotificationQuery,100)
 If Err.Number=-2147209215 Then
 ElseIf NextEvent.TargetInstance.ProcessID=ProcessID Then
  MsgBox NextEvent.TargetInstance.ExecutablePath & " Ended."
  WScript.Quit
 End If
 WScript.Sleep 1000
Next
Err.Raise Err.Number

Function GetNextEvent(ExecNotificationQuery,TimeOut)
Set GetNextEvent=Nothing
On Error Resume Next
Set GetNextEvent=ExecNotificationQuery.NextEvent(TimeOut)
End Function
――――――――――――――――――――――――――――――――――――――
一般には、これで万全なはずですが、一筋縄で行かないのが、マ社の伝統文化?
今度は、WITHINが粗いと、その間に生成し消滅した事象が抜けます。「脱送」

そこで、「脱送」側に倒しておいて、「脱送」を検出します。これなら大丈夫。
――――――――――――――――――――――――――――――――――――――
Set SWbemLocator=CreateObject("WbemScripting.SWbemLocator")
Set SWbemServices=SWbemLocator.ConnectServer

Set Win32_Process=SWbemServices.Get("Win32_Process")
RC=Win32_Process.Create("mshta.exe",null,null,ProcessID)
If Rc Then
 MsgBox RC
 WScript.Quit
End If

'WScript.Sleep 1000     'タイミングをシミュレート

Set ExecNotificationQuery=SWbemServices.ExecNotificationQuery _
("select * from __InstanceDeletionEvent within 1 " & _
"where targetinstance isa 'Win32_Process' " & _
"and targetinstance.ProcessID = "&ProcessID)

Set Processes=GetObject("winmgmts:root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID="&ProcessID)

If Processes.Count=0 Then
 MsgBox Processes.Count
 WScript.Quit
End If

Set NextEvent=ExecNotificationQuery.NextEvent(5000)
MsgBox NextEvent.TargetInstance.ExecutablePath & " Ended."
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 11月 19日 16時 05分 35秒

wShell.Runで起こしたプロセスのPIDが「正確に」取れると、
子プロセスの終了も「正確に」待合せが出来るようになります。

wait()
――――――――――――――――――――――――――――――――――――――
Option Explicit

Function GetPID()
〜略〜
End Function

Function GetCPIDs(PPID)
〜略〜
End Function

Sub Wait()
Dim PID
PID=GetPID()
Do
 If UBound(GetCPIDs(PID))<0 Then Exit Do
 WScript.Sleep 100
Loop
End Sub

Dim wShell
Set wShell=CreateObject("WScript.Shell")
wShell.Run("MSHTA.EXE about:blank")
Wait
MsgBox "Ended."
――――――――――――――――――――――――――――――――――――――

waitpid()
――――――――――――――――――――――――――――――――――――――
Option Explicit

Function GetPID()
〜略〜
End Function

Function GetCPIDs(PPID)
〜略〜
End Function

Function GetProcess(PID)
Dim Process
Dim Processes
Set Processes=GetObject("winmgmts:root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID="&PID)
Set GetProcess=Nothing
For Each Process In Processes
 Set GetProcess=Process
Next
End Function

Sub WaitPID(PID)
Dim oExec
Do
 Set oExec=GetProcess(PID)
 If oExec Is Nothing Then Exit Do
 WScript.Sleep 100
Loop
End Sub

Dim wShell
Set wShell=CreateObject("WScript.Shell")
wShell.Run("MSHTA.EXE about:blank")

Dim ProcessID
For Each ProcessID In GetCPIDs(GetPID())
 Exit For
Next
If Not IsEmpty(ProcessID) Then WaitPID ProcessID
MsgBox "Ended"
――――――――――――――――――――――――――――――――――――――


AKA さん 2005年 11月 19日 06時 24分 28秒

DynamicWrapperですが、ソースを少し整理し、Peek/Pokeメソッドの別名をいくつか追加しました。機能的にはほとんど変わっていません。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=DW95605.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D


>>ばんのしゃーによかばんた さん 2005年 11月 11日 15時 20分 42秒

ちなみに、ですが、
If X = "" Then
などとすると、VT_BSTRによる暗黙のVariantChangeType()が行われ、""に変換されるものすべてがTrueに判定されてしまいます。
Empty(VT_EMPTY)はBSTRの""(文字数は0。bstrValは2バイトの0がストアされているメモリ位置をポイント)に変換されますが、vbNullString(bstrVal=0)なども""に変換されます。
しかし、スクリプト言語のどのようなステートメントや式でどのような型変換が行われるのかは、あいまいなので、何が返ってきているかわからない場合は積極的にIsNull()やIsEmpty()を使う方がよいかもしれません。
(VarType()/TypeName()なども使えますが、対象がオブジェクトの場合、VarType()はデフォルトプロパティのVARIANT型を返し(デフォルトプロパティがなければVT_DISPATCH)、TypeName()はIDispatch::GetTypeInfo()の実装から返される任意の情報であるので、結果はオブジェクトによって異なります。)

さらにちなむと(^^;)、NothingはVT_DISPATCH / pdispVal=0になります。

それで、何が入っているかわからない変数の中身の型を知りたい場合、IsNull()やIsEmpty()やIsObject()などを列記するのも面倒ですし、取りこぼす可能性があるので、簡単確実に調べるのには、DynamicWrapper6を使うことができます。
VariantType()を使えば間違いなくVARIANT型が得られます。
ただし、VBScriptにおいては、変数をそのまま入れると、変数を示す型'VT_BYREF|VT_VARIANT'(&H400C)が返されるだけですので、以下のようにします。
VariantType((X))
こうするとXが値化されて、Xの中身の型が出てきます。

他にも、PeekとVarPtrを組み合わせて使えば、同じことができます。もちろんPeekとVarPtrを使えば変数の中身の型だけでなく、中身の本体データも得られます。
中身のデータをチェックすれば、vbNullStringかどうか、Nothingかどうか、という情報も「一様な」コーディングで確実に得ることができます。

(JScriptではVarPtrが役に立たないため、実は今回このような目的に使える新たなメソッドをこっそりと追加しました)


>>管理人むたぐち さん 2005年 11月 07日 18時 19分 11秒

まあ確かに
>ばんのしゃーによかばんた さん 2005年 11月 07日 14時 59分 49秒
は騒ぎすぎですが、
>指摘だけで情報量0
ってのも何ですな〜。情報がないとダメだと言うのなら、恐ろしくて何も書けませんわな。

>Windowsの問題点を指摘する
のも、Windowsのあらゆる面を操作することになるスクリプティング技術の話なので仕方がないのでは?
いつ修正されるのかさっぱりわからないバグや問題点が(MS以外のものも含め)数多くあることや、修正されていてもいろいろな理由で古いバージョンを使っているユーザーも実際には多いことなどを考えると、問題点を「マイクロソフトへの通報」という形だけで済まさず、掲示板でみんなに知らしめるのは意義がないとは言えないと思います。

>ご自分でブログを立ち上げて行うなどしていただきたいと思います。
くだらないです。


>>Katsumi さん 2005年 11月 02日 02時 14分 03秒
blog拝見しました。何か、みんな同じような事を考えるんですね・・・
私も当初、メモリを直接扱うために「DLLが使えるんだから」と思って、非オートメーションのヘルパーDLLを作りましたが、DW(DynamicWrapper)が無いと意味をなさないDLLに今一つな感じを持ったので、DWに組み込んでみました。DW自体に必要な機能だとも思いましたし・・・

それに何より、DWはそもそもJScriptだけを対象に作られているので、修正をしないとVBScriptでは正しく動作しません。
(追加された'i=r'や、9x版は、完全にバグってます(^^;))

DW6に関しても何か書いていただけたらうれしく思います。9x用ですが、NT系でも使えます。オリジナルのNT版は同梱のソースとバイナリが一致していませんし・・・

Typeステートメントと似たメソッドを導入する計画はあるのですが、著作権関係が明確でないので今一つやる気が・・・

あと、IUnknownさんのWebページはご覧になりましたか?

管理人むたぐち さん 2005年 11月 16日 19時 13分 33秒

To: higap さん

ASPの話だったのですか?
そこは重要なので省略しないでください(^^;

> 保存ダイアログを表示させる方法は既に知っていまして、表示させるタイミングで
> ファイル等に書き出せるところまで知っています。で、ダイアログの保存又はキャ
> ンセルボタンが押されたタイミングでの書き出しができないと言われました。

・どのように保存ダイアログを表示しているか
・書き出しができないとは「何」が「どこ」に「どのように」できないのか

を明確にしてください。さもないと、誰にも答えられないと思いますよ。

higap さん 2005年 11月 16日 18時 14分 25秒

管理者 様

ご回答いただいきありがとうございます。
ただ、自分もASPのことをあまりよくわかってないもので、説明不足で大変申し訳
ないですが、少しニュアンスが違います。

保存ダイアログを表示させる方法は既に知っていまして、表示させるタイミングで
ファイル等に書き出せるところまで知っています。で、ダイアログの保存又はキャ
ンセルボタンが押されたタイミングでの書き出しができないと言われました。
ここからは自分の勝手な考えですが、ダイアログを表示されるのがサーバ側でなく
クライアント側になると、どのボタンが押されたのかサーバ側で認識できないか
ら、ボタンを押すタイミングでの書き出しができないのかなと思っているのです
が・・・

ばんのしゃーによかばんた さん 2005年 11月 16日 16時 47分 49秒

自身のプロセスIDが「正確に」取れると、
wShell.Runで起こしたプロセスのPIDなども「正確に」取れるようになります。
――――――――――――――――――――――――――――――――――――――
Option Explicit

Function GetPID()
Dim wShell
Dim oExec
Dim Processes
Dim Process
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("MSHTA.EXE -")
Set Processes=GetObject("winmgmts:root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID="&oExec.ProcessID)
If Processes.Count<>1 Then
 oExec.Terminate
 Err.Raise 9
End If
For Each Process In Processes
 GetPID=Process.ParentProcessID
Next
oExec.Terminate
End Function

Function GetCPIDs(PPID)
Dim Process
Dim Processes
Dim CPIDs:CPIDs=Array()
Set Processes=GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE ParentProcessID="&PPID)
For Each Process In Processes
 ReDim Preserve CPIDs(UBound(CPIDs)+1)
 CPIDs(UBound(CPIDs))=Process.ProcessID
Next
GetCPIDs=CPIDs
End Function

Dim wShell
Set wShell=CreateObject("WScript.Shell")
wShell.Run "NOTEPAD.EXE"
wShell.Run "CMD.EXE /CNOTEPAD.EXE"
wShell.Run "CMD.EXE /CSTART NOTEPAD.EXE"
'wShell.Run "hoge.txt"

DIM CPIDs
CPIDs=GetCPIDs(GetPID())
MsgBox UBound(CPIDs)+1&vbLf&Join(CPIDs,vbLf)

Dim CPID
DIM GCPIDs
For Each CPID In CPIDs
 GCPIDs=GetCPIDs(CPID)
 MsgBox UBound(GCPIDs)+1&vbLf&Join(GCPIDs,vbLf)
Next
――――――――――――――――――――――――――――――――――――――
CMD.EXE /C経由だと孫プロセスになります。
子プロセスが先に終了すると、孫プロセスは行方不明になります。
「関連付け」でも親子になります。


管理人むたぐち さん 2005年 11月 16日 15時 10分 36秒

To: higa さん
ファイルの保存ダイアログを表示させる方法については、
ばんのしゃーによかばんた さん 2004年 11月 28日 16時 16分 49秒
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list121.shtml
の記事を参考にしてください。

処理結果をテキストファイルに書き出す方法については
Lesson15などを参考にしてください。

higa さん (k_higap@yahoo.co.jp) 2005年 11月 16日 10時 30分 44秒

ファイルの保存ダイアログを表示して、保存・キャンセルボタンを
押したタイミングでログファイル等に処理結果として出力させる事
はできないでしょうか?
ちなみに、Windowsのイベントログへの書き込みはしたくありません。

ばんのしゃーによかばんた さん 2005年 11月 15日 16時 01分 57秒

自身のプロセスIDを「正確に」取り出す方法です。
――――――――――――――――――――――――――――――――――――――
Option Explicit

Function GetPID()
Dim wShell
Dim oExec
Dim Processes
Dim Process
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("MSHTA.EXE -")
Set Processes=GetObject("winmgmts:root\CIMV2").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessID="&oExec.ProcessID)
If Processes.Count<>1 Then
 oExec.Terminate
 Err.Raise 9
End If
For Each Process In Processes
 GetPID=Process.ParentProcessID
Next
oExec.Terminate
End Function

MsgBox GetPID()
――――――――――――――――――――――――――――――――――――――
ただし、MSHTA.EXEが不正なURLを指定したときに非表示で残る、(たぶん)「障害」を
利用しているので、将来、修正で「直る」かも知れません。
そのときは、別の非表示のWindowsアプリを探さねばなりません。


管理人むたぐち さん 2005年 11月 15日 00時 37分 43秒

To: よしこ さん

コンピュータ名の変更は、
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list145.shtml
ちゃっぴ さん 2005年 10月 07日 23時 41分 03秒
の記事が参考になると思います。

テキストファイルの読み込みについてはLesson15などをご覧ください。


よしこ さん 2005年 11月 14日 19時 04分 06秒

はじめて投稿します。
もしご存知なら教えてください。
コンピュータのホスト名を、txtファイルにあるテーブルをみながら、変更したいと思っています。
例:aaaをbbbに変更、cccをdddに変更
aaa bbb
ccc ddd

やはりデータベースを使わないとできないのでしょうか。
DBを使うと容易にできそうなのですが・・・

管理人むたぐち さん 2005年 11月 13日 21時 10分 11秒

To: じゅの さん

WMIのroot\microsoft\homenet名前空間にある、HNet_ConnectionPortMapping2クラスを
使えば、値の取得だけは可能ですね
http://www.microsoft.com/japan/technet/scriptcenter/scripts/network/home/nwhmvb08.mspx

…と思ったら、なにやら良く分からないポート番号が列挙されてしまいます。
何の値でしょうね、これは。

じゅの さん 2005年 11月 13日 20時 09分 17秒

To:管理人むたぐち さん 2005年 11月 13日 18時 17分 39秒

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

> Windows ファイアウォールはServer 2003 SP1からの機能なので、SP1を
インストールすれば可能です。
実は私もそう思っていたのですが、SP1を入れていない2003にも
コントロールパネル→ネットワーク接続→ローカルエリア接続
を右クリックしてプロパティを見ると詳細設定の所にファイアウォールの設定っていうのが一応ありますよね。
このファイアウォールを有効にするとアクセス不可になるので動作はしているようです。
SP1を入れる前には先に挙げたスクリプトは使えませんでしたが、入れた後なら使えました。
あとは入れる前の2003でも何とか出来れば良いのですが・・・

>http://www.microsoft.com/japan/technet/scriptcenter/solutions/appcompat/default.mspx
>http://www.microsoft.com/japan/technet/scriptcenter/scripts/network/firewall/default.mspx
実はこちらの英語ページを読んでいたのですが2003は対応してないと読み取れました。
そうするとSP1を入れる前の環境では同じスクリプトじゃ駄目っぽいですよねぇ・・・。

SendKeysとかで無理やり頑張るしか無いのかなぁ。
WSHじゃ無くなるかも知れないですが何か解決案あるでしょうか?



管理人むたぐち さん 2005年 11月 13日 18時 17分 39秒

To: じゅの さん

> XPのSP2だと
> CreateObject("HNetCfg.FWOpenPort")
> みたいな感じでfirewallのポートを開けたり閉じたり出来ますが
> 2003serverでも似たような感じで出来ないでしょうか?

Windows ファイアウォールはServer 2003 SP1からの機能なので、SP1を
インストールすれば可能です。

これだけではなんですので、スクリプトセンターにある、XPSP2の場合の
サンプルへのリンクを張っておきます。基本的にServer 2003 SP1でも
改変なしで動作するはずです。
http://www.microsoft.com/japan/technet/scriptcenter/solutions/appcompat/default.mspx
http://www.microsoft.com/japan/technet/scriptcenter/scripts/network/firewall/default.mspx

ばんのしゃーによかばんた さん 2005年 11月 13日 17時 00分 55秒

>ばんのしゃーによかばんた さん 2005年 11月 11日 15時 20分 22秒
>システムのタイムゾーンをスクリプトから変更できないものでしょうか?
>予防線を張っておくと、SendKeysなしで。ブートなし即時反映で。
>DynaCall等のAPI利用もなし。という一般条件でお願いします。

探しましたが、見つかりません。
やっぱり、SendKeysするしかないのでしょうか。

Set wShell=CreateObject("WScript.Shell")
wShell.Run "control.exe timedate.cpl"
Do While Not wShell.AppActivate("日付と時刻のプロパティ")
 WScript.Sleep 100
Loop
wShell.SendKeys "^{tab}"
wShell.SendKeys "{home}{down 26}"
WScript.Sleep 5000
wShell.SendKeys "{home}{down 63}"

こういうリストボックス?は先頭数文字は一意な半角英数字にしてほしい。
SendKeysでより確実に選択できるもん。英語圏ばっかり、ズルイ!
(GMT)の ( にだけ反応して、全角英字には反応しない。同様に、
スクリプトからはSekdKeys出来ませんが、ひらがなや漢字も駄目で、
なぜか全角カタカナだけは反応します。ちょっと不思議です。


じゅの さん 2005年 11月 13日 16時 08分 26秒

XPのSP2だと
CreateObject("HNetCfg.FWOpenPort")
みたいな感じでfirewallのポートを開けたり閉じたり出来ますが
2003serverでも似たような感じで出来ないでしょうか?

ちゃっぴ さん 2005年 11月 13日 00時 50分 43秒

To komo さん 2005年 11月 12日 18時 02分 49秒

> 単純にファイルコピーしたところ、隠しファイルが普通のファイルなったり、
> XPのお気に入りのアイコンがフォルダになったりします。

それどうやっています?

komo さん 2005年 11月 12日 23時 51分 20秒

To ちゃっぴ さん 2005年 11月 12日 23時 14分 36秒
単純にファイルコピーする方法は、分かります。
単純にファイルコピーしたところ、隠しファイルが普通のファイルなったり、
XPのお気に入りのアイコンがフォルダになったりします。
UserProfileと言うメソッドがあるかなと思いまして。
ちょっと自分で検索してみます。
ありがとうございました

ちゃっぴ さん 2005年 11月 12日 23時 14分 36秒

To komo さん 2005年 11月 12日 18時 02分 49秒

> ユーザープロファイルのコピーってWSHで作ることができるんでしょうか?

普通に User Profile を Copy してやればいいだけでしょう。
もしかして、それがわからないということ?
Default では、Document And Settings 配下にある
UserName の Directory です。

削除となると Registry にゴミが残るので、
ちょいと解析してやる必要がありますが…

> コンピュータ名の変更は、取得する方法は、あるのだから、
> たぶんあると思うのですが、どうなんでしょうか?

最近まったく同じ質問があったので、Logをあさってください。

komo さん 2005年 11月 12日 18時 02分 49秒

日々、WSHを勉強しているものなんですが、
ユーザープロファイルのコピーってWSHで作ることができるんでしょうか?
コンピュータ名の変更は、取得する方法は、あるのだから、たぶんあると
思うのですが、どうなんでしょうか?

WSHは、どこまでWindos操作ができるのかとこの頃思い始めてきました。

ばんのしゃーによかばんた さん 2005年 11月 12日 16時 09分 34秒

>ばんのしゃーによかばんた さん 2005年 11月 10日 17時 52分 58秒
>ところで、なんで、Cacheファイルのフルパスが欲しかったのか、
>と思い出してみると、IE表示中のページを保存することだったのですが、
>それだけなら、CacheフォルダをURLで検索して、FolderItemを得れば、
>CopyHereか、Copy&Pasteで出来たりして、フルパスは必要なかったですね。

SaveCache.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim Shell
Dim Folder
Dim FolderItem
Dim Verb
Dim ie
Dim URL
Const ssfINTERNETCACHE=32     'shell:Cache
Const BIF_EDITBOX=&H10
Const FOF_RENAMEONCOLLISION=&H8
Const BIF_RETURNONLYFSDIRS=&H1

Set Shell=CreateObject("Shell.Application")
Set ie=Shell.Windows().Item()
If TypeName(ie.Document)<>"HTMLDocument" Then
 WScript.Echo TypeName(ie.Document)
 WScript.Quit
End If
URL=ie.LocationURL
Set ie=CreateObject("InternetExplorer.Application")
'ie.Visible=True
ie.Navigate2 ssfINTERNETCACHE
Do While ie.Busy Or ie.ReadyState<>4
 WScript.Sleep 100
Loop
'MsgBox Escape(ie.StatusText)
Do While InStr(ie.StatusText,"個のオブジェクト")=0
 WScript.Sleep 100
Loop
Set Folder=ie.Document.Folder
For Each FolderItem In Folder.Items()
 If Folder.GetDetailsOf(FolderItem,1)=URL Then Exit For
Next
If IsEmpty(FolderItem) Then
 WScript.Echo "Not found. -",URL
 ie.Quit
 WScript.Quit
End If
Set Folder=Shell.BrowseForFolder(0,WScript.ScriptName&vbLf&URL&vbLf&"を保存します。保存先フォルダを選択してください。",BIF_RETURNONLYFSDIRS+BIF_EDITBOX)
If Not Folder Is Nothing Then
 Folder.CopyHere FolderItem,FOF_RENAMEONCOLLISION
End If
ie.Quit
WScript.Quit
――――――――――――――――――――――――――――――――――――――
ここで、なぜか、FOF_RENAMEONCOLLISIONが効きません。
FileSystem同士でないとだめなのかも。
ちょっと面倒ですが、一旦、空のフォルダにCopyHereしてから、
指定フォルダにMoveHere FOF_RENAMEONCOLLISIONするといいみたい。
空のフォルダは、Folder.NewFolderでも作れますが、削除はFSOなので、
最初からFSOで作ったほうがよさそう。

また、以前は確か、
Set Folder=Shell.NameSpace(ssfINTERNETCACHE)
が使えなかったように思うのですが、今、験すと使えます。なぜだろう?
desktop.iniはUICLSIDのままなのに。

SaveCache2.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim Shell
Dim Folder
Dim FolderItem
Dim Verb
Dim ie
Dim URL
Const ssfINTERNETCACHE=32     'shell:Cache
Const BIF_EDITBOX=&H10
Const FOF_RENAMEONCOLLISION=&H8
Const BIF_RETURNONLYFSDIRS=&H1

Set Shell=CreateObject("Shell.Application")
Set ie=Shell.Windows().Item()
If TypeName(ie.Document)<>"HTMLDocument" Then
 WScript.Echo TypeName(ie.Document)
 WScript.Quit
End If
URL=ie.LocationURL
Set Folder=Shell.NameSpace(ssfINTERNETCACHE)
For Each FolderItem In Folder.Items()
 If Folder.GetDetailsOf(FolderItem,1)=URL Then Exit For
Next
If IsEmpty(FolderItem) Then
 WScript.Echo "Not found. -",URL
 ie.Quit
 WScript.Quit
End If
Set Folder=Shell.BrowseForFolder(0,WScript.ScriptName&vbLf&URL&vbLf&"を保存します。保存先フォルダを選択してください。",BIF_RETURNONLYFSDIRS+BIF_EDITBOX)
If Not Folder Is Nothing Then
 Folder.CopyHere FolderItem,FOF_RENAMEONCOLLISION
End If
WScript.Quit
――――――――――――――――――――――――――――――――――――――


ばんのしゃーによかばんた さん 2005年 11月 12日 16時 09分 12秒

文字列変換のアイデアです。

Const NarrowUpperCase="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Function StrConv(Str,Conversion)
Dim k,table,char
For k=1 To Len(Str)
 char=Mid(Str,k,1)
 table=Conversion&char
 StrConv=StrConv&Mid(table,InStr(1,table,char,vbTextCompare),1)
Next
End Function

MsgBox StrConv("AaAaあ",NarrowUpperCase)


管理人むたぐち さん 2005年 11月 11日 22時 23分 43秒

To: WSH初心者 さん

Set oMachine = GetObject("WinNT://" & strComputer)
Set oInfoUser = GetObject("WinNT://" & strComputer & "/Administrator,user")
set oUser = oMachine.MoveHere(oInfoUser.ADsPath,"root")
oUser.FullName="root"
oUser.SetInfo

のように、FullNameプロパティを指定してやると良いでしょう。

このあたりはちゃっぴさんもご指摘の通り、VBAの「オブジェクトブラウザ」で
"Active DS Type Library"を参照設定し、IAdsUserクラスのメンバを
眺めていれば発見できます。
ぜひ、ご自分で問題に対処できる能力を身に付けられてください。

管理人むたぐち さん 2005年 11月 11日 21時 49分 45秒

↓の投稿、結局うまくいったかどうかが曖昧でしたので補足です。
Set FolderItem=Folder.Items().Item(1)
だと問題なく各種プロパティを取得できました。

管理人むたぐち さん 2005年 11月 11日 21時 46分 33秒

To: ばんのしゃーによかばんた さん 2005年 11月 10日 17時 52分 31秒

了解いたしました。
ご協力に感謝します。


To: ばんのしゃーによかばんた さん 2005年 11月 11日 15時 20分 22秒

> >管理人むたぐち さん 2005年 10月 15日 20時 09分 53秒
> >dModifyDate = oItem1.ModifyDate 'ここでうまく値が取れない
>
> むたぐちさんのほうでは、うまく行かないんですよね。
> なんででしょうね。違いはIISか、或はタイミングでしょうか。

試してみたところ、FTPフォルダにおいて、
Set FolderItem=Folder.Items().Item(1)
はちゃんとしたFolderItemオブジェクトが取得されているのに対し、
Set FolderItem=Folder.Items().Item(sFile)や
Set FolderItem=Folder.ParseName(sFile)が、不正なFolderItemオブジェクトを
格納しているためだと判明しました。

不正なFolderItemオブジェクトとは、オブジェクトとしては正しくFolderItem
オブジェクトであるにも関わらず、各種プロパティが(おそらく)初期値のまま
になってしまっているものを言います。

それどころか、FTPフォルダにおいては、sFileに存在しないファイルを
指定しても、不正なFolderItemオブジェクトを生成できてしまいます。
# FileSystemにあるフォルダの場合は、sFileが存在しないファイルだと
# エラーが発生する。

この問題の回避法としては、FolderItemsでループをまわし、FolderItem.Nameが
一致するFolderItemオブジェクトを抽出して各種プロパティの値を
読む、ということになるでしょうか。

> ところで、エクスプローラでFTPからファイルをコピーするとタイムスタンプが
> 保存されるみたいな記事がありましたが、本当でしょうか?

IIS→ローカル、の場合、タイムスタンプは保持されませんでした。

WSH初心者 さん 2005年 11月 11日 17時 18分 31秒

To ちゃっぴ さん
ちゃっぴさんありがとうございました。うまく、アカウント名の変更できました。
でも、ログインIDとパスワードは、変更できたんですが、なぜかスタートメニューに表示されている名前だけ変わらないのなぜでしょうか?
変える方法は、ご存知でしょうか?

ばんのしゃーによかばんた さん 2005年 11月 11日 15時 20分 42秒

InputBox/prompt格闘記です。過去記事にこういう話はないようなので。

URLをInputBoxで入力しようとしたら、入力は、たった!255Bytesなんです。
ヘルプには、出力が1024Bytesと丁寧に書いてあるのに、肝心の入力は書いてない!

で、仕方ないので、ie.Document.parentWindow.promptを使うことにしました。
こっちは限界を試してないけど、404BytesのURLは入りました。:-)

InputBoxのキャンセルはEmptyなので、""OKと同一視するには、
x=InputBox(...)
If x="" Then ...
でよかったのですが、

promptのキャンセルはnull(書いてない!)なので、""OKと同一視するには、
x=ie.Document.parentWindow.prompt()
If x<>"" Then
Else
 ...
End If
になります。

ところで、過去記事を見ると、
>管理人むたぐち さん 2004年 11月 11日 14時 26分 19秒
>promptでもいいんですが、InputBoxみたいに「キャンセル」を押したときの判別が
>できない上に、一行しか文字列を表示できない…。

これは、上のnullのことですよね?
x=ie.document.parentWindow.prompt()
If x<>"" Then
 MsgBox x
ElseIf x="" Then
 MsgBox "空"
Else
 MsgBox "キャンセル"
End If

IsNullも使えます。
If IsNull(x) Then
 MsgBox "キャンセル"
ElseIf x="" Then
 MsgBox "空"
Else
 MsgBox x
End If
こういうことじゃなかったりして。。。

また、promptの説明に、
|String or Integer. Returns the value typed in by the user.
と書いてあったので、数字を入れるとIntegerになるのかと思って、
1234と入れてみましたが、Stringでした。???
やはり、
If IsNumeric(x) Then x=CLng(x)
としてやらないと駄目ですね。

ここで、xは"1234"でもよいようで、わざわざ全角数字を半角数字に
変換する必要がなくて便利です。
逆に、それを利用すると、全角数字を半角数字に簡単に変換できます。
hankaku=CStr(CLng(zenkaku))


ばんのしゃーによかばんた さん 2005年 11月 11日 15時 20分 22秒

その後もFTPのパターンを変えて試しているのですが、

URL="ftp://upload.vector.co.jp/pack/incoming"
Set shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(URL)
Set FolderItem=Folder.Items().Item(1)
WScript.Echo Join(Array(FolderItem.Path,FolderItem.Name,FolderItem.Size,FolderItem.ModifyDate),vbLf)

で、問題なく取れてしまいます。

>管理人むたぐち さん 2005年 10月 15日 20時 09分 53秒
>dModifyDate = oItem1.ModifyDate 'ここでうまく値が取れない

むたぐちさんのほうでは、うまく行かないんですよね。
なんででしょうね。違いはIISか、或はタイミングでしょうか。

そう云えば、Cacheフォルダの場合、GetDetailsOfは取れても、
Sizeは0、ModifyDateは0:00:00でした。
ひょっとして、FTPフォルダがCacheされているとか、あるのかなぁ。

ところで、エクスプローラでFTPからファイルをコピーするとタイムスタンプが
保存されるみたいな記事がありましたが、本当でしょうか?
|KB415063
|なお、過去 9 時間以内に更新されたファイルが誤って去年のファイルとして表示された場合でも、ダウンロードは問題なく動作します。この際、ダウンロードされるファイルは Internet Explorer で表示されている日付になりますが、その他のファイルの内容には問題はありません。
もし、そうなら、わざわざスクリプトを作る必要がなくなってしまいます。???

またまた、ところで、システムのタイムゾーンをスクリプトから変更できないものでしょうか?
予防線を張っておくと、SendKeysなしで。ブートなし即時反映で。
DynaCall等のAPI利用もなし。という一般条件でお願いします。


sue さん 2005年 11月 11日 10時 09分 31秒

To ちゃっぴ さん 2005年 11月 11日 01時 06分 52秒

数値を変えて試行しました結果
WScript.Sleep 1000 で
お行儀良く順番どおりに開いてくれました\(^o^)/

敏速で的確なご指示ありがとうございました。

仕事(製図)で使っているのですが…
案件ごとに必要な 5〜30ファイル をバサッと開くことから
仕事を始めますので、このスクリプトを案件ごとに用意して
日々使っております。おかげ様でさらに使いやすくなりました。
ありがとうございました。

Return