>YU-TANG さん 2005年 11月 28日 17時 13分 05秒
>これで今度からは大丈夫そうです。
記事が役立ったと分かって、うれしいです。
投稿しても、反響がないと、需要がないのかなぁと思えて、
そろそろ引き時かなと考えていたところです。
需要があるなら、もう少し続けますかね。
># でも何でサイズ指定で出てくるのかしらん。
これは、既にIEを開いていて、あっ「オフライン作業」がない!、というときに、
「お気に入り」や「リンク」から起動して、制御パネル風に常駐表示させよう、
という制作意図です。IEの起動に用いるのは、用途外使用です。と言うか、
実は、初めから、IEを「オフライン作業」メニュー付きで起動するだけなら、
スクリプトを使うまでもなく、もっと簡単に出来ます。
ただ、そうなると、WSH/スクリプティングと関係のない話になってしまうので、
この掲示板向きに、スクリプト話に仕立てたのです。
なので、こちらで割愛したWindows/障害の話は、どこか余所で聞いてください。
》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. プロセスが存在しなくなったら、処理開始。
頻繁に起動と終了を繰り返すプロセスでなければ、多分いけるかと。(未確認)
ここではお初になります。WSH(VBS or JS) で
起動中のプロセス(実行ファイル名が分かっている)を監視して
そのプロセスが全て終了した際に処理を行う事は可能でしょうか?
宜しくお願いいたします。
To: けいじ さん
location.pathnameがWScript.ScriptFullNameに対応するDOMのプロパティになります。
ただし、空白スペースが%20に置換されているなど、そのままでは
使用できないので、適宜変換を入れてやる必要があります。
詳しくはlocation.pathnameを検索キーにして
ログを当たってみてください。
ちょっとどれだけ項目があったか忘れてしまったので…。
いつも勉強させていただいております。
諸先生方がお忙しそうなので、間違ってるかもしれないけど僭越ながら。
>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を別ファイルにしなくてもいいような気もしますね。
>ばんのしゃーによかばんた さん 2005年 11月 25日 16時 15分 39秒
>IEの「ファイル」メニューに「オフライン作業」を表示する.VBS
たまに、少し前に見たけど今は消されているページの内容を確認
したいときがあったりして、今までは [オフライン作業] コマンドが
出てこないのでキャッシュをあさりに行ったりしていました。
これで今度からは大丈夫そうです。
ありがとう。
# でも何でサイズ指定で出てくるのかしらん。
よろしくお願いします。
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)
To じょに さん 2005年 11月 27日 11時 32分 54秒
おそらく、Computer に疎い人のための対策と想定しますが、
そういうことを User に理解させずに使わせること自体が
Virus とか Malware を蔓延させる原因となります。
EXE の実行が認められていないから、VBS でということに
なったのでしょうけど、 VBS も削除される Mail Client もありますよ。
このようなことは、Malware の作者がやろうとすることで、
そんなことはせずに、地道に User 教育をなさることをお勧めします。
txtファイルとvbsファイルをメール送信して、受信者がvbsを開いたら
txtをexeファイルに変換して、exeファイルを実行させたいのですが、
パスの取得がうまくいきません。
誰かアドバイスお願いします。
>ばんのしゃーによかばんた さん 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
――――――――――――――――――――――――――――――――――――――
すると、確かに右下のインディケータは「信頼済みサイト」になりますが、
どうも、実際には、マイコンピュータゾーンで動いているようです。
これは障害ですね。残念。将来的には修正されて使えるかも。
>管理人むたぐち さん 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
――――――――――――――――――――――――――――――――――――――
はじめまして。
初めての書き込みです。
スクリプト自体のパスを取得する方法として、
こちらにもありますように
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
オブジェクトを作成して
objFSO.GetParentFolderName(WScript.ScriptFullName)
でスクリプトのフルパスを取得できるところまでは確認できました。
ここからが質問なのですが、
WScriptの構文を使用せずにスクリプトのあるパスを取得する方法は
ありますでしょうか。
HTAに組み込むために使用せずにしたいのですが、
何かよい方法がありませんでしょうか。
ご存知の方がいらっしゃいましたら教えていただけませんでしょうか。
自己レスです。
どうやら「V2」はバージョン番号だったようです。
参考↓
http://bbs.hotfix.jp/ShowPost.aspx?PostID=3929
ちょっと勘違いをしして・・・ 失礼しました。
処理対象端末で適用されているホットフィックスの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」となっています。
やろうとしていることは、「ネットワーク内の実行ファイルを実行させる」ということなのですが、ドライブの割り当て→実行→ドライブ解除をするとランタイムエラーが出てしまいます。
どうすればよいでしょうか。どなたかお力を貸してください。
To: 管理人むたぐちさん
アドバイス有難う御座います。
[DCOMCnfg.exe]→[コンポーネントサービス]→[コンピュータ]→
[マイコンピュータ]→[DCOMの構成]→[WSHRemote]のプロパティに
適切な値をセットする。
この部分の設定に詳しい方が居ましたアドバイスを頂けませんでしょうか。
また、ネットワークの設定でNetBEUIプロトコルなどをインストールする
必要がありますでしょうか。
To: きたきつね さん
http://winscript.s41.xrea.com/wiki/index.php?%5B%5BRemoteWSH%5D%5D
は参照されましたでしょうか?
実は私自身もRemoteWSHには一度も成功したことがないので、
成功例の報告が欲しいところだったりします。
はじめて投稿します。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は通っています。
一体何が駄目なのでしょうか?どなたか、ご教授いただけると幸いです。
これからも、このサイトで勉強させて頂ければと思います。
「信頼済みサイトゾーン」のフォルダを作る方法ではありませんが、
ローカルの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年 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月 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桁多いファイルが
非表示で存在します。これは一体どういうことでしょう?
どうにも困ったもんです。こうなると、スクリプトでは手に負えませんね。
プロセスの終了を待ち合わせる方法には、
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."
――――――――――――――――――――――――――――――――――――――
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"
――――――――――――――――――――――――――――――――――――――
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ページはご覧になりましたか?
To: higap さん
ASPの話だったのですか?
そこは重要なので省略しないでください(^^;
> 保存ダイアログを表示させる方法は既に知っていまして、表示させるタイミングで
> ファイル等に書き出せるところまで知っています。で、ダイアログの保存又はキャ
> ンセルボタンが押されたタイミングでの書き出しができないと言われました。
・どのように保存ダイアログを表示しているか
・書き出しができないとは「何」が「どこ」に「どのように」できないのか
を明確にしてください。さもないと、誰にも答えられないと思いますよ。
管理者 様
ご回答いただいきありがとうございます。
ただ、自分もASPのことをあまりよくわかってないもので、説明不足で大変申し訳
ないですが、少しニュアンスが違います。
保存ダイアログを表示させる方法は既に知っていまして、表示させるタイミングで
ファイル等に書き出せるところまで知っています。で、ダイアログの保存又はキャ
ンセルボタンが押されたタイミングでの書き出しができないと言われました。
ここからは自分の勝手な考えですが、ダイアログを表示されるのがサーバ側でなく
クライアント側になると、どのボタンが押されたのかサーバ側で認識できないか
ら、ボタンを押すタイミングでの書き出しができないのかなと思っているのです
が・・・
自身のプロセス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経由だと孫プロセスになります。
子プロセスが先に終了すると、孫プロセスは行方不明になります。
「関連付け」でも親子になります。
To: higa さん
ファイルの保存ダイアログを表示させる方法については、
ばんのしゃーによかばんた さん 2004年 11月 28日 16時 16分 49秒
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list121.shtml
の記事を参考にしてください。
処理結果をテキストファイルに書き出す方法については
Lesson15などを参考にしてください。
ファイルの保存ダイアログを表示して、保存・キャンセルボタンを
押したタイミングでログファイル等に処理結果として出力させる事
はできないでしょうか?
ちなみに、Windowsのイベントログへの書き込みはしたくありません。
自身のプロセス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アプリを探さねばなりません。
To: よしこ さん
コンピュータ名の変更は、
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list145.shtml
ちゃっぴ さん 2005年 10月 07日 23時 41分 03秒
の記事が参考になると思います。
テキストファイルの読み込みについてはLesson15などをご覧ください。
はじめて投稿します。
もしご存知なら教えてください。
コンピュータのホスト名を、txtファイルにあるテーブルをみながら、変更したいと思っています。
例:aaaをbbbに変更、cccをdddに変更
aaa bbb
ccc ddd
やはりデータベースを使わないとできないのでしょうか。
DBを使うと容易にできそうなのですが・・・
To: じゅの さん
WMIのroot\microsoft\homenet名前空間にある、HNet_ConnectionPortMapping2クラスを
使えば、値の取得だけは可能ですね
http://www.microsoft.com/japan/technet/scriptcenter/scripts/network/home/nwhmvb08.mspx
…と思ったら、なにやら良く分からないポート番号が列挙されてしまいます。
何の値でしょうね、これは。
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じゃ無くなるかも知れないですが何か解決案あるでしょうか?
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月 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出来ませんが、ひらがなや漢字も駄目で、
なぜか全角カタカナだけは反応します。ちょっと不思議です。
XPのSP2だと
CreateObject("HNetCfg.FWOpenPort")
みたいな感じでfirewallのポートを開けたり閉じたり出来ますが
2003serverでも似たような感じで出来ないでしょうか?
To komo さん 2005年 11月 12日 18時 02分 49秒
> 単純にファイルコピーしたところ、隠しファイルが普通のファイルなったり、
> XPのお気に入りのアイコンがフォルダになったりします。
それどうやっています?
To ちゃっぴ さん 2005年 11月 12日 23時 14分 36秒
単純にファイルコピーする方法は、分かります。
単純にファイルコピーしたところ、隠しファイルが普通のファイルなったり、
XPのお気に入りのアイコンがフォルダになったりします。
UserProfileと言うメソッドがあるかなと思いまして。
ちょっと自分で検索してみます。
ありがとうございました
To komo さん 2005年 11月 12日 18時 02分 49秒
> ユーザープロファイルのコピーってWSHで作ることができるんでしょうか?
普通に User Profile を Copy してやればいいだけでしょう。
もしかして、それがわからないということ?
Default では、Document And Settings 配下にある
UserName の Directory です。
削除となると Registry にゴミが残るので、
ちょいと解析してやる必要がありますが…
> コンピュータ名の変更は、取得する方法は、あるのだから、
> たぶんあると思うのですが、どうなんでしょうか?
最近まったく同じ質問があったので、Logをあさってください。
日々、WSHを勉強しているものなんですが、
ユーザープロファイルのコピーってWSHで作ることができるんでしょうか?
コンピュータ名の変更は、取得する方法は、あるのだから、たぶんあると
思うのですが、どうなんでしょうか?
WSHは、どこまでWindos操作ができるのかとこの頃思い始めてきました。
>ばんのしゃーによかばんた さん 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
――――――――――――――――――――――――――――――――――――――
文字列変換のアイデアです。
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)
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クラスのメンバを
眺めていれば発見できます。
ぜひ、ご自分で問題に対処できる能力を身に付けられてください。
↓の投稿、結局うまくいったかどうかが曖昧でしたので補足です。
Set FolderItem=Folder.Items().Item(1)
だと問題なく各種プロパティを取得できました。
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→ローカル、の場合、タイムスタンプは保持されませんでした。
To ちゃっぴ さん
ちゃっぴさんありがとうございました。うまく、アカウント名の変更できました。
でも、ログインIDとパスワードは、変更できたんですが、なぜかスタートメニューに表示されている名前だけ変わらないのなぜでしょうか?
変える方法は、ご存知でしょうか?
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))
その後も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利用もなし。という一般条件でお願いします。
To ちゃっぴ さん 2005年 11月 11日 01時 06分 52秒
数値を変えて試行しました結果
WScript.Sleep 1000 で
お行儀良く順番どおりに開いてくれました\(^o^)/
敏速で的確なご指示ありがとうございました。
仕事(製図)で使っているのですが…
案件ごとに必要な 5〜30ファイル をバサッと開くことから
仕事を始めますので、このスクリプトを案件ごとに用意して
日々使っております。おかげ様でさらに使いやすくなりました。
ありがとうございました。