To WSH初心者 さん 2005年 11月 10日 17時 23分 08秒
訂正
> ADsPath からして、Administrators Group Container の下に
> User を作ろうとしていますよね?
Administrators Group Container → Administrators Group Object
ちなみに Group は Container になりえません。
→ 「ADSI Objects of WinNT」
すでに指摘しましたが、それを実行するとどのような結果が生じ、
どのような戻り値が返されるかを理解しないと、
いつまでたっても Sample の定数を書き換えるだけの Level から
抜け出せないでしょう。
そういうのは、すべて Reference に書かれていますので、
それを辞書代わりに調べることを行いましょう。
それから、Microsoft Office 製品を持っていれば、
VBE が使えますから、そこで必要な Library を参照設定し、
Debug 時に Local Window を覗くことによっても
理解するうえでは非常に役立つでしょう。
# VBSとVBAでは、若干文法が異なりますが、
# ほとんど差がないに等しいといってもいいようなもんです。
なお、ADSIの場合、参照設定すべきものは「Active DS Type Library」です。
To WSH初心者 さん 2005年 11月 10日 17時 23分 08秒
> ちゃぴさんのスクリプトを実行したところ、ユーザ名が見つかりませんとか
> ユーザ名が存在しますとかエラーになるのですが、
> ちゃんとユーザ名は、変更されていました。それは、なぜでしょうか?
そういうことを聞きたいのであれば、最低限の条件は提示してください。
どこで Error になっているか、実行したときの Source Code とか、etc
> また、ユーザ追加のスクリプトを作成したのですが、
>「オブジェクトでサポートされていなプロパティまたはメソッドです」と
> エラーになります。
> Set Dom= GetObject("WinNT://" & strComputer&"/Administrators,group")
これ Dom に何が返ってくると思います?
ADsPath からして、Administrators Group Container の下に
User を作ろうとしていますよね?
通常の User の ADsPath をよく見てみてください。
どこの下に作ればいいかわかるでしょうから…
To アブラモビッチ さん 2005年 11月 10日 13時 45分 56秒
> リモートマシン上で実行したDOSコマンドの標準出力を
> 表示させる方法を教えてください。
Remote Server 上に Redirect されるので
その File を開いてやればいいと思いますが?
ちなみに Ping なら Win32_PingStatus Class を利用してやる
という方法もありますね。(Windows XP 以降)
To sue さん 2005年 11月 10日 10時 34分 15秒
> Wscript.Sleep とか
調べてください。
To ひで さん 2005年 11月 10日 09時 18分 15秒
> WSHを使用してアクロバットリーダーやオフィス等のインストールを
> 自動で行えるようにしたいと考えておりますが、可能なのでしょうか?
> sendkeysでキー操作を実行できるとの事ですが、インストーラーの
> 各場面で適切なキー操作を送る方法が見つかりませんでした。
可能ですが、間違っても Sendkey なんてものを使用しないことです。
方法ですが、Installer の Command Line Switch を利用して行います。
# Script すら必要なく Batch で事足ります。
最近の Application なら、大抵 Windows Installer でしょうから
Microsoft Windows インストーラ ツール の コマンド ライン スイッチ
http://support.microsoft.com/default.aspx?scid=kb;ja;227091
ここをみて、UI を表示しないで Install するようにしましょう。
それから、有名な製品なら大抵無人 Install の手引きが
Document化されています。
そちらもあわせて参照しましょう。
スクリプトだけで!、Cacheファイルのフルパスを得ることが出来ます!
Cacheフォルダで選択したファイルのフルパスを表示します。
「お気に入り」や「リンク」から起動します。
CachePath.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
If WScript.Arguments.Count=0 Then
Call mother()
Else
Call daughter()
End If
WScript.Quit
Sub mother()
Dim Shell
Dim Folder
Dim FolderItem
Dim Verb
Set Shell=CreateObject("Shell.Application")
Shell.Windows().Item().Document.SelectedItems.InvokeVerbEx "copy"
Set Folder=Shell.NameSpace(Left(WScript.ScriptFullName,_
InStrRev(WScript.ScriptFullName,"\")))
Set FolderItem=Folder.Items.Item(WScript.ScriptName)
For Each Verb In FolderItem.Verbs
If Verb.Name="貼り付け(&P)" Then Exit For
Next
If IsEmpty(Verb) Then WScript.Quit
Verb.DoIt
End Sub
Sub daughter()
Dim k:k=0
Dim args():ReDim args(WScript.Arguments.Count-1)
For k=0 To WScript.Arguments.Count-1
args(k)=WScript.Arguments(k)
Next
WScript.Echo Join(args,vbLf)
End Sub
――――――――――――――――――――――――――――――――――――――
その原理は、Cacheフォルダからファイルをアプリにドラッグ&ドロップすると
そのフルパスが渡ることを利用します。ただし、ドラッグ&ドロップすると、
Cacheフォルダから消えるので、右クリックのコピー&ペーストを使います。
これを応用すると、URLを与えてフルパスを得たり、
IE表示中のURLからフルパスを得たり、なども出来ます。
ところで、なんで、Cacheファイルのフルパスが欲しかったのか、
と思い出してみると、IE表示中のページを保存することだったのですが、
それだけなら、CacheフォルダをURLで検索して、FolderItemを得れば、
CopyHereか、Copy&Pasteで出来たりして、フルパスは必要なかったですね。
うーん、折角、方法が見つかったのに使い道が。。。使い道、募集中。
>管理人むたぐち さん 2005年 11月 07日 18時 19分 11秒
>To: ばんのしゃーによかばんた さん
>ご指摘されるのは結構なんですが、感情的にならず、
>もうちょっと柔らかい表現でお願いしたいと思います。
>掲示板の雰囲気が悪くなってしまいますので…。
ご尤もです。
># 指摘だけで情報量0のこのような投稿は
># 控えていただきたいのが本心なのですが…。
># なにかのついでとかならいいんですけど。
これも、至極ご尤も。
>それと、この機会についでに言っておきますが、
>ばんのしゃーによかばんたさんの書き込みに、最近、
>WSH/スクリプティングに関係ないものが目立ちます。
>この掲示板はWSH Lab.の掲示板であって、Windowsの
>問題点を指摘する掲示板ではありません。
>その点をよくご理解いただき、そのような投稿は
>適切な場所(eXConnなど、MSは複数の窓口を用意している。
>魔界の仮面弁士さんのご指摘どおり)を
>選んで行う、あるいはご自分でブログを立ち上げて
>行うなどしていただきたいと思います。
ノイズが目立ちましたか。
そこで、手っ取り早い判定基準を作りました。
スクリプトというキーワードやコードが含まれるか、否か。
早速、1件が没です。FTPフォルダのTimeZone絡みのModifyDateの障害。
もし、この障害回避やFTP.EXEのDIRを処理するスクリプトを作るときには、
参考になるかも知れません。そのときは言ってください。
もう1件は1行目でOKでした。
to:ちゃっぴさん
ちゃぴさんのスクリプトを実行したところ、ユーザ名が見つかりませんとかユーザ名が存在しますとかエラーになるのですが、ちゃんとユーザ名は、変更されていました。それは、なぜでしょうか?
あと、XPのコントロールパネル→ユーザアカウント→名前を変更するという作業(スタートメニューの中の名前)をスクリプトで作るとしたらどうすればよろしいでしょうか?
また、ユーザ追加のスクリプトを作成したのですが、「オブジェクトでサポートされていなプロパティまたはメソッドです」とエラーになります。
'ユーザ追加
Set Dom= GetObject("WinNT://" & strComputer&"/Administrators,group")
Set User=Dom.Create("User", "User1")
User.SetPassword "Pass"
どこかが違うと思うのですが、分からずじまいで。ググッても似ているスクリプトで間違っているところがわかりません。
はじめまして。
質問です。
WSHでSQLPLUSって使用できるのでしょうか?
また出来るのならばどのように記述すればいいのでしょうか?
よろしければ教えて下さい。よろしくお願いします。
リモートマシン上で実行したDOSコマンドの標準出力を表示させる方法を
教えてください。
例えばPingの場合、以下のような結果をローカルマシン上で表示させてたいです。
宜しくお願いします。
Ping statistics for 192.168.8.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
スクリプトはこんな感じで。。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer (Computer, NameSpace, User, Pass)
Set Remote = objService.get("Win32_Process")
test = Remote.create("cmd.exe /c ping 192.168.8.1", Null, Null, Pid)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ちゃっぴ さん 2005年 11月 10日 00時 33分 27秒
ご教示ありがとうございます。
マイクロソフトのページで Wait を確認してきました。
Monitor.Wait メソッド
オブジェクトのロックを解放し、現在のスレッドがロックを
再取得するまでそのスレッドをブロックします。
と書いてあり、使い方も記されているようですが…
私には理解できませんでした(^_^;
具体的にどう書けば良いのでしょうか?
お手数でも教えていただけないでしょうか。
宜しくお願い致します。
はじめまして。
WSHを使用してアクロバットリーダーやオフィス等のインストールを
自動で行えるようにしたいと考えておりますが、可能なのでしょうか?
sendkeysでキー操作を実行できるとの事ですが、インストーラーの
各場面で適切なキー操作を送る方法が見つかりませんでした。
方法をご存知でしたら教えて頂けないでしょうか?
宜しくお願い致します。
To WSH初心者 さん 2005年 11月 09日 22時 08分 22秒
まあ、UserName と ComputerName の件は別にしても
そのままじゃまったくといって動かないと思いますので、
Sample を載せておきます。
Dim objContainer ' As ActiveDS.IADsContainer
Dim objUser ' As ActiveDS.IADsUser
Dim strComputerADsPath ' As String
Dim strComputerFullADsPath ' As String
Dim strUserFullADsPath ' As String
strComputerADsPath = "WinNT://" & strComputer
strComputerFullADsPath = strComputerADsPath & ", Computer"
strUserFullADsPath = strComputerADsPath & "/Administrator, User"
Set objContainer = GetObject(strComputerFullADsPath)
Set objUser = GetObject(strUserFullADsPath )
objContainer.MoveHere objUser.AdsPath, "abcu"
あとは、MSDN(英語)を調べて、がんばって読解してください。
IADsContainer::MoveHere
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/iadscontainer_movehere.asp
それから、Scriptでは隠蔽されていますが、
型宣言を Comment として載せておきました。
# これは個人的には百害あって一理なしと思っていますが…
# ちゃんと理解しようと思ったら、
# 型がわからんようでは手に終えないでしょうし…
とはいえ、ADSI の data型はひとつの Object でも
とりようによってはいくつかの型と解釈できる
結構厄介な代物なので、下記を参考にしてください。
ADSI Objects of WinNT
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/adsi_objects_of_winnt.asp
To WSH初心者 さん 2005年 11月 09日 22時 08分 22秒
> UserName = objNetwork.UserName
> strComputer = UserName
> Set objUser = GetObject("WinNT://" & strComputer & "/Administrator")
これ、普通におかしいと思いませんか?
Username が ComputerName ???
To sue さん (sue3492@yahoo.co.jp) 2005年 11月 08日 13時 49分 37秒
> ですが一つ使いにくい点がありまして…
> 実行するたびにファイルの開く順番が違うのです。
> 上から順番には開けないものでしょうか?
適度に Wait をいれてやったらどうでしょう?
Wscript.Sleep とか
たぶん容量とかの差異が大きいことが原因のような気がしますが…
TO:管理人むたぐち さん
DNSの変更について教えていただきありがとうございました。
administratorの名前変更なんですが、administratorのパスワードの変更しかたは、分かりましたが、名前の変更がどうしても分かりません。ローカルのadministratorをabcuにしたいです。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list91.shtml
のいりやさんのスクリプトのサイトを見たのですがいまいち変更の仕方がわかりません。パスワードの変更は
objUser.SetPassword "testpassword" とやればいいことが分かりました。
Set objNetwork = WScript.CreateObject("WScript.Network")
UserName = objNetwork.UserName
strComputer = UserName
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator")
Call Container.MoveHere(User.ADsPath, abcu)
objUser.SetPassword "testpassword"
objUser.SetInfo
ググッて作ってみたものなんですが、なんか違うきがして・・・
http://www.erox.jp/pc/
あの人気女優、及川奈央の動画が期間限定、完全無料で見放題!!
これは、必見です(^o^)♪
はじめまして。sue と申します。
Google で WSH を検索してこちらに来させて頂きました。
まったくの初心者ですが、下記のファイルを見よう見まねで作り
日々便利に使っております。
ですが一つ使いにくい点がありまして…
実行するたびにファイルの開く順番が違うのです。
上から順番には開けないものでしょうか?
Set WS = CreateObject("WScript.Shell")
WS.Run "意匠01.jww"
WS.Run "意匠02.jww"
WS.Run "意匠03.jww"
WS.Run "構造01.jww"
WS.Run "設備01.jww"
よろしくお願いいたします。
あ、さっきの投稿、お名前間違いました。
To: 猫の手 さん ではなく
To: WSH初心者 さんでした。
To: 猫の手 さん
> DNSのレジストリはこれでいいのでしょうか?優先DNS、代替DNSの設定するにはどうしたらよろしいのでしょうか?
WMIのWin32_NetworkAdapterConfigurationクラスを用いて行います。
ネットワーク アダプタに対する DNS サーバーの検索順序の変更
http://www.microsoft.com/japan/technet/scriptcenter/scripts/network/client/modify/nwmovb20.mspx
> 現在administratorの名前を変更するソースを考えているのですが、どのように変更するのかわからずじまいで・・。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list91.shtml
いりや さん 2003年 09月 24日 12時 26分 52秒の記事を参照してください。
ADSIを使います。
To: ばんのしゃーによかばんた さん
ご指摘されるのは結構なんですが、感情的にならず、
もうちょっと柔らかい表現でお願いしたいと思います。
掲示板の雰囲気が悪くなってしまいますので…。
# 指摘だけで情報量0のこのような投稿は
# 控えていただきたいのが本心なのですが…。
# なにかのついでとかならいいんですけど。
それと、この機会についでに言っておきますが、
ばんのしゃーによかばんたさんの書き込みに、最近、
WSH/スクリプティングに関係ないものが目立ちます。
この掲示板はWSH Lab.の掲示板であって、Windowsの
問題点を指摘する掲示板ではありません。
その点をよくご理解いただき、そのような投稿は
適切な場所(eXConnなど、MSは複数の窓口を用意している。
魔界の仮面弁士さんのご指摘どおり)を
選んで行う、あるいはご自分でブログを立ち上げて
行うなどしていただきたいと思います。
>みかん大好き さん 2005年 11月 04日 17時 40分 33秒
>To: 管理人むたぐち さん
>早速のご返答有難うございます。
>> first = wShell.run("cmd /c net use \\192.168.100.1\test Passwd /user:test",0,True)
>> のようにRunメソッドの第三引数を指定して、コマンドの終了を
>> 待ち合わせするようにしてみてください。
>上記試したら上手く出来ました!
>ご教授有難うございました。
なに、そんなことだったの!
しかし、仮にも、客からお金を取ってソフト/システムを作っている職業人なら、
少なくとも、自分が使っている機能くらいは、仕様書を読んで使え!
そんなんじゃ、最近多い、素人のリフォーム業者と同じやないか。
客は堪ったもんじゃない。怒るぞ。
そう言えば、素人のリフォーム業者もよく名前を変えるそうですが、
質問の場合は、どういう理由なんでしょうね。
TO:管理人むたぐち さん
Proxyの設定うまく作ることができました。ありがとうございました。
また、質問なんですが、DNSの設定のプログラムは以下のを作ったのですがうまくいきません。単純にProxyの時のregpathを変更したのですが・・・・
DNSのレジストリはこれでいいのでしょうか?優先DNS、代替DNSの設定するにはどうしたらよろしいのでしょうか?また、現在administratorの名前を変更するソースを考えているのですが、どのように変更するのかわからずじまいで・・。対処方法は教えてもらいまでしょうか?
Dim WShell
Set WShell = WScript.CreateObject("WScript.Shell")
RegPath = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\parameters "
RegData = "10.1.1.1"
RegType = "REG_SZ"
WShell.RegWrite RegPath,RegData,RegType
デフォルトブラウザをIE以外のものに変えても、
wShell.Run hoge.html
すると、IEになることがあるようです。変な話です。
>ばんのしゃーによかばんた さん 2005年 07月 24日 15時 29分 27秒
>関連付けで、デフォルトで起動する動詞は、
>Shellキーの@値があれば、それになると思っていたのですが、
>ドロップのときは、それとは関係なく"open"なのですね。嵌りました。
wShell.Runも同様みたいです。
しかし、wShell.RunがShellキーの@値を見ないことに理由があるとは思えないし。
これは「障害」です。>MS
それも、wShell.Runを使っている他者に「障害」をばら蒔く「障害」の親分です。
なので、関連付けを前提にwShell.Runを使うときは、注意しましょう。
と言っても、どう注意すりゃよいものやら。。。
CMD.EXE /Cを挟めば、関連付けになりますが、
中身EXEファイルが関連付けに関係なく動くという例の凶悪バグの餌食になるので、
これはやめたほうがいい。
>ばんのしゃーによかばんた さん 2004年 12月 01日 17時 34分 24秒
>たまたま、
>RunDLL32.EXE Shell32.DLL,ShellExec_RunDLL ファイル [args...]
>というのを見つけましたが、
>[,vDirectory] [,vOperation] [,vShow]が指定できれば、まだしも、
>指定できそうにないので、特に使い道がなさそう。
これだと、Shellキーの@値で動くようです。
あるいは、デフォルト動詞を変えるときは、Shellキーの@値で変えるのではなく、
デフォルト動詞のキー名をopenに変えると確実です。
あと、ショートカットは、Shellキーの@値ですが、
インターネットショートカットは、openキーを使うようです。
これも「障害」です。>MS
こうやって、>MSキーワードを埋め込んで、様子を見ましょう。:-p
>ばんのしゃーによかばんた さん 2005年 10月 04日 17時 11分 45秒
>どうせなら、Mark of the WebやZoneIDのようなファイル単位の制御は
>もうやめてしまって、フォルダ単位で制御したほうが筋がよいと思います。
>唯一、Cookiesフォルダで制限付きサイトゾーンだけは出来ますが、
>他のゾーンのフォルダを作る方法はないもんでしょうかね。
Mark of the WebやZoneIDがあまり当てにならないとならば、
「制限付きサイトゾーンのフォルダを作る方法」
を再度、強調しておいたほうがよいかも。
>ばんのしゃーによかばんた さん 2005年 02月 17日 17時 44分 17秒
>>管理人むたぐち さん 2004年 06月 14日 18時 42分 40秒
>>ただ、C:\Documents and Settings\username\Cookiesは「制限付きサイトゾーン」
>>ですし、任意のフォルダを制限付きサイトゾーンにする方法が分かれば、
>Cookiesの下にサブフォルダを作っても、「制限付きサイトゾーン」に
>なります。このフォルダのリンクなり、ショートカットを使えば、
>任意のフォルダを「制限付きサイトゾーン」にするのと変わりません。:-)
インターネットからファイルをローカルに保存するときは、
デスクトップなどでなく、この「制限付きサイトゾーン」のフォルダに
保存すると安全です。ここでしっかり検疫して、安全を確認した上で、
ほかのフォルダに出すとよいでしょう。
WSHLAB.HTAの検索補助ツールです。
結果のORリストは、ばんのしゃーによかばんた改造版WSHLAB2.HTAで検索に使えます。
AKiOSさんのオリジナル版WSHLAB.HTAでは検索が本文のみなので使えません。
CScript.EXE ORList.VBS index.shtml list*.shtml > stdout
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso:Set fso=CreateObject("Scripting.FileSystemObject")
Dim arg,argc,argv()
For Each arg In Wscript.Arguments
If InStr(arg,"*") Then
call glob(arg)
ElseIf InStr(arg,"?") Then
call glob(arg)
Else
argc=argc+1
ReDim Preserve argv(argc-1)
argv(argc-1)=arg
End If
Next
Function Glob(arg)
Dim Folder,File
Dim bre,pre,xre
Dim Found
Set Folder=fso.GetFolder(fso.GetParentFolderName(fso.GetAbsolutePathName(arg)))
Set pre=New RegExp
Set bre=New RegExp
Set xre=New RegExp
pre.Global=True
bre.IgnoreCase=True
xre.IgnoreCase=True
pre.Pattern="([\]\^\[\\\$\+\.\(\)\|\{\}])"
bre.Pattern="^" & pre.Replace(fso.GetBaseName(arg),"\$1") & "$"
bre.Pattern=Replace(bre.Pattern,"?",".")
bre.Pattern=Replace(bre.Pattern,"*",".*")
xre.Pattern="^" & pre.Replace(fso.GetExtensionName(arg),"\$1") & "$"
xre.Pattern=Replace(xre.Pattern,"?",".")
xre.Pattern=Replace(xre.Pattern,"*",".*")
For Each File In Folder.Files
If bre.Test(fso.GetBaseName(file.Name)) And xre.Test(fso.GetExtensionName(file.Name)) Then
argc=argc+1
ReDim Preserve argv(argc-1)
argv(argc-1)=File.Path
Found=True
End If
Next
If Not Found Then
argc=argc+1
ReDim Preserve argv(argc-1)
argv(argc-1)=arg
End If
End Function
Dim Name
Dim Matches,Match
Dim dic:Set dic=CreateObject("Scripting.Dictionary")
Dim dic2
Dim re:Set re=New RegExp
re.Pattern="<!-- \d+ -->\s*<!-- DATE=(\d+年 \d+月 \d+日 \d+時 \d+分 \d+秒) -->\s*<!-- \r\nBBS_VER=.+\r\nADDR=(\d+\.\d+\.\d+\.\d+)\r\nHOST=(\d+\.\d+\.\d+\.\d+)\r\nAGENT=(.+)\r\nREFERER=.+\r\nPROCESS_ID=\d+\r\n\s*-->\s*<\w+>\s*<font size=[^>]+>([^<]+)</font>\s*</\w+>\s*さん\s*"
re.IgnoreCase=True
re.Global=True
For Each arg in argv
Set Matches=re.Execute(fso.OpenTextFile(arg).ReadAll())
For Each Match In Matches
Name=Trim(Replace(Match.SubMatches(4),vbCrLf," "))
If dic.Exists(Match.SubMatches(1)) Then
Set dic2=dic.Item(Match.SubMatches(1))
If dic2.Exists(Name) Then
Else
dic2.Add Name,Replace(Join(Array(Match.SubMatches(1),Match.SubMatches(2),Match.SubMatches(3),Name,Match.SubMatches(0)),vbTab),vbLf," ")
End If
Else
Set dic2=CreateObject("Scripting.Dictionary")
dic2.Add Name,Replace(Join(Array(Match.SubMatches(1),Match.SubMatches(2),Match.SubMatches(3),Name,Match.SubMatches(0)),vbTab),vbLf," ")
dic.Add Match.SubMatches(1),dic2
End If
Next
Next
For Each dic2 in dic.Items
If dic2.Count>1 Then
WScript.Echo Join(dic2.Keys,"|")
End If
Next
WScript.Quit
――――――――――――――――――――――――――――――――――――――
それから、以下は、ばんのしゃーによかばんた改造版+タグ内検索、に加えて、
コメントタグを表示します。
function disp_kiji(number, kiji, new_bgcolor) { // 記事の表示
/*省略*/
} else if (s == "<BLOCKQUOTE>") {
s = '<blockquote id="kiji">';
kiji = colored_quote(kiji);
in_body = true;
/*追加*/ } else if (s.match(/^<(!-- [^>]* --)>$/i)) {
/*追加*/ s = '<pre><'+RegExp.$1+'></pre>';
}
To: 猫の手 さん
> 以下のようなネットワークドライブをつくるスクリプトを作ったのですが、
> 再実行すると、「ローカルディバイス名は既に使用されています。」というエラーで帰ってきます。
現在のネットワークドライブの割り当て一覧はEnumNetworkDrivesメソッドで
取得できます。(偶数値にドライブ名、奇数値にUNCパスを返す)
あとはこれらの値をDictionaryオブジェクトに格納し、
ドライブ名をキーとしておけば、oDic.Exists("S:") などとすれば
実際にネットワークドライブが存在するかどうか確認できます。
以下は参考例です。
Set oDic = WScript.CreateObject("Scripting.Dictionary")
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set oDrives = WshNetwork.EnumNetworkDrives
For i = 0 to oDrives.Count - 1 Step 2
oDic.Add oDrives.Item(i), oDrives.Item(i+1)
Next
If Not oDic.Exists("S:") Then
WshNetwork.MapNetWorkDrive "S:","\\192.168.1.1\backup"
Else
MsgBox ""
WScript.Quit
End If
この続きはまた分からなかったら質問してください。
以下のようなネットワークドライブをつくるスクリプトを作ったのですが、
再実行すると、「ローカルディバイス名は既に使用されています。」というエラーで帰ってきます。
IF Elseを使えばいいのですが、いまいち条件がわかりません。
最終的には、再実行されたとき、何も表示させないでプログラム事態を終了させたいのです。プログラム全体は、ネットワークドライブを作って、ファイルをドライブにコピーし4つのフォルダを作って、最後にディスクトップにショットカットを作っるプログラムなんですけど。
どのようにしたらよろしいでしょうか?
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.MapNetWorkDrive "S:","\\192.168.1.1\backup"
多分、
if <条件不明> Then
WshNetwork.MapNetWorkDrive "S:","\\192.168.1.1\backup"
else
MsgBox ""
WScript.Quit
end if
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFso.GetFolder("S:\")
Set objSubFol = objFolder.SubFolders
Set objNetwork = WScript.CreateObject("WScript.Network")
UserName = objNetwork.UserName
objSubFol.Add(UserName)
・
・
・
だと思うですが、間違っていますか?
To: 管理人むたぐち さん
早速のご返答有難うございます。
> first = wShell.run("cmd /c net use \\192.168.100.1\test Passwd /user:test",0,True)
> のようにRunメソッドの第三引数を指定して、コマンドの終了を
> 待ち合わせするようにしてみてください。
上記試したら上手く出来ました!
ご教授有難うございました。
To: WSH初心者 さん
> wshでproxyの設定変更は可能でしょうか?
> 参考になるスクリプトは、ありますでしょうか?
IEのプロキシの設定は、レジストリにあります。
なので、対応するレジストリキーをスクリプトから
設定してやるとよいでしょう。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settingsキーの
ProxyEnableというDWORD値の0が無効、1が有効です。また、
ProxyServerという文字列値が実際のプロキシサーバーのアドレスと
ポートです。
レジストリをスクリプトから変更する方法については、
Lesson9をご覧ください。
To: みかん大好き さん
> wshでDOSコマンドを実行したいのですが、あるDOSコマンドが
> 上手く出来ない(完全にコマンドが終了していない?)
> という現象が出ております。
first = wShell.run("cmd /c net use \\192.168.100.1\test Passwd /user:test",0,True)
のようにRunメソッドの第三引数を指定して、コマンドの終了を
待ち合わせするようにしてみてください。
wshでDOSコマンドを実行したいのですが、あるDOSコマンドが
上手く出来ない(完全にコマンドが終了していない?)
という現象が出ております。
DOSコマンド単体での実行には何ら問題ありません。
環境は共有フォルダ側、コマンド発行側ともWindows2003です。
ご教授の程宜しくお願いします。
WSHコマンド
Set wShell = CreateObject("WScript.Shell")
first = wShell.run("cmd /c net use \\192.168.100.1\test Passwd /user:test",0)
DOSコマンド
net use \\192.168.100.1\test Passwd /user:test
wshでproxyの設定変更は可能でしょうか?
参考になるスクリプトは、ありますでしょうか?
>びーち さん 2005年 10月 27日 16時 25分 46秒
>何か回避作等ご存知ありませんでしょうか?
ネストが深くても途中脱出できるようにするには、Err.Raiseを使います。
<package>
<job id="test">
<script language="vbscript">
Dim ExitCode
Sub Quit(Code)
ExitCode=Code
Err.Raise 1
End Sub
On Error Resume Next
Main
ErrNumber=Err.Number
On Error GoTo 0
If ErrNumber>1 Then
Err.Raise ErrNumber
Else
WScript.Quit ExitCode
End If
Sub Main
dim strTest
strTest = "aaaa"
If(strTest = "aaaa") Then
Quit(2)
ElseIf(strTest = "bbbb") Then
Quit(1)
End If
msgbox "End"
End Sub
</script>
</job>
</package>
どうも、WSFのWScript.Quitは、途中脱出にErr.Raiseを使う、
こういうのに近いインプリメントをしているのではないかな。
というのは、VBSでErr.RaiseするとExitCodeが0なんですが、
WSFではExitCodeが1になるんです。WSH2.0/WSH5.6いずれでも。
<package>
<job id="test">
<script language="vbscript">
Err.Raise 100
</script>
</job>
</package>
To: ふわふわ さん
> ためしに以下の内容をtest.vbsとして実行したのですが、HTML
> が出てきません。。
http://www.asia.microsoft.com/japan/にアクセスすると、
リダイレクトでhttp://www.microsoft.com/japan/に飛ばされますので、
responseTextが取得できないものと思われます。
最初からhttp://www.microsoft.com/japan/をGetするようにしてみてください。
> また、同一LAN内でなく、外部ネットワークのサイトでもできる
> のでしょうか?
HTMLに記述する場合はその制限がかかりますが、WSHから呼び出す
場合には問題ありません。
ただし、responseTextを使う際は注意点があり、UTF-8など
unicode系の文字コードでないと文字化けする問題があります。
この文字化けを回避し、Shift-JISのサイトも適切に取り込むには、
Adodb.Streamというコンポーネントを併用し、responseBodyを
Streamに書き込むことによってテキストに変換する方法があります。
詳しくはWikiのFAQをご覧ください。
余談ですが、MSXML2.XMLHTTPはいま流行の「Ajax」という技術の
核になるコンポーネントですね。昔からWSHではおなじみなだけに、
「ようやく来たか!」という感じですけども。
responseTextの文字化けに関しては以下のサイトが詳しいです。
Ajaxを使ったテストスクリプトもあります。
文字コード関連調査[responseText]
http://jsgt.org/ajax/ref/charset_test/responsetext/test_1_make_table.php
どこかのサイトのサンプルで以下のような方法で外部のWebサイト
のHTMLを取得するような紹介がありました。
ためしに以下の内容をtest.vbsとして実行したのですが、HTML
が出てきません。。
特定のWebサイトからGETリクエストでHTMLを取得したり、POST
を発行したりしたいのですが、どのようにすればできるので
しょうか。
また、同一LAN内でなく、外部ネットワークのサイトでもできる
のでしょうか?
Dim oHttp
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", "http://www.asia.microsoft.com/japan/", False
oHttp.Send
WScript.Echo( oHttp.responseText )
To: ばんのしゃーによかばんた さん
Shell.FolderView.1を使う方式で、こちらの環境(WinXPから
IIS on Windows Server 2003)でも動作を確認できました。
To: Katsumi さん
リンクありがとうございます。
DynaCallのライセンスの件ですが、申し訳ありませんが
私にもわかりません。
初めまして、Katsumi といいます。こちらのサイト、リンクさせて頂いています(連絡していませんが…すみません)。時々参考にさせて頂いています。私のページ(ただのブログですが)でも、わずかながらWSHを取り上げています。
さて、このサイトを提供されているむたぐちさんならもしかして…と思い、書き込みさせて頂きました。DynaCallの事なんですが、あれのライセンスはどうなっているかご存じでしょうか。リンク集でも紹介されているGunter Bornさんにメールで聞いてみたのですが、彼にも分からないとのこと。ソースを見ても、ライセンスに関しては何も書かれていないし、改変や再配布できるのかどうかも分かりません。もし何かご存じでしたら、教えてくださいませんか。
>ばんのしゃーによかばんた さん 2005年 10月 31日 15時 41分 36秒
>Do While InStr(ie.StatusText,"フォルダの内容を取得しています")
> WScript.Sleep 100
>Loop
これは、
フォルダ /pack/incoming/ を検索しています
フォルダの内容を取得しています
の順に二種類のテキストに対応する必要があるようです。
そこで、
Do While InStr(ie.StatusText,"フォルダ")
に変えるとよいようです
また、
>Shell.FolderViewのEnumDone Eventを使うとか。
は、
URL="ftp://upload.vector.co.jp/pack/incoming"
Set fv=WScript.CreateObject("Shell.FolderView.1","FV_")
Set ie=WScript.CreateObject("InternetExplorer.Application","IE_")
ie.Visible=True
ie.Navigate URL
Dim EnumDone
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
Do While Not EnumDone
WScript.Sleep 100
Loop
Set Folder=ie.Document.Folder
Set FolderItem=Folder.Items().Item(1)
WScript.Echo Join(Array(FolderItem.Path,FolderItem.Name,FolderItem.Size,FolderItem.ModifyDate),vbLf)
Sub FV_EnumDone()
EnumDone=True
End Sub
Sub IE_DocumentComplete(pdisp,url)
fv.SetFolderView ie.Document
End Sub
で取れました。
>びーち さん 2005年 10月 27日 16時 25分 46秒
>何か回避作等ご存知ありませんでしょうか?
.WSFだけの障害のようなので、.VBSにする。
>どうやら、wscript.quit以降にプログラムが通る通らないにかかわらず、IOの入る記述があると、リターンコードがうまく返ってこないようなのですが、
そこまで分かっているならそうする。
wscript.quitを末尾に持って行く。
例えば、
<package>
<job id="test">
<script language="vbscript">
Function Main()
dim strTest
strTest = "aaaa"
If(strTest = "aaaa") Then
Main=0:Exit Function
ElseIf(strTest = "bbbb") Then
Main=1:Exit Function
End If
msgbox "End"
End Function
WScript.Quit Main()
</script>
</job>
</package>
ところで、この障害、WSFのWScript.Quitの途中脱出のインプリメントに
問題があるみたいですね。cにはlongjmpがあるけれど、VBScript言語には、
ScriptControlで途中脱出が出来ないように、もともと、途中脱出がない。
外付けで、WScript.Quitをインプリメントするんでしょうが、
ScriptControlで途中脱出をスクリプトで代替するときのように、
Quitで、以後、文を実行しないというフラグ1を立てて、文の走査は続ける。
走査中に関数呼び出しがあると、フラグ2を立てる。
最後にフラグ2が立ってると、ExitCodeでなくフラグ2を返す。???
みたいな。
》ばんのしゃーによかばんた さん 2005年 10月 30日 16時 29分 42秒
> 予想値よりは多いけれど、期待値よりは低いですね。残りは?
残りのフィードバックは、「製品に反映される」という条件に合致しなかった物です。
既に実装済みの機能に対する「この機能は良かった」といったフィードバックだったりとか、
製品以外(サービスやイベント内容など)に対するフィードバックだったりとか。
あるいは、次々期製品に対する意見ゆえに、その後の状況がまだ見えていない代物とか。
> 結果が分かるのはとてもよいですね。一般ユーザが使える方法でしょうか?
一方で、結果が分からない、もしくは分かりにくい物もありますけれどね。
(たとえば、無記名のアンケートやサーベイによるフィードバックなど)
で、一般ユーザが使えるかどうか、という件については、ケースバイケースとなります。
たとえば、Knowledge Base の Web ページに置いてある『フィードバックの送信』などは、
一般ユーザでも利用できる方法かと思います。また、『MSDN Product Feedback Center』もそうでしょう。
また、私自身は利用した事がありませんが、『お客様の声』(現在は Contact Us に移動)も、
一般ユーザが利用できる方法の一つだと思います。
https://s.microsoft.com/japan/support/survey/soljpfb.asp
あるいは、(一般ユーザー向けではなく)契約ユーザー向けの物ですが、私の場合は各種インシデントを
利用して報告する事も多いです。(TechNetインシデント、MSDNインシデント、MVPインシデント等)
この他には、担当者 または 関係者の方と直接お会いした時に伝える……という直接的なパスを
利用する事もありますが…これは一般ユーザーには使いにくいフィードバック方法でしょうね。
# Microsoft が参加しているイベントに参加すれば、一般の方でも、関係者とお会いできる機会は
# あるかも知れませんが、いずれにしも、一般ユーザ向けのルートでは無いでしょうし。
>>jpsecure@
> それ「も」知りません。
セキュリティ報告用(≠サポート用)のアドレスとなります。
詳細は、前回の投稿で紹介した URL をご覧ください。
その他の連絡先を知りたい場合には、「カスタマーインフォメーションセンター」が役に立ちます。
(Product Feedback Center や exConn 等のアドレスも、下記からリンクされています)
http://www.microsoft.com/japan/customer/
>ばんのしゃーによかばんた さん 2005年 10月 30日 16時 30分 50秒
>Explorer/IEからFTPが全然つながらない。なんでだろう。
理由はわかりませんが、レジストリのキーを削除したら直りました。
HKEY_CURRENT_USER\Software\Microsoft\Ftp\Accounts\upload.vector.co.jp
ちんぷんかんぷんです。
Do While InStr(ie.StatusText,"フォルダの内容を取得しています")
WScript.Sleep 100
Loop
WScript.Sleep 100
Set Folder=ie.Document.Folder
Set FolderItem=Folder.Items.Item(1)
WScript.Echo Join(Array(FolderItem.Path,FolderItem.Name,FolderItem.Size,FolderItem.ModifyDate),vbLf)
では、まだ早過ぎるようで、エラーになりました。
待ち合わせ条件が分からないので、
いっそOn Error Resume Nextでリトライするとか。
Shell.FolderViewのEnumDone Eventを使うとか。
あと少しですね。
ところで、FolderItem.Typeだけは取れないようです。
まぁ特に必要ないですが。
To: びーち さん 2005年 10月 27日 16時 25分 46秒
> この時、実行するPCがWindowsXP(Microsoft (R) Windows Script Host Version 5.6)だと、記述したとおりのリターンコードが戻ってくるのですが、Windows2000(Microsoft (R) Windows Script Host Version 5.1)だと、常に、1が返ってきてしまいます。どうやら、wscript.quit以降にプログラムが通る通らないにかかわらず、IOの入る記述があると、リターンコードがうまく返ってこないようなのですが、何か回避作等ご存知ありませんでしょうか?
当方のWSH v5.1 @ Windows2000でもこの問題が再現されました。
WSHのバージョンを5.6に上げてやると再現しなくなるので、
可能ならば5.6をインストールしてください。
>ばんのしゃーによかばんた さん 2005年 10月 27日 12時 09分 27秒
>しかし、FolderItem.SizeやFolderItem.ModifyDateは取れましたよ。
こっちも、もうちょっと条件を絞ろうと、再度試みたら、
Explorer/IEからFTPが全然つながらない。なんでだろう。
ログイン方法をいろいろ指定してみたけどぜんぜん駄目。
ネスケだと問題なし。呪われているみたい。
MSDNライブラリで調べると、パスワードに@:/があるとエラーになるみたいな記事が
ありましたが、そうすると、anonymous FTPのパスワードにメールアドレスを指定する
とき、@はどうすればよいのでしょう?%40も試してみましたが。ふーっ。
最初にうまく行ったのはなんだったんだろう。
こういうのはどうでしょう?
WSHなどのHTMLヘルプを開いているとき、そのトピックを「お気に入り」に追加します。
なぜか、そういう機能がないんですよね。不思議だ。
hh2Favorite.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim Process
Dim PID
Dim k
For Each Process In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='hh.exe'")
PID=Process.ProcessID
Next
If IsEmpty(PID) Then
WScript.Echo "hh.exe not found"
WScript.Quit
End If
Dim wShell
Set wShell=CreateObject("WScript.Shell")
If Not wShell.AppActivate(PID) Then
WScript.Echo "hh.exe not found 2"
WScript.Quit
End If
wShell.SendKeys "% j"
For k=100 To 1 Step -1
If wShell.AppActivate("URL へ移動") Then Exit For
WScript.Sleep 100
Next
If k=0 Then
WScript.Echo "「URL へ移動」not found."
WScript.Quit
End If
WScript.Sleep 100
wShell.SendKeys "%c"
WScript.Sleep 100
wShell.SendKeys "^c{esc}"
Const OLECMDID_PASTE = 13
Const OLECMDEXECOPT_DODEFAULT = 0
Dim URL
Dim Title
Dim ie
Set ie=CreateObject("InternetExplorer.Application")
'ie.Visible=true
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)
URL=ie.Document.all.txt.value
If Left(URL,3)<>"mk:" Then
ie.Quit
WScript.Echo "Invaid URL -",URL
WScript.Quit
End If
ie.Navigate URL
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
Title=ie.Document.title
ie.Quit
If MsgBox(URL,vbOkCancel,Title)=vbCancel Then WScript.Quit
Dim Link
Set Link=wShell.CreateShortCut(wShell.SpecialFolders("Favorites")&"\"&Title&".lnk")
Link.TargetPath="hh.exe"
Link.Arguments=URL
Link.Save
――――――――――――――――――――――――――――――――――――――
もうひとつ考えたのは、プロパティページがHTMLなので、右クリックメニューを
拡張して、HTMLの中からタイトルとURLを取り出す方法です。
>門外漢 さん 2005年 10月 28日 11時 34分 15秒
>「より権限の少ないWebコンテンツゾーンのWebサイトがこのゾーンに移動できる」
そう、これ、インターネットオプションのセキュリティ設定の中でも、
最も意味が分からないものの大代表だったんです。
>インターネットゾーンのWebコンテンツから信頼済みサイトゾーンのWebコンテンツに移動できる条件を考えますと、「より権限の少ない」インターネットゾーンから「権限が多い」信頼済みサイトゾーンに移動することを許可しなくてはいけません。
その「権限が多い/少ない」の比較はどういうロジックなんでしょう?
ZoneIDに序列がある?
高中低の順?カスタム設定は?
>>ばんのしゃーによかばんた さん 2005年 10月 26日 16時 27分 43秒
>>https://インターネットゾーン(セキュリティレベル中)のサイト
>>の中から、
>><a href=http://イントラネットゾーン(セキュリティレベル高)のサイト target="_blank">
>>へ行くと、スクリプトが動いたのですが、いいのでしょうか?
>この場合、インターネットゾーンのほうが「より権限が少なく」、イントラネットゾーンが「よ>り権限が多い」ものと考えられます。
ん? ということはZoneIDで決まるのかな?
常識的には、セキュリティレベル高よりセキュリティレベル中のほうが権限が多いと
考えるのが普通で、常識に反する仕様にするなら、明示しなければ話にならん。>MS
すると、ZoneIDの序列に相反するセキュリティレベル設定は想定外なのかも。
インターネットゾーン(3)中、イントラネットゾーン(1)高みたいな。3<1 中>高
また、「権限の少ない」は「制限の多い」に変えたほうがよいと思う。
>今、https://なインターネットゾーンから、リンクで、http://なイントラネットゾーンのサイトに移動しようとしているのですから、
>インターネットゾーンからイントラネットゾーンへのリンクは有効でなくクリックしても作動しないはずなのですね。この意味で(正常)と申し上げました。
>また、私の手元でも再現しようとしましたがうまく行きませんでした。
私も、再度そのサイトでやってみたのですが、再現しませんでした。リンクが無効。
なので、あれは何だったのかという疑問が残りますが、この件はクローズですね。
ところで、https://とhttp://が切り替わるときのダイアログですが、
この手のダイアログには、「今後、この警告を表示しない」チェックボックスが
よく付いています。一見、親切そうですが、その実、親切でないと思います。
ダイアログを復活させようと思っても、方法が分かりません。
復活させる方法が分からないでは、この手のチェックボックスは使えません。
ヘルプを見たけど記述なし。
「詳細設定」にあったけど、どうしてそこにあると分かるんだ!と文句を言いたい。
その他も含めすべての「今後、この警告を表示しない」復活方法一覧が欲しいですね。
>魔界の仮面弁士 さん 2005年 10月 28日 06時 35分 25秒
>答えるのは難しいですが……私が伝えた範囲内の話に限れば、報告が新規バグとして
>登録されたケースが 1割強、問題点が修正検討予定(or 既に修正済み)のケースが 1割弱、
>検討課題となったケースが 2割程度、対応見送りのケースが 1割〜3割弱 ぐらい…かな?
予想値よりは多いけれど、期待値よりは低いですね。残りは?
因みに期待値は、プログラム修正3割、マニュアル修正3割、将来検討2割、
再現せず1割、使用法誤解/仕様通り1割、くらいかな。
結果が分かるのはとてもよいですね。一般ユーザが使える方法でしょうか?
>> Product Feedbackは「ヘルプとサポート」の中から
>> インターネットに接続するって言い出すやつでしょうか?そういうのはとんでもないですね。
ヘルプトピックから「フィードバックをMicrosoftに送信する」を選択すると出て来ます。
スパイウェアと同じで、どういう情報を持ち出すか分かりませんから。
>今まさに、インターネットに接続しておられる状況だと思うのですが……?
早期リタイアで無収入なもんで、すべからく節約モードなせいもありますが、
物騒なインターネットには、必要最小に限って、極力接続しないようにしてます。
なので、たまに行き慣れないところをアクセスすると必ずトラブルのです。
>> それに一般ユーザに開放してないところ(でしょ?)ってのも抵抗がありますね。
開発者と話せるっていうのはよいけれど、それでNDAに縛られるくらいなら、
話さないほうが、気楽でいいや。という意味です。
それに、やっぱり、ユーザがNDAに縛られて、開発者が気楽に話せるって、
なんか逆じゃないの?という抵抗感があります。
いつも自分は免責で、リスクはいつもユーザ、というのは、訴訟社会の米国では
仕方がないのかも知れませんが。
>> この2件については、「メール」で意見を送付しました。聞くかどうか様子見です。
>jpsecure@
それ「も」知りません。
たまたま、セキュリティ関連意見交換会の案内が来ていたので、それに返信しました。
>管理人むたぐちさん
おぉぉ!探し求めていたものが!
マジ感謝です!ありがとうございました。
To: Yoshi さん
PixyWebServer - Another tiny web server
http://www.interclasse.com/scripts/PixyWebServer.php
こんなのがあります。
MSWinsock.Winsockを使った簡易Web Serverですね。
AKAです。
Scripting.FileSystemObjectが、9x系で、日本語名フォルダに対してParentFolderが正しく動作しないバグを修正するパッチを作りました。
一応私の持っているscrrun.dllのバージョン、3.1、5.0、5.1、旧5.6、新5.6の分を作りました。
もはや9xを使っている人も少ないと思いますが、動作確認できる方がいれば、お願い致します。
なおWin98 1st付属のscrrun.dll(3.1)にはもっと最悪なバグ「日本語名フォルダのNameプロパティがエラーになる」がありますが、これを修正するパッチも同梱しました。
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=FIXSCRR.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D
はじめまして。
漠然とした質問なのですが、
WSHでHTTPDを実現する事って出来ますでしょうか。