ばんのしゃーによかばんた さん 2005年 08月 09日 18時 41分 55秒

以下のショートカットを作成し、
%windir%\system32\MSHTA.EXE vbscript:Execute("Set ie=CreateObject(""Shell.Application"").Windows().Item:ie.Navigate Left(ie.LocationURL,InStrRev(ie.LocationURL,""/"")-1):close")
コマンドラインで、
ren 新しいショートカット.lnk ...lnk
とリネームします。

これで、DOSのように「..」が出来ます。

アイコンは、shell32.dll,146など。




ばんのしゃーによかばんた さん 2005年 08月 09日 18時 41分 41秒

ShellNameSpaceは「お気に入りの整理」専用かと思ったら、
 お気に入りバー
 履歴バー
 フォルダバー
 BrowseForFolder
も、よく見ると、ShellNameSpaceのような感じですね。

なら、HTMファイルで、BrowseForFolderが使えないとき、
直にShellNameSpaceを使えばよさそう。

それにしても、情報が足りないです。
分かっているのは、フォルダ/ファイル表示だけ。
+/-ボタン表示
複数フォルダ展開/1フォルダ展開他折りたたみ
複数選択/1選択
複数ドラッグ?


ばんのしゃーによかばんた さん 2005年 08月 09日 18時 41分 25秒

どんな使い道があるのか、分かりませんが。ないかも。

コマンドラインで、

"C:\Program Files\Internet Explorer\iexplore.exe" "about:なんじゃこりゃ"

"C:\Program Files\Internet Explorer\iexplore.exe" "about:<input type=file>"

てなことができます。

バッチからmodeless MsgBox代わりに使える?

Explorer "about:なんじゃこりゃ"

でも動くときがありますが、他にIEが居ると、エラーになるので駄目。

インターネットゾーンなのでセキュリティレベル依存でスクリプトが使えません。

スクリプトを使うときは

MSHTA "about:<script>...</script>"

のほうがよいでしょう。

これまた、どんな使い道があるのか、分かりませんが。やっぱり、ないかも。

バッチファイル
"C:\Program Files\Internet Explorer\iexplore.exe" file://C:\Documents and Settings\ユーザ\デスクトップ\hoge.htm? %*
やショートカット
"C:\Program Files\Internet Explorer\iexplore.exe" file://C:\Documents and Settings\ユーザ\デスクトップ\hoge.htm?
で、ドロップしたファイル名をHTMファイルで受け取ることが出来ます。

<HTML><BODY onload=document.body.innerText=location.search;></BODY></HTML>

もし、HTAでは動かない機能を使うHTMファイルで引数が欲しいときに、使えます。
例えば、、、何かありません?


魔界の仮面弁士 さん 2005年 08月 09日 18時 06分 11秒

》うに さん 2005年 08月 09日 15時 43分 16秒
すみません。端折って書いたのがまずかったですね。

> Stream.Write oHTTP.responseBody

の前には、YZN さんが紹介してくださったページと同様、
> Set Stream = WScript.CreateObject("Adodb.Stream")
> Stream.Type = adTypeBinary
> Stream.Open
> Stream.Write oHTTP.responseBody
というコードが必要になります。


---
Writeメソッド: バイナリの書き込み(バイナリモード専用)
Readメソッド: バイナリの読み込み(バイナリモード専用)

WriteTextメソッド: テキストの書き込み(テキストモード専用)
ReadTextメソッド: テキストの読み込み(テキストモード専用)

Typeプロパティ: バイナリ/テキストの切り替え(Position=0の時のみ変更可)
Positionプロパティ: 読み書きするデータの位置

うに さん 2005年 08月 09日 15時 43分 16秒

魔界の仮面弁士 様

レスありがとうございます。

早速やってみたのですが、うまくいきませんでした。

Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET","http://localhost",False
oHttp.Send

Set Stream = WScript.CreateObject("Adodb.Stream")
Stream.Open
Const adTypeText = 2

Stream.Write oHttp.responseBody
Stream.Position = 0
Stream.Type=adTypeTest

Stream.Charset="Shift_JIS"
S=Stream.ReadText()
MsgBox S

としたのですが、Stream.Write oHttp.responseBodyの行でエラーになります。
(このコンテキストで操作は許可されていません)

ちなみにmetaタグがあるページでも文字化けしてしまいました。

どうかよろしくお願いします。

魔界の仮面弁士 さん 2005年 08月 09日 14時 38分 23秒

》うに さん 2005年 08月 08日 19時 27分 32秒
> 【例】<HTML><body>テスト</body></HTML>
TITLEタグが無いなど、HTML的に文法違反な気もしますが、
とりあえずそれは置いといて……。

今回は、
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
のようなタグ記述の無いHTMLの文字コード判定の話ですよね。

responseText での読み取りでは、サーバー側が返すデータ本体
だけではなく、どうやら、HTTPヘッダ(Content-Typeフィールド)も
併せて参照した上で、文字コードを決定しているようです。

なのでまずは、Webサーバからの応答が、「Content-Type: text/html」
ではなく、「Content-Type: text/html; charset=Shift_JIS」の形式に
なっているかどうかを確認してみてください。

HTTP応答ヘッダのContent-Typeフィールドに文字コードが指定してあるにも
関わらず、文字列が化けるようであれば、responseText ではなく、
responseBody を使って、文字列ではなくバイナリとしてデータを受け取り、
明示的に文字列変換するようにすれば OK でしょう。
# 今回は Shift_JIS である事が最初からわかっていますしね。

この、responseBody を使った方法については、最初に YZN さんが
提示してくださっていますので、そちらが参考になるかと思います。

サンプル中では、ADODB.Stream に取り込んだ後、それを SaveToFile メソッドに
よって、そのままファイルとして保存していますが、その代わりに、
 Const adTypeText = 2
 Stream.Write oHTTP.responseBody
 Stream.Position = 0
 Stream.Type = adTypeText
 Stream.Charset = "Shift_JIS"
 S = Stream.ReadText()
 MsgBox S
のようにすれば、文字列としての取得も可能かと思います。

うに さん 2005年 08月 09日 14時 20分 50秒


またつまずいてしまいました。
まず第一段階として、log.txtファイルに日時を記入したいと思ったのですが、苦戦しています。
(実はlinuxシェルの移植を考えているのですが・・・)
DATE=`date "+%Y年%m月%d日"`

TIME=`date "+%H時%M分%S秒"`


echo "開始時間:$DATE $TIME" >> $LOGFILE

の用になっていてとてもスマートで良いのですが、
WSHで同じようなことできないのですね。
まず
WScript.Echo Now
で、日時がでるのはわかったのですが、これでは>>でファイルに追加できないですよね・・・
次にcmdを使って、
ans=w.run("cmd.exe /c date /t >> a.log")
ans=w.run("cmd.exe /c time /t >> a.log")
としたんですが、日付の次に余計な改行が入ってしまいます。
過去ログも見させていただいたのですが、ファイルの日時を取得するというのは多かったのですが、
単純な日時取得は見つけられませんでした。

何かスマートな方法はありませんでしょうか。

うに さん 2005年 08月 08日 19時 27分 32秒

魔界の仮面弁士 様

WEBでいろいろ検索してようやく取得ができました。

Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET","http://localhost",False
oHttp.Send
msgbox(oHttp.responseText)

出来たー、と思ったのですが、残念なことに日本語が文字化けします。
過去ログを見るとUnicodeかshift-jisならば良いと書いてあったと思うのですが、
Shiftjisにもかかわらず日本語がでません。
【例】<HTML><body>テスト</body></HTML>
このような単純なソースでも日本語が化けます。

過去ログから
Set Ie = WScript.CreateObject("InternetExplorer.Application","IE_")
というのを見つけ、そちらなら文字化けしなかったのですが、
できれば、前者の方がスマートなのでそちらで文字コードを解決したいです。

何度も申し訳ありません。よろしくお願いします

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

こういうのはどうでしょう?

HTML/テキスト/画像ファイルをそのエクプローラで開く。

OpenByThisExplorer.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim ie
Set ie=CreateObject("Shell.Application").Windows().Item
If WScript.Arguments.Count Then
 ie.Navigate WScript.Arguments(0)
Else
 ie.Navigate ie.Document.FocusedItem.Path
End If
――――――――――――――――――――――――――――――――――――――
これを「SendTo」に置いて、ファイルを「送る」。

或いは、「お気に入り」や「リンク」に置いて、
エクプローラでファイルを選択して、「お気に入り」や「リンク」から起動。


ばんのしゃーによかばんた さん 2005年 08月 08日 15時 30分 31秒

「お気に入り」に、javascript:* の.URLファイルを入れて、
所謂(?)URLスクリプトを使っているひと、居ます?

これって、昨今のセキュリティ強化でも使えます?

私は前からセキュリティレベルを上げていたので使えず、
使えたら便利そうだなぁと思いながら、ずっと指を咥えていたのですが、
以下の方法でなら使えそうです。:-)

execUrlScript.VBS
――――――――――――――――――――――――――――――――――――――
CreateObject("Shell.Application").Windows().Item.document.parentWindow.execScript CreateObject("WScript.Shell").CreateShortCut(WScript.Arguments(0)).TargetPath
――――――――――――――――――――――――――――――――――――――
.URLにWScript.EXE execURLScript.VBS "%1"を関連付けるか、SendToに置いて、
「お気に入り」の.URLファイルを右クリックする。


魔界の仮面弁士 さん 2005年 08月 08日 11時 14分 18秒

》うに さん 2005年 08月 08日 09時 53分 51秒
> 過去ログでもちらほら出てきているのですが”InetCtls”
> がつかえない、というのが原因みたいです。
> もしかしたらVB6のランタイムでも入れたら・・・と思ったのですが

InetCtlsを使うには、ランタイムではなく、デザインタイムが必要です。
VB6の製品版(もしくはそれに類するもの)を購入していないと使えません。


で。ScriptからのHTMLソースの取得であれば、InetCtlsを使うのではなく、
YZNさん(≠YZNさん)が回答された、「XMLHTTP」を使った手法を使うのが手軽だと思いますよ。


それ以外には、Set Doc = WScript.GetObject(URL) や InternetExplorer や
WebBrowserコントロールなどを利用した取得方法もありますが、これらだと
MSHTML経由の解析になってしまいますので、結果に若干の差異が生じます。

うに さん 2005年 08月 08日 09時 53分 51秒

YZN様

回答ありがとうございます。
でもちょっと求めているものとは違うみたいです。

過去ログでもちらほら出てきているのですが”InetCtls”
がつかえない、というのが原因みたいです。

もしかしたらVB6のランタイムでも入れたら・・・と思ったのですが
はずれでした・・・

みなさん使えているのでしょうか?
それともあまり使わないのでしょうか

ばんのしゃーによかばんた さん 2005年 08月 07日 16時 20分 30秒

>fav さん 2005年 07月 24日 09時 44分 49秒
>IEのインポート/エクスポート ウィザードで作成されるbookmark.htmファイル内の下記タイムスタンプの値は、何処から何の日付を参照しているんでしょうか?
>ADD_DATE= ?
>LAST_VISIT= ?
>LAST_MODIFIED= ?

単に、お気に入りのファイルの
ADD_DATE=File.DateCreated
LAST_VISIT=File.DateLastAccessed     または※
LAST_MODIFIED=File.DateLastModified
のようです。
単位はunixの定番ClockTickです。1970/1/1 00:00:00からのチックタック数(秒)。

ClockTick->Date変換
――――――――――――――――――――――――――――――――――――――
Do
ClockTick=InputBox(vDate)
If ClockTick="" Then Exit Do
vDate=ClockTick2Date(ClockTick)
Loop

Function Date2ClockTick(vDate)
Date2ClockTick=DateDiff("s",DateSerial(1970,1,1),vDate)-9*3600
End Function

Function ClockTick2Date(ClockTick)
ClockTick2Date=DateAdd("s",ClockTick+9*3600,DateSerial(1970,1,1))
End Function
――――――――――――――――――――――――――――――――――――――


URLファイルのModifiedは何処かのデータベースのキーみたい。
これが有効なときは、データベース内の最終表示日時と表示回数が取れる。
有効でないときは、File.DateLastAccessedなので、出鱈目になる。


たいあーど さん 2005年 08月 07日 09時 31分 45秒

むたぐちさん

返信が遅くなりました。
まだ少ししか正規表現についてやっていませんが
今後の参考になりそうです。ありがとうございました。

今ちょっとvbsから離れていて、何をやっているかというとdb2の監視です。
今までdiag.logに複数行書かれるエラーを1行にして加工する、という
作業を全部vbsでやろうとしていました。
1行に加工するのはdb2コマンドで出来そうです。

そこでまた質問で申し訳ないのですが
vbsからdb2コマンドを操る事はできますか?
出来るとしたらどのように書いて実行すればいいのですか?
すみませんが宜しくお願い致します。

YZN さん 2005年 08月 05日 14時 42分 57秒

>WSHそのものでhtmlソースを取得できることがわかりました。

直接の回答ではないですが、
[Webからファイルをダウンロードするには?]
http://winscript.s41.xrea.com/wiki/index.php?%5B%5BFAQ%5D%5D#content_1_10

うに さん 2005年 08月 05日 11時 10分 53秒


恐れ入ります。
htmlソースを取得して、その中に、正しく情報が含まれているかどうかのテストを行おうとしています。
Javaのプログラムでhtmlを取得するものがあるので、
それを利用すればできると思っていたのですが、
こちらの過去ログを見させていただいていたところ、
そのようなことをしなくともWSHそのものでhtmlソースを取得できることがわかりました。
しかしうまくいきませんでした。

Set inet = WScript.CreateObject("InetCtls.Inet")
inet.URL=vURL
inet.AccessType = vAccessType
If (vAccessType = 2) Then inet.Proxy = vProxy
inet.RequestTimeOut=20
data = inet.OpenURL(inet.URL)

このようなコードなのですが、(思い出おじいさん さん 2000年 10月 25日 )
早速一行目で
"InetCtls.Inet"という名前のオートメーションクラスが見つかりませんでした。
というエラーが出てしまいます。

なにがいけないのでしょうか。

魔界の仮面弁士 さん 2005年 08月 04日 11時 23分 46秒

》ニモ さん 2005年 08月 04日 00時 50分 01秒
返されるのは、(VBSやVBAの)Nullではなく、(JScript等の)nullなのです。

VBScript においては、これは Nothing に相当します。
If Node Is Nothing Then で判定してみてください。

ニモ さん 2005年 08月 04日 00時 50分 01秒

夜分遅くすいません。

以下のようにXPathを使ってノードにアクセスした時に指定のパスが存在しない
場合、戻り値でnullが返ると書いてありました。
Set Node = objXMLDoc.documentElement.selectSingleNode("Word/Spanish")

そこで、エラー処理の為に以下のようにしてみたのですがエラーになってしまいます。

Set Node = objXMLDoc.documentElement.selectSingleNode("Word/Spanish")
If IsNull(Node) Then
' エラー処理
End If

WSHでは上記のようなオブジェクトのNULL判定はどのようにしたらよいのでしょうか?
どうかよろしくお願いします。

シーズー大好き さん 2005年 08月 03日 13時 13分 12秒

どうやらフォルダオプションをいじればデフォルトに直るみたいです。
お騒がせ&スレ汚し失礼しました。

シーズー大好き さん 2005年 08月 03日 11時 15分 22秒

VBSを実行させることができなくなってしまいました・・・orz

先日、ソースを修正する度にVBSファイルを右クリックして『編集』を選ぶのが面倒だったため、ダブルクリックでソースを編集できるようにしようと思い、サクラエディタなるエディタで起動するように関連付けを行いました。

編集後、いざ実行させようとするとエディタが起動してしまいます(当然)。
そこで"送るメニュー"にVBSの実行エンジンを追加しようとしたのですが、
あれ、VBSの実行アプリってなんだろう?とわからなくなってしまいました。
元に戻そうとしましたが、エディタをアンインストールしてもエディタの関連付けを
消失しただけで、WSHを呼び出すことができなくなってしまいました。
どのようにすれば再びWSHで実行させることができるのでしょうか?

面倒なことになってしまいお手数をおかけいたします。

うに さん 2005年 08月 03日 09時 32分 53秒

>むたぐち様

ありがとうございます。早速過去ログを調べさせていただきました。
何とか今後作業できそうです!

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("java Hello")
strLine = objExec.StdOut.ReadLine
Wscript.Echo strLine

とりあえず試しにこんな感じでうまくいきました。

またわからなくなったらよろしくお願いいたします。

管理人むたぐち さん 2005年 08月 03日 06時 26分 24秒

To: たいあーど さん

> それでお聞きしたいことですが、検索する文字の前後数バイトを含めて
> 取得するにはどうすればいいですか。
> 例えばtestID 0801 testID 0802 testID 0803… とあって
> 検索文字が"test"とある場合、数字まで拾う手段、という事です。

そういうフォーマットが定まった文字列に対して検索をかけるときに、
正規表現が威力を発揮します。
たとえば次のようなスクリプトでどうでしょうか。

Set RegEx = new RegExp
RegEx.Global = True
sSearch = "test"
sSource = "testID 0801 testID 0802 testID 0803"
RegEx.Pattern = sSearch & "\S*\s\d{4}"

For Each oMatch In RegEx.Execute(sSource)
     Msgbox oMatch.Value
Next

正規表現の構文はWSHのヘルプに載っています。正規表現は最初は
とっつきにくいですが、慣れるととても強力なので、ぜひマスターしておく
ことをお勧めします。

管理人むたぐち さん 2005年 08月 03日 06時 10分 52秒

> javaプログラムの出力をtxtファイルに出力するにはどうしたらよいでしょうか?

WshShell.Execをお使いください。
標準入出力を扱うにはこれが一番です。

どうしてもRunメソッドが使いたいというのならば、
cmd.exe /c java Hello > kekka.txt
のように、cmd.exeのリダイレクト機能を使ってください。

たいあーど さん 2005年 08月 03日 06時 08分 13秒

初めまして。これからVBSを学ぼうとしているものです。
お尋ねしたいことがありましたので投稿させて頂きました。

VBSで何がやりたいかと申しますとログを検出するスクリプトの作成です。
厳密にいうとログの必要な部分を抜き出して加工し
新たなテキストファイルとして作成する、ということがしたいので
少し違うことなるかもしれません。

自分の持っているVBSの本ではInStrでは検索する文字位置の取得方法しか
載っていませんでした。

そしてここのHPのVBS講座 応用編のL15を見て自分のしたい事を具体的に
掴めた気がしました。
検索する文字がヒットし、その行を取得する方法がわかりました。

それでお聞きしたいことですが、検索する文字の前後数バイトを含めて
取得するにはどうすればいいですか。
例えばtestID 0801 testID 0802 testID 0803… とあって
検索文字が"test"とある場合、数字まで拾う手段、という事です。

よろしくお願いします。

うに さん 2005年 08月 02日 17時 24分 48秒

javaプログラムの出力をtxtファイルに出力するにはどうしたらよいでしょうか?
実行そのものは
Set ws=CreateObject("Wscript.Shell")
ws.run "java Hello"
でいけてるみたいなのですが、
ws.run "java Hello" > kekka.txt
としてもだめです。
unixのシェルであれば単純に
$Java Hello > $OutFile
でいけるみたいですが・・・

よろしくお願いします

こも さん 2005年 08月 02日 00時 27分 12秒

ちゃっぴ さん、ありがとうございます。

まだまだ勉強不足でご迷惑おかけして申し訳ございませんでした。
教えていただいたくさいところを再度洗いなおして見ます。

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

ちゃっぴ さん 2005年 08月 01日 23時 32分 52秒

To こも さん 2005年 07月 31日 20時 45分 45秒

> ■ この接続のDNSサフィックス
> ■ この接続のアドレスをDNSに登録する

WMIでできるかも?とおもっているんですから、くさいな?
と思うところをMSDNで調べてやりましょう。

このようなクサイClassがすぐに見つかると思うので

SetDNSDomain Method of the Win32_NetworkAdapterConfiguration Class
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/setdnsdomain_method_in_class_win32_networkadapterconfiguration.asp

あとは、書き換えるMethodを探してやればいいわけです。
すると、クサイものがごろごろと見つかるでしょうから・・・

Win32_NetworkAdapterConfiguration
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_networkadapterconfiguration.asp

SetDynamicDNSRegistration Method of the Win32_NetworkAdapterConfiguration Class
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/setdynamicdnsregistration_method_in_class_win32_networkadapterconfiguration.asp

ばんのしゃーによかばんた さん 2005年 08月 01日 18時 21分 06秒

>管理人むたぐち さん 2005年 07月 31日 17時 29分 46秒
>Download.Ject(JS_JECT.A)は、とあるセキュリティホールを突いて、
>ADODB.StreamのStream生成機能を(セキュリティゾーン・ドメインに関係なく)
>HTML上で呼び出すことができたのだと思います。

HTMLで、CreateObject(ADODB.Stream)できることが問題なのか、と思っていたら、
違うのですか。ちょっと安心。
セキュリティレベルの関門のあるCreateObject()以外の方法(セキュリティホール)で、
ADODB.Streamオブジェクトが作られることがあるので、それを塞いだ、
ってことですか。なら、作るほうを塞ぐべきなのに、変なの。

>その対策として、とりあえずStream生成機能を禁止したんでしょう。
>まさに緊急対策ですね。

しかし、それは、CreateObject(ADODB.Stream)をまともに使っていたひとには
とんでもなく大迷惑でしょうね。

MSは適切な回避策をユーザに示しているのでしょうか。ちょっと心配だなぁ。

以下は、緊急対策で使えなくなったADODB.Streamを、
+3行で再び使えるようにする緊急回避策です。

<html><head><script language="VBScript">
Sub window_onload()
Set Stream=SC.Eval("CreateObject(""ADODB.Stream"")")
MsgBox TypeName(Stream)
End Sub
</script></head><body>
<object id=SC classid=clsid:0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC>
<param name=Language value="VBScript"></object>
</body></html>

セキュリティレベルの関門があるので、レジストリで緊急対策を無効にするより、
はるかに安全です。


ばんのしゃーによかばんた さん 2005年 08月 01日 18時 20分 49秒

>みみ さん 2005年 07月 30日 20時 33分 21秒
>Do Until readList.AtEndOfStream = True

少なくとも、この記述はよくないですね。

私見ですが、普通順に、
Do While Not readList.AtEndOfStream
Do While readList.AtEndOfStream=False
Do While readList.AtEndOfStream=0
Do Until readList.AtEndOfStream
など。

>ばんのしゃーによかばんた さん 2004年 06月 02日 20時 27分 56秒
>※これは以下と同じ話です。要するに「Trueと比べるな」です。
>○使用可 ×使用禁止
>×If x=True Then

Falseは0ですが、0以外はすべてTrueです。
しかし、True=-1なので、例えば、1=-1は数値で比較して成立しない。

Booleanだと思っていたら、実際には、Longで、
Trueとして、1を返すものや、-1を返すものもあるようです。

しかし、今回は、これがループの原因とは考えにくいですね。
AtEndOfStreamは、しっかりBooleanのようですから。

ところで、

>みみ さん 2005年 07月 25日 19時 59分 11秒
>「ファイルにアクセスできません。別のプロセスが使用中です。」
>というエラーメッセージがコマンドプロンプトの画面に表示されるようになりました。

の件はその後どうなりました?

言わずに置こうか、とも思いましたが、今回も同じパターンだし、

>開発をしています。

ということなので、言っておいたほうがご本人の為なので、言いますが、

>ファイルオブジェクトやテキストオブジェクトは全て nullを代入して
>クローズしたつもりだったのですが、まだ何か足りないのでしょうか。

なんて言われても、何の情報もないところで分かる訳がないでしょう?

提示されている範囲の、

>Set wshShell = WScript.CreateObject("WScript.Shell")
>ans = wshShell.Run("cmd.exe /C FC D:\1.txt D:\2.txt >> D:\3.txt 2>&1 ", 1 , true )

だけのソースを実行すれば、うまく行くのではありませんか?

もし、それ以外のコードを加えて、うまく行かないのであれば、
そのコードを示さないで質問しても、適切な答えが得られるとは思えません。

もしも、そのエラーが、上のコードで発生しているのなら、メッセージの通り、
「D:\3.txt」というファイルを「別のプロセスが使用中」なのでしょう。
「D:\3.txt」を書き込みでオープンしている箇所が何処かにあるのでしょう。きっと。

しかし、このエラーの場合は、ans=0になりそうなもので、
最初の話のようなans=1には、ならないと思いますけど。変だなぁ。

で、このような話は、質問に限らず、トラブルの切り分けでも、同じですよね?
「問題パターン」と「うまく行くパターン」の境界を絞り込んで行く。

set FileSys=...
>Set readList = FileSys.OpenTextFile("D:\HostList.lst")
>Do Until readList.AtEndOfStream = True
     ReadData = readList.ReadLine
>Loop

これだけのソースを実行すれば、うまく行くのではありませんか?

それから、書いてないので、想像ですが、デバッグを不可能にする呪文、
On Error Resume Nextを使ってませんか? まず、それを外す。


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

>ばんのしゃーによかばんた さん 2005年 07月 22日 20時 22分 56秒
>しかし、ドロップの方は、ショートカット(.LNK)でも駄目です。

これも、さらに細分化。

「送る」やドロップでも、アプリのショートカット(.LNK)なら大丈夫です。
プロパティで指定した作業フォルダになります。

しかし、「送る」やドロップで、関連付けのショートカット(.LNK)は、駄目です。

そこで、回避策は、
「お気に入り」や「リンク」なら、ショートカット(.LNK)にする。
「送る」やドロップなら、アプリのショートカット(.LNK)にする。

しかし、関連付けのショートカットは、何かにつけて、不都合が生じますね。


こも さん 2005年 07月 31日 20時 45分 45秒

はじめまして。
ここのページを参考にさせていただきWSHの勉強をさせていただいております。
今回は教えていただきたいことがあり、書き込みさせていただきました。

WMIを利用して、TCP/IPの設定変更を行いたいと思っております。
TCP/IPのプロパティ内のDNSタブの中にある
■ この接続のDNSサフィックス
■ この接続のアドレスをDNSに登録する

上記2つの設定方法がわからずに悩んでおります。
どなたかお分かりになる方はいらっしゃいますでしょうか?

よろしくお願いいたします

管理人むたぐち さん 2005年 07月 31日 17時 29分 46秒

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

> なんで、これが、セキュリティ対策になるのか、分かりません。教えてください。
>
> HTML上でStreamの生成を禁止したからって、HTMLからFileSystemObjectと
> WScript.Shellを使って、HTAやWSHを起こせば同じでしょう?何か違うのかな。

Download.Ject(JS_JECT.A)は、とあるセキュリティホールを突いて、
ADODB.StreamのStream生成機能を(セキュリティゾーン・ドメインに関係なく)
HTML上で呼び出すことができたのだと思います。
その対策として、とりあえずStream生成機能を禁止したんでしょう。
まさに緊急対策ですね。

ばんのしゃーによかばんた さん 2005年 07月 31日 16時 53分 06秒

>管理人むたぐち さん 2005年 07月 11日 18時 19分 27秒
>To: megu さん
>UIHelperオブジェクトのImportExportFavoritesメソッドは
>XP SP2の環境では使えなくなっているようです。

エラー:     このオブジェクトではサポートされていない操作です。

そのせいで、「IEのお気に入りをHTML化」の需要が増加している?

ところで、AddFavoriteも、使えなくなったのでしょうか?

エラー:     書き込みできません。

なので、使える環境もあるのかと思って、
.VBS/.HTA/.HTMで試しましたが、いずれも駄目でした。


ばんのしゃーによかばんた さん 2005年 07月 31日 16時 52分 38秒

>魔界の仮面弁士 さん 2004年 07月 19日 23時 40分 49秒
>『管理人むたぐち さん 2004年 07月 04日 12時 00分 28秒』の問題がありますよね。
>今月のWindows Updateにて、トロイの木馬型ウイルス「Download.Ject(JS_JECT.A)」を
>回避するパッチが適用されますが、この影響で、現在はHTML上でのStreamの生成が
>禁止されています。(レジストリを修正しないと、生成できないようになりました)

こんなこと聞くと、そんなことも知らないのか、と言われそうですが、

なんで、これが、セキュリティ対策になるのか、分かりません。教えてください。

HTML上でStreamの生成を禁止したからって、HTMLからFileSystemObjectと
WScript.Shellを使って、HTAやWSHを起こせば同じでしょう?何か違うのかな。

FileSystemObjectやWScript.Shellはノートンがうるさく監視しているけれど、
ADODB.Streamはノートンがノーチェックだから?
まさか、そんな理由じゃないでしょ?

HTML上でStreamの生成が危険なら、セキュリティレベルでオブジェクトの生成を
禁止するのが筋で、それ以外に対策はないと思うのですが、違います?


みみ さん 2005年 07月 30日 20時 33分 21秒

お世話になります。
VBScriptで開発をしています。
突然に拡張子が.lstのファイルのAtEndOfStreamの値が取得できなくなりました。ファイルの末行まで読み込んだにもかかわらず、AtEndOfStream値がfalseになりません。

Set readList = FileSys.OpenTextFile("D:\HostList.lst")
Do Until readList.AtEndOfStream = True
     ReadData = readList.ReadLine
     'ログファイルに出力
Loop

上記の処理で無限ループが発生していまいます。

なぜこのような原因が突然発生してしまったのか、ご存知の方いらっしゃいましたら
教えてください。

XP SP1

管理人むたぐち さん 2005年 07月 30日 20時 07分 02秒

Shell.Applicationを調べてみたんですが、
IShellDispatchはIShellDispatch4のまま変化なしでした。
InternetExplorer.Applicationもざっと見たところ変化はないようです。
ちょっと面白くないですね。

管理人むたぐち さん 2005年 07月 29日 22時 33分 44秒

Windows Vista Beta 1をVirtual PCにインストールしてみました。
WSHは相変わらずver 5.6で安心(?)しました。

wscript.exe/cscript.exe/vbscript.dll/jscript.dll/wshom.ocx/
scrobj.dll/scrrun.dllいずれもファイルバージョンは
5.6.0.8832です。
XPが5.6.0.8825なのでマイナーバージョンアップされているようです。

今後、VB6の英語版でもインストールしてみて、shell.applicationが
どうなってるか調べてみようと思います。
ほかにスクリプト関係で何かチェックしてほしいことがあれば
よろしくどうぞ。

# これはVista + IE7からの書き込みですが、UAはどうなるかな〜?

ばんのしゃーによかばんた さん 2005年 07月 27日 16時 30分 58秒

>管理人むたぐち さん 2005年 07月 20日 17時 38分 02秒
>こちらで確認したところ、Win98/MEではボタンなしダイアログが表示、
>Win2000/XPでは何も表示されず、となりました。
>NT系では使えない技のようです。

過去にも、そういう話がありました。

>管理人むたぐち さん 2003年 06月 27日 08時 45分 46秒


で、ボタンなしダイアログは、IEやHTAを使えば出来そうです。

HTA:
>ばんのしゃーによかばんた さん 2004年 12月 01日 17時 34分 56秒

IE:
>ばんのしゃーによかばんた さん 2004年 12月 02日 16時 19分 58秒


でも、
もし仮にボタンがなかったとしても、右上のxボタンを押されたら、同じ。
さらに、xボタンがなくても、ESCやALT+F4されたら、これも同じ。
結局、ボタンなんて、あってもなくても、同じだと思うんですけど。。。


ところが、本当の問題は、質問内容とは違っていた。。。

>処理中ダイアログを表示させる方法については
>ばんのしゃーによかばんたさんがいろいろ研究されておられますので、
>過去記事を当たってみてください。

処理中メッセージについては、
過去に実にいろいろな方法が出ているので、ちょこっと整理すると、
(1) MS Agentを使う。
(2) Office Assistantを使う。
(3) HTAとProgressBarを使う。
(4) IEのStatusBarを使う。
(5) IEでProgressBarを作る。
(6) HTAでProgressBarを作る。
(7) 別のWSHを起動してMsgBoxを出す。
(8) MSHTAを起動してMsgBoxを出す。
(9) IEからMsgBoxを出す。
(10) ExcelでProgressBarを作る。
(11) CScript.EXEでWScript.Echoを使ってコンソールに出す。

まだあるかも。。。


>補足ですが、私の個人的見解では、cscript.exeで実行の上
>WScript.Echoでメッセージを表示させてやるのが
>一番簡単で使いやすいと思います。

については、
WScript.Echoではなく、WScript.StdOut or StdErr.Writeで、
CRやBSを使って、

WScript.StdOut.Write "1/10 *"
WScript.Sleep 1000
WScript.StdOut.Write vbCr&"2/10 **"
WScript.Sleep 1000
WScript.StdOut.Write vbCr&"3/10 ***"
WScript.Sleep 1000
WScript.StdOut.Write vbCr&"4/10 ****"
WScript.Sleep 1000
WScript.StdOut.Write vbCr&"5/10 *****"

なんてやると、らしく見えます。


ところが、

>むー さん 2005年 07月 21日 15時 33分 29秒
>実は,前回の書き込みの時に書き忘れてしまっていたんですが
>HTAの中で処理を実行しているのでWScriptのEchoやSleepが
>使えない状態です。

てなことが後から出てくると、それまでの話が全部、御破算になるんですよね。

HTAで処理しているなら、showModelessDialogでも使えばいいんじゃないの?
それなら、unadorned:yesを指定して、xボタンなしにもできるし。とか。

それにしても、HTAの中で、
>exCmmand = "perl .\****.pl"
>WshShell.Run exCmmand,7,True
なんてやると、「アプリケーションから応答がありません。」状態になるので、
よくないのでは? とか。

逆に、こっちをExecを使って非同期にして、HTA自身に「処理中」と書けば
よさそうなものです。

それより何より、こういうときは、WSHから駆動する形にしたほうがよいと
思いますけど。画面が必要ならWSHからIEを駆動すればよいし。

というような、全く別方向の話になる訳です。

大体、一般に、方向を間違って進んだがために、必然的に行き詰まって、
質問することが多いのですが、そこで局所的な質問をすると、
仮令、その場限りの打開策が見つかったとしても、所詮、方向性が違うのですから、
結局、破綻する羽目になるんですよね。
なので、質問するときは出発点から説明を始めるようにしましょう。
そうすれば、無駄に回り道をしなくても済みます。


ばんのしゃーによかばんた さん 2005年 07月 27日 16時 30分 40秒

>ちゃっぴ さん 2005年 07月 13日 12時 49分 53秒
>Windows の help で Redirector の使い方勉強しましょう。

と言っても、
2000のヘルプには、「Windows 2000 コマンド リファレンス」があったのですが、
XPのヘルプに、こういうのが見当たらないのですが、あります?
まさか、Home Editionには。。。

※なので、2000のヘルプファイルを併用してますが。


ばんのしゃーによかばんた さん 2005年 07月 27日 16時 30分 23秒

>ばんのしゃーによかばんた さん 2005年 07月 24日 15時 28分 53秒
>FCは、同じでも、違っても、0なので、困ったものです。
>1が返るのは、FCへの引数の数がおかしいときです。

昔(98)の記憶で話してました。
2000/XPのFCは引数エラーは-1、同/異で0/1を返すのですね。

そこで、これを元に、出力なしのファイル比較法。

FC /B file1 file2 >NUL

ECHO N | COMP file1 file2 >NUL



みみ さん 2005年 07月 25日 19時 59分 11秒

>ばんのしゃーによかばんたさんへ
お返事ありがとうございます。

早速、ご教授いただいたコードを試してみました。


>CMD.EXE /K ... ,1

>に変えて、画面で確認してから、ウィンドウを隠すようになさってみては?


結果、
「ファイルにアクセスできません。別のプロセスが使用中です。」
というエラーメッセージがコマンドプロンプトの画面に表示されるようになりました。
ファイルオブジェクトやテキストオブジェクトは全て nullを代入して
クローズしたつもりだったのですが、まだ何か足りないのでしょうか。


>※ところで、cdiffを作ろうとしている?
cdiffというのが何かわかりませんが、二つのファイルを比較し、相違点を
抽出するようなスクリプトを作ろうとしています。

ばんのしゃーによかばんた さん 2005年 07月 25日 15時 35分 32秒

>ばんのしゃーによかばんた さん 2005年 07月 24日 15時 29分 10秒
>ところで、"WScript.Shell".RunのErr.Descriptionが取れません。
>「障害」だと思います。でも、ちょっと不思議な「障害」です。
>エラーダイアログには出るのに、Err.Descriptionからは取れません。
>あまり考え難いのですが、エラーの設定箇所がエラーダイアログ用と
>Errオブジェクト用と別々にあるのでしょうか。

どうも、8007xxxxは、WinError.Hにあるエラーコードのようで、
元々、Err.Numberだけを設定し、Err.Descriptionを設定してないようです。

エラーダイアログは、何処か別のところから取り出しているようです。
※だったら、序でにErr.Descriptionにも設定すりゃいいじゃないか。
場所的には、Err.Raiseの中になるのでしょうけど。

WinError.Hを持っているひとは、それを見ればよいのでしょうが、
持ってない人は?

なので、一覧を作成するスクリプトです。

CScript.EXE WinError.WSF > WinError.TXT
――――――――――――――――――――――――――――――――――――――
<package>
<job>
<script language=VBScript>
Option Explicit
Dim wShell
Dim oExec
Dim Number
Dim Description

Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("CScript.EXE """&WScript.ScriptFullName&""" //Job:Run ")
Do While Not oExec.StdErr.AtEndOfStream
 Description=oExec.StdErr.ReadLine
 If InStr(Description,"(null):") Then
  Number=Left(Description,8)
  Description=Mid(Description,InStr(Description,"(null):")+8)
  If Left(Description,2)<>"0x" Then
   WScript.StdOut.WriteLine Number&vbTab&Description
  End If
 End If
Loop
</script>
</job>
<job id=Run>
<script language=VBScript>
Option Explicit
Dim From:From=0
Dim Number
Dim k
Dim OnScriptTerminate

Class ScriptTerminate
Sub Class_Terminate()
On Error GoTo 0
Number=Number+1
WScript.StdErr.Write Hex(Number)&vbTab
Err.Raise Number
End Sub
End Class
OnScriptTerminate=Array()
For k=From To From+&H3700
 ReDim Preserve OnScriptTerminate(UBound(OnScriptTerminate)+1)
 Set OnScriptTerminate(UBound(OnScriptTerminate))=New ScriptTerminate
Next
Number=&H80070000+From
WScript.StdErr.Write Hex(Number)&vbTab
Err.Raise Number
</script>
</job>
</package>
――――――――――――――――――――――――――――――――――――――


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

>ばんのしゃーによかばんた さん 2005年 05月 22日 16時 36分 20秒
>WSHからだと、
>Set Application=CreateObject("Excel.Application")
>なんとか ChDir "c:\vbs"
>MsgBox Application.GetOpenFilename()
>というのは無理でしょうか?

Set Application=CreateObject("Excel.Application")
DefaultFilePath=xl.DefaultFilePath
'MsgBox DefaultFilePath
xl.DefaultFilePath="c:\vbs"
xl.Quit
Set xl=CreateObject("Excel.Application")
MsgBox xl.GetOpenFileName()
xl.DefaultFilePath=DefaultFilePath

でいいみたいです。


ばんのしゃーによかばんた さん 2005年 07月 24日 15時 29分 27秒

関連付けで、デフォルトで起動する動詞は、
Shellキーの@値があれば、それになると思っていたのですが、
ドロップのときは、それとは関係なく"open"なのですね。嵌りました。

なので、//H:の切り替えは、Shellキーの@値でなく、
openとopen2のキー名を書き換えるのですね。

例えば、//H:WScriptの設定で、
Shellキーの@値を"open2"にしておくと、
ドロップでは、WScript.EXE、
そのほかでは、CScript.EXEとなります。

あまり、使い道がないかな、やっぱり。

>ばんのしゃーによかばんた さん 2005年 07月 22日 20時 22分 56秒
>スクリプトから、ドロップで起動されたかどうかが区別できれば、
>普通は作業フォルダを見て、
>ドロップのときはスクリプトファイルのフォルダ
>のように、場合分けが出来ます。

には、使えますね。

Shellキーの@値を"open3"にしておき、
open3のcommandの@値に、//T:999999 を加えておくと、
WScript.Timeoutが999999かどうかで区別できそうです。



ばんのしゃーによかばんた さん 2005年 07月 24日 15時 29分 10秒

ところで、"WScript.Shell".RunのErr.Descriptionが取れません。
「障害」だと思います。でも、ちょっと不思議な「障害」です。

Option Explicit
Dim OnScriptTerminate

Class ScriptTerminate
Sub Class_Terminate()
If Err Then WScript.Echo Err.Number,Err.Description
End Sub
End Class
Set OnScriptTerminate=new ScriptTerminate

dim wShell
dim rc

Set wShell=CreateObject("WScript.Shell")
rc=wShell.Run("aaaaaaaa.aaa")

エラーダイアログには出るのに、Err.Descriptionからは取れません。
あまり考え難いのですが、エラーの設定箇所がエラーダイアログ用と
Errオブジェクト用と別々にあるのでしょうか。
素直な作りをしていたら、起きそうもない「障害」です。


ばんのしゃーによかばんた さん 2005年 07月 24日 15時 28分 53秒

>みみ さん 2005年 07月 23日 16時 22分 52秒
>ためしに
>Set wshShell = WScript.CreateObject("WScript.Shell")
>ans = wshShell.Run("fc.exe D:\1.txt D:\2.txt >> D:\3.txt 2>&1 ", 0 , true )
>として実行してみました。
>比較する二つのファイルに相違点がある場合は リターンコード0が返って来、相違点が無い場合はリターンコードが0のようです。
(相違点はテキストファイルには出力されない)

これは、「CMD.EXE /C」が抜けているせいです。

FCは、同じでも、違っても、0なので、困ったものです。
以下参照。

>ばんのしゃーによかばんた さん 2004年 05月 02日 19時 30分 19秒

>みみ さん 2005年 07月 22日 15時 25分 01秒
>コマンドラインのFCコマンドを利用しようとしているのですが
>下記のコードで戻り値が1となり、比較結果が出力されません。
 
1が返るのは、FCへの引数の数がおかしいときです。
なので、

>ばんのしゃーによかばんた さん 2005年 07月 22日 21時 15分 17秒
>>Set wshShell = WScript.CreateObject("WScript.Shell")
>>ans = wshShell.Run("cmd.exe /C FC 1.txt 2.txt >> 3.txt 2>&1 ", 0 , true )
>>*ファイルのパスは省略してコピーしています。
>そこに問題があるのでは?
>空白を含むパス名を引用符で囲まず、文字列連結しているのでは?

を疑った訳です。

>みみ さん 2005年 07月 23日 16時 12分 12秒
>ためしに↓
>Set wshShell = WScript.CreateObject("WScript.Shell")
>ans = wshShell.Run("cmd.exe /C FC D:\1.txt D:\2.txt >> D:\3.txt 2>&1 ", 0 , true )
>やはり結果が出力されまん。

これで、よさそうなものですが、駄目ですか?

CMD.EXE /K ... ,1

に変えて、画面で確認してから、ウィンドウを隠すようになさってみては?

※ところで、cdiffを作ろうとしている?


fav さん 2005年 07月 24日 09時 44分 49秒

IEのインポート/エクスポート ウィザードで作成されるbookmark.htmファイル内の下記タイムスタンプの値は、何処から何の日付を参照しているんでしょうか?
それを解説したサイトのリンクがあれば助かります。

ADD_DATE= ?
LAST_VISIT= ?
LAST_MODIFIED= ?

宜しくお願いします。

ばんのしゃーによかばんた さん 2005年 07月 23日 18時 08分 14秒

Exec.WSFは標準入力を使わないなら、.VBSでも出来ます。

Exec.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim wShell
Dim fso
Dim StdOut
Dim StdErr
Dim TempPath
Dim pStdOut
Dim pStdErr
Dim Command

Set fso=CreateObject("Scripting.FileSystemObject")
TempPath=fso.GetSpecialFolder(2).Path
pStdOut=fso.BuildPath(TempPath,fso.GetTempName())
pStdErr=fso.BuildPath(TempPath,fso.GetTempName())
Set wShell=CreateObject("WScript.Shell")
Command="fc"
Call CreateObject("WScript.Shell").Run("CMD.EXE /C "&Command&" 1>"""&pStdOut&""" 2>"""&pStdErr&"""",0,False)
Do While Not fso.FileExists(pStdOut)
 WScript.Sleep 1000
Loop
Set StdOut=fso.OpenTextFile(pStdOut)
Do While Not fso.FileExists(pStdErr)
 WScript.Sleep 1000
Loop
Set StdErr=fso.OpenTextFile(pStdErr)
Do
 Do While Not StdOut.AtEndOfStream
  MsgBox StdOut.ReadLine
 Loop
 Do While Not StdErr.AtEndOfStream
  MsgBox StdErr.ReadLine
 Loop
 If AtEndOfStream(pStdOut) And AtEndOfStream(pStdErr) And StdOut.AtEndOfStream And StdErr.AtEndOfStream Then Exit Do
 WScript.Sleep 1000
Loop
StdOut.Close
StdErr.Close
fso.DeleteFile(pStdOut)
fso.DeleteFile(pStdErr)

Function AtEndOfStream(Path)
On Error Resume Next
Call fso.OpenTextFile(Path,8)
AtEndOfStream=CBool(Err.Number=0)
End Function


ばんのしゃーによかばんた さん 2005年 07月 23日 18時 07分 53秒

Runで非同期待ち合わせをする方法。

Windowsアプリなら使わない標準出力を利用します。
.WSFやExecを使わず、.VBSで出来ます。

Run.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim wShell
Dim fso
Dim StdOut1
Dim StdOut2
Dim TempPath
Dim pStdOut1
Dim pStdOut2
Dim Command1
Dim Command2

Set fso=CreateObject("Scripting.FileSystemObject")
TempPath=fso.GetSpecialFolder(2).Path
pStdOut1=fso.BuildPath(TempPath,fso.GetTempName())
pStdOut2=fso.BuildPath(TempPath,fso.GetTempName())
Set wShell=CreateObject("WScript.Shell")
Command1="Notepad.exe"
Command2="Notepad.exe"
Call CreateObject("WScript.Shell").Run("CMD.EXE /C "&Command1&" 1>"""&pStdOut1&"""",0,False)
Call CreateObject("WScript.Shell").Run("CMD.EXE /C "&Command2&" 1>"""&pStdOut2&"""",0,False)
Do While Not fso.FileExists(pStdOut1)
 WScript.Sleep 1000
Loop
Set StdOut1=fso.OpenTextFile(pStdOut1)
Do While Not fso.FileExists(pStdOut2)
 WScript.Sleep 1000
Loop
Set StdOut2=fso.OpenTextFile(pStdOut2)
Do
 If Not StdOut1 Is Nothing Then
  If AtEndOfStream(pStdOut1) Then
   StdOut1.Close
   Set StdOut1=Nothing
   MsgBox Command1
  End If
 End If
 If Not StdOut2 Is Nothing Then
  If AtEndOfStream(pStdOut2) Then
   StdOut2.Close
   Set StdOut2=Nothing
   MsgBox Command2
  End If
 End If
 If AtEndOfStream(pStdOut1) And AtEndOfStream(pStdOut2) Then Exit Do
 WScript.Sleep 1000
Loop
fso.DeleteFile(pStdOut1)
fso.DeleteFile(pStdOut2)

Function AtEndOfStream(Path)
On Error Resume Next
Call fso.OpenTextFile(Path,8)
AtEndOfStream=CBool(Err.Number=0)
End Function


ばんのしゃーによかばんた さん 2005年 07月 23日 18時 07分 25秒

InternetShortcutに関する疑問です。

.URLファイルをメモ帳で開いて、

WorkingDirectory=...

を指定できます。プロパティページでは見えません。

URL=...\ARGS.VBS

を指定した場合は、効きます。

URL=...\hoge.HTM

を指定した場合は、効きません。

これって、何のためにあるのでしょう?

例えば、

URL=.../ARGS.VBS?hoge+hoge

などと書いて、引数が渡ったりするのであれば、役に立ちそうですが、
引数なしに、WorkingDirectoryだけあっても仕方がなさそう。


因みに、パス名(C:\〜)をURL(file:///c:/〜)に変換するVBScriptです。

Path2URL.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim wShell
Dim Link
Dim Path

Set wShell=CreateObject("WScript.Shell")
Set Link=wShell.CreateShortCut("temp.url")
Do
 Path=InputBox(Path,WScript.ScriptName,Path)
 If Path="" Then Exit Do
 Link.TargetPath=Path
 Path=Link.TargetPath
Loop
――――――――――――――――――――――――――――――――――――――
ほんとは逆が欲しいところですが、ノーアイデア。


Return