管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 11日 12時 34分 53秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: さなえ さん

> 私がいまいちIDとパスワードの概念を理解してないのかもしれません。
> 説明不足でもうしわけありませんが、処理の内容として、
> NTがログオフ状態でATコマンドによってVBSファイルを動かして、
> マッピングをして容量のデータを取ってくるということをしたいのです。
> その場合はマッピングはできないのでしょうか?
> ログオン状態だと正常な処理をしてくれます。

私もあまり詳しくはないのですが…。
ログオンしないでマッピングはできないのでは?
MapNetworkDriveのIDとパスワード指定は、ログオン処理までしてくれる
ものではないと思います。
# あくまで、その接続のアカウント情報を、現在のものから変更するというだけで。
## WSH自体が、ログオンスクリプトで使われるくらいですから。

でも、それはエクスプローラでも同じだと思うんですが…。
確認ですが、エクスプローラならログオン状態でないときも、IDとパスワードを
指定すれば、マッピングができるんですよね?
とすれば、エクスプローラでのドライブ割り当ては、ログオン処理も
同時におこなっていることになりますが…。

RiffRaff さん 2000年 04月 11日 12時 21分 07秒

管理人むたぐち さんへ

アドバイス有難うございます。
私は2000ではないのでwinipcfg の方を早速試してみます。

さなえ さん 2000年 04月 11日 10時 55分 48秒

>管理人様
私がいまいちIDとパスワードの概念を理解してないのかもしれません。
説明不足でもうしわけありませんが、処理の内容として、
NTがログオフ状態でATコマンドによってVBSファイルを動かして、
マッピングをして容量のデータを取ってくるということをしたいのです。
その場合はマッピングはできないのでしょうか?
ログオン状態だと正常な処理をしてくれます。
お手数かけまして申し訳ありません。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 11日 01時 25分 17秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: さなえ さん

> 指定したID、パスワードで入れていないようなのですが。。。

IDやパスワードに、VBSの特殊文字が含まれているということはないですか?
" など。

それと、関係ないと思いますが、
WshNetwork.MapNetworkDrive "z:", "\\Server\c$", False ,"Administrator","admin"
と、引数を省略しないで書いてみては?

ところで、エラーは出ていないんですよね?
割り当て自体は成功しているのでしょうか?

To: SHIN さん

> > CR+LFが、Windows(というかShift-jis)での一般的な改行コードですが、
> > これは、ページの文字コードによって違ってくるんでしょうね。
>
> とあるのですが、ASPでの掲示板作成というのを無視して、ただ単にCR+LFの文字コードをほかの文字に変換しようとするスクリプトの書き方はあるのでしょうか?

ええ、こちらもしつこいようですが、その「スクリプト」は何の言語なんでしょうか。
それを教えていただけないと、こちらとしても「答えられるか、答えられないか」すらわかりません。

VBSならば、Replace関数を使えば、比較的容易に改行コードを<br>に変換できます。
str=<書き込みの内容>
str=Replace(str,vbCrLf,"<br>")


SHIN さん 2000年 04月 10日 20時 22分 36秒

管理人むたぐち さんへ
いろいろとアドバイスありがとうございます。
しつこいと思われるかもしれませんが以下内容文の

> CR+LFが、Windows(というかShift-jis)での一般的な改行コードですが、
> これは、ページの文字コードによって違ってくるんでしょうね。

とあるのですが、ASPでの掲示板作成というのを無視して、ただ単にCR+LFの文字コードをほかの文字に変換しようとするスクリプトの書き方はあるのでしょうか?




さなえ さん 2000年 04月 10日 15時 03分 50秒

>管理人様
もちろんエクスプローラーで割り当てはできています。
IDとpasswordは仮に書いたので”が抜けていましたが、
もちろんそのミスでもありません。
指定したID、パスワードで入れていないようなのですが。。。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 10日 13時 37分 59秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/


To: RiffRaff さん

> スクリプトの実行時にインターネットに接続しているかどうかで処理分岐
> をさせたいと思っているのですがこの情報をどのように取得すればよいか
> わかりません。過去ログを参考にIPアドレスを取得する方法も試したのですが
> VB6が入っていないためか私の環境では動きませんでした。

ipconfig.exeの出力をリダイレクトで、もしくはwinipcfg.exe /batch filenameで、
ファイルに出力して、そのファイルを読み込んでIPアドレスが書いてあるところを
抽出するという方法があります。ちょっと面倒ですけど。

Win2000なら、WMIを使ってやれば簡単です。

Set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
("select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each IPConfig In IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
msgbox Join(IPConfig.IPAddress,",")
End If
Next

To: さなえ さん

> Dim WshNetwork
> Set WshNetwork = WScript.CreateObject("WScript.Network")
> WshNetwork.MapNetworkDrive "z:", "\\Server\c$", , Administrator, admin

エクスプローラでなら、このネットワークドライブの割り当てはできるのでしょうか?
エクスプローラでできないなら、当然スクリプトでもできません。

まさか、
WshNetwork.MapNetworkDrive "z:", "\\Server\c$", ,"Administrator","admin"
にするとか、そういう問題ではないですよね…?

さなえ さん 2000年 04月 10日 12時 08分 39秒

はじめましてさなえと言います。
ちょっとわからないことが有りまして質問させてください。

WScriptオブジェクトのMapNetworkDriveを使って
ネットワークドライブのマッピングをしたいのですが、
strUserとstrPasswordを使っても指定したIDとパスワードで
NTにログインしてくれません。
ソースはこんな感じです。

Dim WshNetwork
Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.MapNetworkDrive "z:", "\\Server\c$", , Administrator, admin

他になにか設定をしないと行けないのでしょうか?
有識者の方々教えてください。

RiffRaff さん 2000年 04月 09日 03時 16分 41秒

最近わからずに困っていることがあります。
スクリプトの実行時にインターネットに接続しているかどうかで処理分岐
をさせたいと思っているのですがこの情報をどのように取得すればよいか
わかりません。過去ログを参考にIPアドレスを取得する方法も試したのですが
VB6が入っていないためか私の環境では動きませんでした。

自分なりに色々と考えてはいるもののどうも乏しい知識なのでアイデアが
浮かびません。何かよい方法があればご教授願います。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 09日 03時 08分 14秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: SHIN さん

> この内容で改行されたという情報はどのように取得すればいいのでしょうか?
> (ENTERキーが押されたと判断する文字(コード)の取得)

うーん。それは言語によって違います。

CR+LFが、Windows(というかShift-jis)での一般的な改行コードですが、
これは、ページの文字コードによって違ってくるんでしょうね。
VBSでは、vbCrLfという定数が該当します(ASPではVBSが主流なのかな?)。
JavaScriptやPerlやCなどは \n ですか。

SHINさんの掲示板の動作環境もよくわからないので、これ以上のことは書けません…。
(環境がわかったとしても、多分私にはこれ以上のことは言えないと思います。あしからず)

# 出来合いのCGIスクリプトを利用するというのは駄目なんでしょうか?

SHIN さん 2000年 04月 08日 09時 13分 42秒

管理人むたぐちさん

ありがとうございます。

> <textarea>の内容をsubmitしたとき、改行を反映させて表示させるには、改行を
> <br>で置き換える必要があると思います。もしくは<pre>で囲むとか。
> そういうスクリプトを組めばいいのではないでしょうか。

この内容で改行されたという情報はどのように取得すればいいのでしょうか?
(ENTERキーが押されたと判断する文字(コード)の取得)

よろしくお願いします。


管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 08日 03時 27分 20秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

○WMIでファイル操作する話

'このスクリプトは、D:\WINNTにある拡張子txtのファイルを表示します。
Dim str
Set FileSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
("select * from CIM_DataFile where Drive='D:' And Path='\\winNT\\' And Extension='txt'")

For Each File In FileSet
str=str & File.Caption & vbTab & File.FileType & vbTab & File.FileSize & "bytes" & vbCrLf
Next

MsgBox str

前に挙げた「サウンドデバイス列挙スクリプト」は、InstancesOfメソッドを使ったため、すべての
オブジェクトが対象になっていましたが、このCIM_DataFileクラス(全ファイル)のように、対象が
膨大の場合は、ExecQueryメソッドで絞込みをおこないます。
ExecQueryメソッドの引数は、WMI Query Language (WQL)という、簡易言語?です。

select * from CIM_DataFile というのは、CIM_DataFileというクラスの、全プロパティを参照する、
という意味です。

*のかわりに具体的なプロパティ名を記述することもできます。
select Name,Path from CIM_DataFile
なら、NameプロパティとPathプロパティのみを参照する、という意味になります。

where以下は、プロパティが一致するものを絞り込むものです。
where Drive='D:' なら、Dドライブ以下のファイル、ということになります。
このとき注意しなければならないのは、文字列は''でくくるということと、
\(ファイルのパス区切り文字)は、\\で置き換えるということです。

さらに、=(等しい)、>(大なり)などの演算子や、And/Orの論理演算など、VBSライクな記述が
できます。

結局、select * from CIM_DataFile where Drive='D:' And Path='\\winNT\\' And Extension='txt'
とは、「D:ドライブにあり、\winNT\というパスで、拡張子がtxtであるファイルのコレクション」
ということになるのです。

GetObject関数の引数"winmgmts:{impersonationLevel=impersonate}"を、
"winmgmts:{impersonationLevel=impersonate}!//pcname"
とすることで、ネットワークにつながった、他のPCに対しても実行できます。

ADSIと併用すれば、pcname(コンピュータ名)をスクリプトから取得することも可能です。
こんなふうに:
Set adsDomain = GetObject("WinNT://domainName")
adsDomain.Filter=Array("computer")
For Each Comp In adsDomain
'comp.name
'でコンピュータ名が取得できる。
Next

*

'C:\boot.iniのバックアップ
Dim str
Const path="D:\boot.bak"
Set FileSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
("select * from CIM_DataFile where Name='C:\\boot.ini'")

For Each File In FileSet
msg=MsgBox (File.Name & "を" & path & "にコピーします。よろしいですか?",vbYesNo)
If msg=vbYes Then
File.Copy path
End If
Next

このように、メソッドを利用して、ファイル操作することも可能です。

現在までに理解できたことを書いてみました。
とりあえず、microsoft.public.scripting.wshに投稿される、WMIのソースが
理解できるようになったのがうれしい(^^;

To: 【おじさま】 さん

> そうなんですか。変数名ってプログラムがだんだん大きくなってくる
> と似たような名前のが増えてきてうまく省略できなくなり長くなって

変数名をうまくつけるのが、見やすい(手を入れやすい、デバッグしやすい)
プログラムを書く必須条件みたいなものなんでしょうね。

私なんかも、よく変数をなんとつければいいか、迷ってしまうことがあります。
たまにネタ切れになると、一太郎マクロのように、漢字変数名が使いたくなったりします。

To: 石山 さん

> いったいどういうものなのか、まだ全然わからない状態です。
> なんとなく、管理人さんとおじさまのスクリプトを組み合わせてみました。

人のコードをコピーしてでもいいから、とにかく書いて実行を繰り返す。
その後でヘルプを見て、そのコードの意味を把握する。
これが、習得への一番の近道でしょうね。

To: SHIN さん

> で、教えていただきたいのがこの掲示板のように掲示板での情報のやりとりを
> 行いたいのですが、ENTERキーを押したときに改行して表示させるにはどう
> すればいいのでしょうか?

残念ながら、この掲示板は、私が作成したものではありません(プロバイダのもの)ので、
詳しくはお答えできません。

<textarea>の内容をsubmitしたとき、改行を反映させて表示させるには、改行を
<br>で置き換える必要があると思います。もしくは<pre>で囲むとか。
そういうスクリプトを組めばいいのではないでしょうか。

SHIN さん 2000年 04月 07日 20時 25分 39秒

現在、会社でイントラネットを使った業務作成を行っているのですがほとんど
何もわからない状態で困っています。

で、教えていただきたいのがこの掲示板のように掲示板での情報のやりとりを
行いたいのですが、ENTERキーを押したときに改行して表示させるにはどう
すればいいのでしょうか?

データの受け方はわかったのですが改行をさせる方法がどうしてもわかりません。
ご指導よろしくお願いいたします。

石山 さん (ishiyama@taito.net) 2000年 04月 07日 02時 02分 41秒

>勿論既定プロパティを知った上で省略するのは上手な仕様の使い方な
>のですが、石山さんがそれをご存知の上で敢えてそうしたのか、それ
>ともご存知なくてたまたま書いたら通っちゃったのか判断できません

もちろん、たまたま通っちゃったんです(-_-;)
プロパティとかオブジェクトとかプロシージャとか・・・
いったいどういうものなのか、まだ全然わからない状態です。
なんとなく、管理人さんとおじさまのスクリプトを組み合わせてみました。
まだまだ、改良すべき点は沢山あるようですね。
勉強しま〜〜〜す!!


【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 07日 01時 08分 10秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

>objWordのように、変数名プリフィックスに3文字を使うのではなく、
>oWordのように、一文字にするのが最近の流行らしいです。

そうなんですか。変数名ってプログラムがだんだん大きくなってくる
と似たような名前のが増えてきてうまく省略できなくなり長くなって
きます。で、長くなった分結局書き間違ったりして余計なエラーを出
したりします(^^;)。

>Fileオブジェクトの既定プロパティはPathですので、こういう使い方
>(引数に文字列型を取るプロシージャに代入)は、特に問題はないと思
>います。

勿論既定プロパティを知った上で省略するのは上手な仕様の使い方な
のですが、石山さんがそれをご存知の上で敢えてそうしたのか、それ
ともご存知なくてたまたま書いたら通っちゃったのか判断できません
でしたので一応指摘させていただきました。私自身は少なくとも他人
にソースを見せるような場合にはプロパティを明示したほうが誤解が
少ないと思います。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 07日 00時 46分 14秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: 【おじさま】 さん

> 別に objWord にこだわらずご自分なりの書き方で統一されたほうが良
> いと思います(別にこのままでも良いのですが(^^;))。

これは、たぶん私の責任です。
変数の命名基準がばらばらです。いつか、統一しなければ…、といつも
思っています。

objWordのように、変数名プリフィックスに3文字を使うのではなく、
oWordのように、一文字にするのが最近の流行らしいです。

obj→o str→s int→i ブール→b lng→l バリアント→v 配列→a

統一する際は、この形式でやるのが楽かなあ、と思っています。

bool/byte date/double string/single でダブるのが問題ですが、
あまり使わないほうを3文字にしてやるといいでしょう。
b(bool),byt(byte),d(date),dbl(double),s(string),sng(single)のように。

> たまたま VB 系の仕様で VB が
> 勝手に最も適切と思われる(?)プロパティを付けてくれるので(こ
> の場合には多分 f1 は f1.Path と解釈される)エラーになりませんが

Fileオブジェクトの既定プロパティはPathですので、こういう使い方(引数に文字列型を
取るプロシージャに代入)は、特に問題はないと思います。
既定プロパティは、オブジェクトブラウザでも確認できます。たいていは
NameやPathとかの、「もっともよく参照されるであろう」プロパティが既定に
なっています。
# コレクションの場合は、Itemプロパティが既定ですね。

VBS以外で、既定プロパティが反映されるかどうかは、私も知りません。
それに、引数としてバリアント型(つまり、オブジェクト型も文字列型も取りうる)の
変数を求める関数やプロシージャに入れたときの動作が不明瞭ですね。

やはり、プロパティは明示したほうがいいでしょう。

> >strSaveFileName = "a:" & Fs.GetBaseName(f1) & ".txt"
>
> これも Right 関数や Replace 関数で doc を txt にするだけで良い
> ような。例えば

まあ、この方法は汎用性がありますから。拡張子がなくても、5文字でも、
aiu.e.oとかのわけのわからないファイル名でも問題ありません。
実行速度も、さほど変わらないんじゃないかと思います。

あとは、【おじさま】さんのおっしゃるとおりです。

To: sakakibara さん

こんにちは。メールどうもありがとうございました。

> むたぐちさんのページを見ながら勉強していたのですが、WSHの
> エラーメッセージがおかしくなっています。(英語のアプリケーションに
> 日本語を表示させた時のようになる。)

この不具合は、以前どなたかがおっしゃっていたような気が…。
ログを見てもらえれば、出てくると思います。
が、結局改善しなかったのではなかったかな…?

# 発言も500件を超え、探すのがしんどくなってきました(^^;

とにかく、インストールしたWSHは、間違いなく日本語版でしたでしょうか。
(ダウンロードページでは、日本語のものを選択されましたでしょうか)

私のWin98環境では、

wscript.exe 日本語
cscript.exe 日本語
wshom.ocx 日本語
wshext.dll 日本語
vbscript.dll 英語
vbsjp.dll 日本語
jscript.dll 英語
jsjp.dll 日本語
scrrun.dll 英語
scrrnjp.dll 日本語

となっています。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 06日 17時 00分 57秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: 柴犬 さん

>WSH Editer発見!

情報提供はありがたいのですが…

何か不穏な内容のドキュメントが公開されていますね。このページ。
# EditorではなくEditerなところが妙に気になる…。

というわけで、ごめんなさい。自己解凍zipを実行する勇気はありませんです(^^;

To: 石山 さん

> フロッピー中のすべての.docファイルを同じフロッピーに.txt形式で
> 書き出します。エラー処理などまったくしてませんが・・・

そうですね。同名ファイルの存在確認くらいはしておいた方がいいかもしれません。
面倒なら、 On Error Resume Nextでもいいんじゃないでしょうか。
(処理がスキップされてしまいますけど)

> スクリプトって、本当に面白いですね。またいろいろ勉強させてください。

自分の思った処理が、自在にスクリプトにできるようになると、面白さは
倍増すること請け合いです。
これからもがんばってくださいね。

To: 【おじさま】 さん

> いえいえ、過ぎるなんて事はありません。むしろ相当マニアックな
> 内容にも充分対応できるのがこのサイトの良いところですから、こ
> れからも益々マニアックになってください。

はい。それではこれからもマニアックさに磨きをかけて、皆様のニーズに
お答えしていきたいと思う次第であります(笑)

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 06日 14時 39分 34秒
URL:http://homepage1.nifty.com/~tomiyama/

石山さん

既にお気付きと思いますが、Right じゃなくて Left でした。
お恥ずかしい(^^;)(^^;)(^^;)。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 06日 14時 31分 57秒
URL:http://homepage1.nifty.com/~tomiyama/

石山さん

>Set objWord = CreateObject("Word.Application")

私は習慣でこういう変数名にします。だから FileSystemObject なら
objFs とか objFso みたいに書きます。石山さんは FileSystemObject
を Fs に、Folder オブジェクトを fol みたいに書かれているので、
別に objWord にこだわらずご自分なりの書き方で統一されたほうが良
いと思います(別にこのままでも良いのですが(^^;))。

>For Each f1 In fc
>If Fs.GetExtensionName(f1) = "doc" Then

GetExtensionName の引数は文字列です。f1 は File オブジェクトで
すよね。だからこれだと文字列を入れるところにオブジェクトそのも
のを入れていることになりませんか。たまたま VB 系の仕様で VB が
勝手に最も適切と思われる(?)プロパティを付けてくれるので(こ
の場合には多分 f1 は f1.Path と解釈される)エラーになりませんが
これで通ったとしても正確な書き方ではないように思うのですが。
f1.Name とか f1.Path を入れたほうが良いと思います。

それからこれだと拡張子が doc だけになりませんか。DOC や Doc や
dOc の場合もありますよね。

If UCase(Fs.GetExtensionName(f1.Path)) = "DOC" Then

とか

If LCase(Fs.GetExtensionName(f1.Path)) = "doc" Then

ではどうでしょう。

>strOpenFileName = "a:" & Fs.GetBaseName(f1) & ".doc"

その前の条件でここに来るのは拡張子が doc のファイルだけですから
単に

strOpenFileName = f1.Path

で良いのでは。

>strSaveFileName = "a:" & Fs.GetBaseName(f1) & ".txt"

これも Right 関数や Replace 関数で doc を txt にするだけで良い
ような。例えば

strSaveFileName = Right(strOpenFileName, Len(strOpenFileName) - Len("doc")) & "txt"

とか(長いでしょうか(^^;))。

sakakibara さん (sakakibara@sunplus.com) 2000年 04月 06日 13時 11分 41秒

はじめまして、sakakibaraと申します。
WSHを勉強し始めたのですが、少々困っている事があるので質問させて頂きます。
むたぐちさんのページを見ながら勉強していたのですが、WSHの
エラーメッセージがおかしくなっています。(英語のアプリケーションに
日本語を表示させた時のようになる。)
「日本語版と英語版が混ざってしまったのでは」と思っているのですが
何が悪いのか想像が付くようでしたら教えて頂きたいと思い投稿します。
#書かれている様に作業を進めたいったつもりなのになぁ。(^^;

石山 さん (ishiyama@taito.net) 2000年 04月 06日 00時 04分 00秒

管理人さん、【おじさま】さん
おかげさまで、下記のようなスクリプトが出来ました。
word97、word98+win95で、動いています。
フロッピー中のすべての.docファイルを同じフロッピーに.txt形式で
書き出します。エラー処理などまったくしてませんが・・・

------------------------------

Set objWord = CreateObject("Word.Application")
Set Fs=WScript.CreateObject("Scripting.FileSystemObject")
Set fol=Fs.GetFolder("a:\")
Set fc=fol.Files
objWord.Visible = True
For Each f1 In fc
If Fs.GetExtensionName(f1) = "doc" Then
strOpenFileName = "a:" & Fs.GetBaseName(f1) & ".doc"
strSaveFileName = "a:" & Fs.GetBaseName(f1) & ".txt"
objWord.Documents.Open strOpenFileName
objWord.ActiveDocument.SaveAs strSaveFileName,2
objWord.ActiveDocument.close
End If
Next
objWord.Quit

------------------------------

スクリプトって、本当に面白いですね。またいろいろ勉強させてください。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 05日 05時 33分 25秒
URL:http://homepage1.nifty.com/~tomiyama/

石山さん

動いたようで良かったです。やっぱり Word のバージョンによって
定数が異なるのかもしれませんが、管理人むたぐちさんも書かれた
様にオブジェクトブラウザで確認されるのが良いと思います。

管理人むたぐちさん

> # 内容がマニアック過ぎますか?

いえいえ、過ぎるなんて事はありません。むしろ相当マニアックな
内容にも充分対応できるのがこのサイトの良いところですから、こ
れからも益々マニアックになってください。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 05日 03時 08分 09秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

Win2000をお持ちの方で、シェルのオブジェクトをWSHで利用したいと考えているなら、
WinNT\Webフォルダはぜひ覗いておきましょう。
いろいろ参考になることが多いですよ。

*.httや*.jsは、なぜかunicodeになっているので、メモ帳で開きましょう。
そういえば、EmEditor3では、unicode対応される予定があるらしいですよ。
でも、unicodeって嫌いです。Win2000の検索が、Shift-jisベースでおこなわれるので、
unicodeなテキストには引っかかりませんので。

今まで知らなかったんですが、
objFolder.ApplicationでShellオブジェクトが参照できるんですね。
# それを利用して、ShellExecuteを呼び出して、コンパネのアイテムを
# 開くような使い方がありました。

でも、Win2000のフォルダカスタマイズって気に入らないです。
実際にやってみるとわかるんですが、カスタマイズするフォルダにサブフォルダが作られ、
そこに*.httやら背景ビットマップやらアイコンやらがコピーされるので、
鬱陶しいことこの上ない!

To: 【おじさま】 さん

フォロー、ありがとうございました。

> VB にも := の書き方はありますが行が長くなるのであまり使って
> いません。WSH で通るかどうかは確認していませんが、通らないな
> ら使わないのがよろしいかと。

:=という書き方は知らなかったのですが、引数名を指定して値を入れることが
できるんですね。
VBSでは、どうやらサポートされていないようです。

> だそうです。ただしあくまで Word2000 の話で、別なバージョンの
> Word ではこの定数でダメだったという話も聞いたことがあります
> ので(確かな話ではありません)、すべてのバージョンの Word で
> 共通かどうかは存じません。

このへんは、VBAのオブジェクトブラウザで、タイプライブラリを見てみるのが
一番確実ですね。
WSH2.0の*.wsfファイルは、タイプライブラリ参照をサポートしているので、
Constを使わずとも、いきなりwdFormatTextと書いてもOKです。
詳しくは、ここの「WSH2.0の新機能」などを見てください。

> お久しぶりです。ここはちゃんと巡回しておりますが、最近内容が
> ぐっと難しくなりまして落ちこぼれ状態です。益々ご活躍ですね。

どうもお久しぶりです。
Win2000が手に入って、またスクリプトの世界が広がった感じです。
# 内容がマニアック過ぎますか?

柴犬 さん 2000年 04月 05日 01時 14分 50秒
URL:http://www.urban.ne.jp/home/function/

http://www.urban.ne.jp/home/function/
WSH Editer発見!
個人的にはF1キーでWSH Helpをオンライン検索してくれるのがお気に入り

石山 さん (ishiyama@taito.net) 2000年 04月 05日 00時 51分 24秒

【おじさま】さん
できました!! ありがとうございました。
そのままでは、エラーがでたのですが、
4行目を
objWord.ActiveDocument.SaveAs 書き込みファイル名, 3
としたら、出来ました。word98です。
また、何かありましたら質問するかもしれません。よろしくお願いします。

石山 さん (ishiyama@taito.net) 2000年 04月 05日 00時 31分 11秒

【おじさま】さん
ありがとうございます。
そのスプリクトでやってみます。
wdFormatTextの前に余計な文字をつけたのが悪かったようです。
wshは、うまく使えれば大変便利かと思っています。
勉強中です。今後ともよろしくお願いします。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 04月 04日 19時 17分 58秒
URL:http://homepage1.nifty.com/~tomiyama/

石山さん

>【おじさま】を探してみます。

ここにおります(^^;)。

>で”:=”の部分がwshだと通らないようです。

VB にも := の書き方はありますが行が長くなるのであまり使って
いません。WSH で通るかどうかは確認していませんが、通らないな
ら使わないのがよろしいかと。

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
objWord.Documents.Open 読み込みファイル名
objWord.ActiveDocument.SaveAs 書き込みファイル名, wdFormatText
objWord.Quit

で、プレーンテキストに変換してくれます。Visible のところは
ないほうが Word の画面が見えなくていかにもコンバータという
感じの動きになりますが、Word でエラーがあった時に訳が分から
なくなりますから動作は田舎臭くてもあったほうが良いと思います。

ご存知と思いますが定数は

Private Const wdFormatDocument = 0
Private Const wdFormatTemplate = 1
Private Const wdFormatText = 2
Private Const wdFormatTextLineBreaks = 3
Private Const wdFormatDOSText = 4
Private Const wdFormatDOSTextLineBreaks = 5
Private Const wdFormatRTF = 6
Private Const wdFormatEncodedText = 7
Private Const wdFormatUnicodeText = 7
Private Const wdFormatHTML = 8

だそうです。ただしあくまで Word2000 の話で、別なバージョンの
Word ではこの定数でダメだったという話も聞いたことがあります
ので(確かな話ではありません)、すべてのバージョンの Word で
共通かどうかは存じません。

管理人むたぐちさん

お久しぶりです。ここはちゃんと巡回しておりますが、最近内容が
ぐっと難しくなりまして落ちこぼれ状態です。益々ご活躍ですね。

石山 さん (ishiyama@taito.net) 2000年 04月 04日 15時 11分 29秒

to 管理人むたぐちさん
ありがとうございます。
wordのマクロならできるのですが、
ActiveDocument.SaveAs FileName:=myDocname, FileFormat:=wdFormatText
で”:=”の部分がwshだと通らないようです。
【おじさま】を探してみます。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 04日 01時 24分 06秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

○更新(予定?)情報
・IShellDispatch2オブジェクトの解説をアップしました。
まだ未完成っぽいですが、そのうち完成させます。
Folder2オブジェクトなどや、Verbオブジェクトの解説も書きたいと思います。
# ShellExecute メソッドのvDirectoryオプションは、やはり作業フォルダ指定でした。

microsoft.xmlhttpもちゃんと調べておかなくては…。

・WMI/ADSIのページにリンクを張りました。
WMI、ADSIについては、いずれ「WSH技術情報」でさわりだけ述べるつもりですが、
詳細について当ページで言及することはないと思います。(DHTMLもですが)
ので、これらのリンク先にあるリソースを参考になさってください。

○WMIその後
あれから、調子に乗ってスクリプトを書きまくりました。
その中からひとつご紹介します。

'インストールされているサウンドデバイスを列挙するスクリプトです。
Dim str
Set SystemSet = GetObject("winmgmts:").InstancesOf("Win32_SoundDevice")
For Each System In SystemSet
str=str & System.Caption & vbTab & System.Manufacturer & vbCrLf
Next
MsgBox str

# メモリ関係の情報取得ができないのは、なぜだろう?

○VPN報告
チャブーンさんが主催しておられる、VPN(についてはWin2000のヘルプを読めば
ある程度わかります。要は、インターネット経由のLAN構築です)に参加していることは
前にも書きましたが、昨晩、めでたくドメイン参加を果たしました(^^)

今まで私がアホな勘違いをしていたため、接続できなかったのです(^^;
ほんと、チャブーンさんには迷惑をかけてしまった…。

ADSIやWMIを使って、簡単なテストをしてみたんですけど、結果は上々でした。
ADSI…ドメイン以下のコンピュータ名抽出/ユーザー名と所属グループの抽出
WMI…クライアントから、サーバー上でプロセス実行/停止
などができました。

To: 石山和雄 さん

> a:ドライブにあるWORDのすべての.docファイルを自動で.txtファイルに変換するスクリプトを考えていますが、

これって、単純に.docを.txtにリネームするというものではないですよね。
変換には、たぶん、Wordの機能(オートメーションで)を使わないとできないと思います。
私はWordを持っていないので、詳しくはわかりません。
が、この掲示板で以前【おじさま】さんが、Wordを利用したHTML→テキストの
変換スクリプトを書いてくださったことがあったと思います。
それを参考にしてみてはいかがでしょう。

それで、ドライブ以下にある、すべてのフォルダを再帰的に検索する方法は、
まだ(いまだに)未完成の、Lesson14で解説しています。
Lesson13のページの一番下からのみ、こっそりリンクしているので、見ることはできます。
# ほったらかしで申し訳ないです。なんとなく書く気がおきないのです(^^;

To: RiffRaff さん

> 皆さんのお役に立てるか判りませんが、私のお気に入りの COM コンポーネント
> (Freeware)を紹介します。リンクのページに関連サイトが載っていましたが
> 詳しい紹介はされていないようなので...。

すいません。私自身が、あまり外部のCOMコンポーネントを使わないもので…。
なるべく、標準と思われる機能でやりくりするのが好きです。

これらのコンポーネントには、リンクを張っておきます。
情報提供に感謝します。

私が個人的に最強なコンポーネントだと思うのは、dynawrapというやつです。
これは、VBにはあるがVBSにはない、 Declare ステートメントの代わりを
してくれるものです。
つまり、Win32APIが使い放題なんです。(多分…)

> 前者に関しては WSH 2.0 でサポートされた機能もありますが 1.0 のときは
> 結構役に立ちました。後者は当初 WSH でフォームが作成できると歓喜しまし
> たが、唯一の弱点が日本語を使えないということです。フォーム作成には
> wshLtWtForm というコンポーネントもありましたがこちらも日本語には対応
> していません。

私も、この手の機能はとても欲しかったのですが(ここのWSH技術情報というページにも
書いてます)、IE5に付属している、HTA(HTML アプリケーション)が登場したので、
ボタンなどのインターフェースが欲しいときはこちらを使っています。

リストボックス、コンボボックス(テキスト入力可能タイプはないですが)、ボタン、
チェックボックス、オプションボックス、テキスト、テキストボックス、
ラベル、ピクチャーボックスあたりは、標準のHTMLオブジェクトで再現できるので
なかなか良いです。
クリップボードの操作なんかもできます。

# あと、ポップアップさえあれば…。

> 最近 WSH のスクリプト言語に PerlScript を使ってみたいと思っているの
> ですが(Perl は少々扱えるので...)ActivePerl(build 522) ではほとんど
> 全く日本語が使えないようです。

ありゃ、そうなんですか。
PerlScriptには全く手をつけていないので、知りませんでした。

> テキスト処理
> に関しては本当に強力なので是非日本語環境で使えればと思っているのですが...。

そうらしいですね。
ただ、WSH2.0では、*.wsfファイルに記述することで、複数のスクリプティング
エンジンを併用できるので、文字列処理部分だけはPerlScriptにまかせて、
その他の部分はVBSにやらせる、といったことが可能です。
でも、肝心の日本語な文字列の解釈ができないのなら、意味ないですが(^^;

> だらだらと書いてしまいましたが、今後ともよろしくお願いします。

いえいえ、こちらこそ。よろしくお願いします。

To: yama さん

> 過去の記事を調べてみるとローカルでHTMLファイルを開くと、「マイコンピュータ」というセキュリティゾーンが適用されるみたいですが、レジストリをいじってセキュリティゾーンをカスタマイズする方法を教えて下さい。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0
および、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0
キーの、"Flags"というDWORD値を"1"にします。

これで、「インターネットオプション」に、「マイコンピュータ」というセキュリティゾーンが
表示され、ここでローカルのHTMLファイルに対するセキュリティ設定がおこなえます。
WshShellやFileSystemObjectは、「スクリプトを実行しても安全だとマークされていない」
コントロール(まあ、ファイルを自由に操れるのだから安全でないのは間違いない)です。
これらの実行を許可すれば、警告が出なくなります。

しかし、注意点があります。
この設定により、「フォルダのWeb表示」、「ローカルで開いたHTMLファイル」のセキュリティが
事実上皆無になります。
また、IEのコントロールをHTML表示に使っているアプリ(WINAMP,Datulaなど多数)に、このセキュリティ
ゾーンが適用される可能性があります。

セキュリティを下げたことによる、これらの危険性を十分把握しておいてください。

HTMLからActiveXコントロールを呼び出すなら、HTAを採用したほうがいいでしょう。
拡張子を.htmから.htaにするだけで通常はOKです。(IE5必須)

To: Hamige さん

> 「Shell32.dllでエラーが発生しました。
> 欠陥エントリ:SHExitWindowsEx」
> というエラーが返って来て、正常に再起動されません。

この機能は、IE4がシェル統合されていることが必要になります。
また、NT4.0ではシェル統合されていた場合でも実行できるかどうか、私もわかりません。

> Winntで正常に再起動させる方法を教えて頂けないでしょうか。

そうですね…。
ちょっとすぐには思い当たりません。
何か、コマンドラインベースのツールで、そういうのはなかったでしょうか?

Hamige さん (tmsatoh@sys.civinfo.co.jp) 2000年 04月 03日 19時 04分 27秒

みなさんはじめまして。
WSH初心者です。
Winnt4.0+WSHでWindowsの再起動+自動ログオンが可能な
スクリプトを書いております。
そこで質問ですが、以下のスクリプトを実行した場合、
「Shell32.dllでエラーが発生しました。
欠陥エントリ:SHExitWindowsEx」
というエラーが返って来て、正常に再起動されません。
Winntで正常に再起動させる方法を教えて頂けないでしょうか。

スクリプトの内容:
dim WSHShell
Set WSHSHell=CreateObject("WScript.Shell")
WSHShell.Run "C:\WINDOWS\RUNDLL32.EXE Shell32.dll,SHExitWindowsEx 2"


yama さん 2000年 04月 03日 14時 19分 31秒

はじめまして
WSHShell.Runを使ってプログラムを起動させるHTMLを作成しています。
ローカルで実行したいのですが、ActiveX実行の警告メッセージが出力されます。
過去の記事を調べてみるとローカルでHTMLファイルを開くと、「マイコンピュータ」というセキュリティゾーンが適用されるみたいですが、レジストリをいじってセキュリティゾーンをカスタマイズする方法を教えて下さい。

RiffRaff さん 2000年 04月 03日 01時 50分 38秒

皆さんはじめまして。

私はバッチ処理やちょっとしたユーティリティを作るときに WSH を活用して
おります。スクリプト言語は基本的にテキストエディタだけで作れるのでこの
ようなときには本当に楽ですね。COMコンポーネントのオートメーションをサ
ポートしていることから機能の拡張が行えるという点も気に入っております。

過去ログ拝見させて頂きました。管理人さんはお若い方のようですが質問への
丁寧な受け答えなどから知識の深さと熱心さが伝わってきます。とても感動し
ました!!私自身まだ経験が浅いので色々と勉強になります。

皆さんのお役に立てるか判りませんが、私のお気に入りの COM コンポーネント
(Freeware)を紹介します。リンクのページに関連サイトが載っていましたが
詳しい紹介はされていないようなので...。

■ AutoItX ■ - http://www.hiddensoft.com/AutoIt/
クリップボードの操作
ウィンドウの操作
マウスカーソルの操作
INIファイルの操作
キーコードの送出
スリープ
etc.

■ WshForm ■ - http://www.hevanet.com/leok/wshform.html
フォームの表示
(ボタン、チェックボックス、コンボボックス、ラベル
 オプション、ピクチャーボックス、テキスト、テキストボックス)
コモンダイアログボックス

前者に関しては WSH 2.0 でサポートされた機能もありますが 1.0 のときは
結構役に立ちました。後者は当初 WSH でフォームが作成できると歓喜しまし
たが、唯一の弱点が日本語を使えないということです。フォーム作成には
wshLtWtForm というコンポーネントもありましたがこちらも日本語には対応
していません。

最近 WSH のスクリプト言語に PerlScript を使ってみたいと思っているの
ですが(Perl は少々扱えるので...)ActivePerl(build 522) ではほとんど
全く日本語が使えないようです。「はじめての Windows Scripting Host」
という本の中で「WSH で Perl を使う」というページがありまして、1年ほど前
WSH を始めた頃にそのページのサンプルスクリプトを書いた経験があるのですが、
そのときは確かメッセージボックスで日本語が使えた記憶があります(当時は
Perl もよく知らなかったのでこれだけで終わってしまいました)。ただインス
トールしていた Perl は Perl for Win32 だったのでそれが原因かもしれませ
ん。バージョンアップして使えなくなるとは...という感じです。ネット上でも
PerlScript の情報は非常に少ないので現状がよくつかめません。テキスト処理
に関しては本当に強力なので是非日本語環境で使えればと思っているのですが...。

だらだらと書いてしまいましたが、今後ともよろしくお願いします。
色々勉強させてください!!

石山和雄 さん (ishiyama@taito.net) 2000年 04月 03日 00時 12分 42秒

はじめまして。WSHの情報って意外と少なくて、いろいろと探してみたら
ここにたどり着きました。

さっそく質問なんですけど、
a:ドライブにあるWORDのすべての.docファイルを自動で.txtファイルに変換するスクリプトを考えていますが、
なかなかうまくいがず、どなたか御存知であれば伺いたいと思い、いきなりで失礼ですけど
投稿してみました。初歩的な問題だとは思いますが、どなたかよろしくご指導御願いします。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 02日 04時 33分 07秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

結局、WMIのSDKをダウンロードしました。

WMIでできることの多さは凄まじいものがあります。
OS、ハードウェア、ソフトウェア、プロセス、サービス、ネットワーク、ファイルシステムetcに関する、ありとあらゆる情報をスクリプトから参照・操作できます。
まずはヘルプを開いて、圧倒されてください(笑)

Win2000をお持ちの方は、ぜひダウンロードしてみましょう。
http://msdn.microsoft.com/downloads/sdks/wmi/download.asp

Win95/98でも、WMIコアをインストールすれば、SDKもインストールできるようです。
(ダウンロードは同じ場所でできます)
# でもWin98からは実行できないかも。ADSIと同じで、Win2000のネットワークにつながっ# ている必要があるかもしれません。

このSDKには、充実したリファレンスと、多くのサンプルファイル(VBS,JS,VB,C++,HTML等)
が含まれています。(英語ですが、特に問題はないでしょう)

WMIの仕組みやコードの書き方に関しては、
http://www.microsoft.com/japan/developer/thisweek/wmi/koj990730.asp
が参考になります。日本語ですので、楽に読めます。

ネットワークの管理者が、定形作業の自動化を図るのに有効なのはもちろん、
スタンドアロンな環境で使っても、便利に使えることは間違いないでしょう。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 04月 01日 20時 04分 28秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: 市村 さん

> BASP21でもHTTPのコントロールができますが、今回利用したいサイトがHTTPSであり、さらに画面遷移を厳密に管理するためにCookieを利用しているので、ブラウザの機能を利用した方が簡単だろうということで、WSHでIEを制御すればよいのではと思いました。

なるほど。確かにブラウザでダウンロードするという手動作業を、そっくり
模倣した自動化ができれば簡単ですね。

ExecWBメソッドに、何か使えるのはないかな…。
# 今現在表示しているページの保存ダイアログを出す方法はあるのですが

SilentプロパティをTrueにすると、いろいろな警告や情報ダイアログの表示を
抑制できるのですが、ダウンロードのダイアログはどうしても表示されてしまう
ようです。

もしくは、当該リンクのAオブジェクトのClickメソッドを実行し、開いたダイアログに
SendKeysでキーコードを送るとか…。

たまにニュースグループで見かける質問に、「IEの保存ダイアログが出なくなりました。
勝手にtemporaly internet filesフォルダに保存されてしまいます」というのが
あるんですけど、この現象を逆手に利用できないかなあ…。
# どうやって発生するのかいまいちわからないんですが

私の場合、zip,lzhファイルはLhasaに関連付けされていて、リンクからこれらの
ファイルをダウンロードしようとすると、確認ダイアログが出ず、いきなり解凍作業が
始まるようにしています。
(zip,lzhのファイルタイプで、「ダウンロード時に開く確認をする」チェックを
はずしているので、このような動作になるわけです。)

いろいろ書きましたけど、何か参考になれば幸いです。

市村 さん (wh6n-icmr@asahi-net.or.jp) 2000年 03月 31日 19時 28分 37秒

回答ありがとうございます。

> 最近、同様の質問が、microsoft.public.scripting.wshで出され、次のような
> 回答がありました。
> set http = CreateObject("microsoft.xmlhttp")
> http.open "GET","http://www.someserver.com/somesite/somepage.url",false
>http.send
>htmlpage = http.responsetext

IE5ということで、条件がちょっと厳しいですが確認してみる必要がありますね。
調査してみます。

>もしくは、VB6に付属のInetコントロールと、BASP21などの外部コントロールを組み合わせればできるかもしれません。

BASP21でもHTTPのコントロールができますが、今回利用したいサイトがHTTPSであり、さらに画面遷移を厳密に管理するためにCookieを利用しているので、ブラウザの機能を利用した方が簡単だろうということで、WSHでIEを制御すればよいのではと思いました。Inetコントロールについても確認してみます。

HTTPS、Cookieに対応した形でフォームの操作、ファイルダウンロードが自動的にできるようなソフトがあればよいのですが、なかなか見つからないです。
何か良いソフトがあれば、教えてください。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 31日 16時 27分 47秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

Win2000Proを導入しました。
# Dive-Masterさん Thanks!
これで本格的に、ADSI/WMIの研究ができます。

ADSIに関しては、ヘルプを手に入れたので、迷うことはありません。
このヘルプは、C++とVBでの記述例があるので、VBS使いの方には容易に理解できると
思います。
http://www.microsoft.com/ntserver/downloads/bin/nts/adsi25.chm

ところで、チャブーンさんが実行しておられる、VPNに私も参加することになりました。
昨日(今日か)、接続を試みたのですが、ドメイン参加はうまくいきませんでした。

ドメイン参加ができれば、ADSIを使って、いろいろ試してみたいのですが、
うまくいけばここでご報告できると思います。

で、問題はWMIです。
ドキュメントはSDKに含まれているようなのですが、
8MBという大容量です。
ちょっと躊躇してしまいます…。
http://msdn.microsoft.com/downloads/sdks/wmi/download.asp

To: 江指 さん

>  例えば
>     \tmp\folder\aaa.txt
> というファイルを
>     folder\aaa.txt
> というパスで圧縮したいとすると、
>  カレントディレクトリを変更できるならば、\tmpディレクトリに移って、folder\aaa.txtを指定すれば良いのですが、それをフルパスで指定すると、
> \tmp\folder\aaa.txtというパスで記録されてしまいます。

これはlha.exeの使い方次第でうまくいきます。
上の場合だと、
C:\tmp\folder\aaa.txt
にあるファイルなら、

lha a -x C:\test.lzh C:\tmp\ folder\aaa.txt

を実行すれば、folder\aaa.txtで保存されます。

これは、
cd tmp
lha a -x C:\test.lzh folder\aaa.txt
とすることと同義です。

詳しくは、lha.doc(1-D. 基準ディレクトリについて)を参照してください。

pkzipとか、他のアーカイブソフトだとどうかはわかりません。

To: 市村 さん

> 具体的には、IEとDocumentオブジェクトを操作して、いくつものFORMを入力して(ユーザ認証など)、ダウンロードしたい項目がリンクされているページに辿りつくところまではできたのですが、ブラウザで表示できない形式のファイルをダウンロードさせようとするとファイル保存確認のダイアログがでてしまうので、完全な自動化をすることができません。

最近、同様の質問が、microsoft.public.scripting.wshで出され、次のような
回答がありました。

set http = CreateObject("microsoft.xmlhttp")
http.open "GET","http://www.someserver.com/somesite/somepage.url",false
http.send
htmlpage = http.responsetext

microsoft.xmlhttpは、IE5以上で使えるそうです。(まだ未確認です。)
ただ、これは、テキストな文書をダウンロードするもののようですね。

もしくは、VB6に付属のInetコントロールと、BASP21などの外部コントロールを組み合わせればできるかもしれません。
BASP21はこちら:
http://www.hi-ho.ne.jp/babaq/
VB6のランタイムは、どこかで見つけてください。
そういえば、ランタイムだけでInetコントロールが利用できるかどうか、まだ
未確認でした。動くんでしょうか?

Const icByteArray=1
Dim b()
Set Inet=Wscript.CreateObject("InetCtls.Inet")
Inet.RequestTimeOut=20
Inet.URL="http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/vbs.lzh"
b() = Inet.OpenURL(Inet.URL, icByteArray)

これで、b()にバイト配列のデータが入るので、BASP21でファイルに書き込めば
いいと思います。(たぶん、です。上の例は、VBのヘルプを参考に書いたもので、
動作確認していません。また、BASP21にバイナリファイルの書き込みができるかどうかも
未確認です)

もっとも簡単なのは、
リンク先のURLだけをリスト化して、あとは他のソフトにお任せするとか…。

市村 さん (wh6n-icmr@asahi-net.or.jp) 2000年 03月 30日 21時 24分 21秒

WSHのいいページがないかと探していたところに見つけました。
よろしくお願いします。

WSHを利用して、Webからのデータダウンロードを自動化しようとしているのですがうまくいかなくて困っています。
具体的には、IEとDocumentオブジェクトを操作して、いくつものFORMを入力して(ユーザ認証など)、ダウンロードしたい項目がリンクされているページに辿りつくところまではできたのですが、ブラウザで表示できない形式のファイルをダウンロードさせようとするとファイル保存確認のダイアログがでてしまうので、完全な自動化をすることができません。

WSHでこれを自動化することは可能なのでしょうか?

江指 さん (esashi.masahiro@nifty.com) 2000年 03月 30日 21時 03分 56秒

 お付き合いいただきありがとうございます。


>  さて、バッチファイルからの変更で困っていることがあります。DOSでのCDに
> 相当する処理はWSHでどうすればよいのでしょうか? 作業フォルダを変更
> 出来ればよいのでしょうが方法がわかりません。

むたぐちさん
> カレントディレクトリにしたいディレクトリを変数(strPath)に入れ、
> 実際に処理を書くときは、strPath & "ファイル名" のようにフルパスにして
> 処理するのはいかがでしょうか。


>  単純なケースではご指摘の方法で解決しますが、ファイル名がたくさんあると
> わずらわしいのと、相対パスと絶対パスの違いが問題となる(パスの文字列自体
> が処理対象の)場合には適用できないと思います。

むたぐちさん
> 「相対パスと絶対パスの違いが問題となる」というのがちょっとわからないんですが、
> どういう意味でしょうか。
> 具体的なバッチファイルの内容を見せていただければ、こちらとしても把握しや> すいのですが…。

 lha等のファイルのアーカイブコマンドで、ディレクトリ名を有効にして
ファイルを圧縮したい場合を考えます。
 例えば
    \tmp\folder\aaa.txt
というファイルを
    folder\aaa.txt
というパスで圧縮したいとすると、
 カレントディレクトリを変更できるならば、\tmpディレクトリに移って、folder\aaa.txtを指定すれば良いのですが、それをフルパスで指定すると、
\tmp\folder\aaa.txtというパスで記録されてしまいます。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 30日 02時 19分 14秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: 江指 さん

>  単純なケースではご指摘の方法で解決しますが、ファイル名がたくさんあると
> わずらわしいのと、相対パスと絶対パスの違いが問題となる(パスの文字列自体
> が処理対象の)場合には適用できないと思います。

そうですねえ。
なら、Subプロシージャにしてしまうというのは?
煩わしさは若干解消されると思います。

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

strCD="C:\temp\"
CopyCDFile "a.txt","D:\"
CopyCDFile "b.txt","C:\windows\"

strCD="C:\temp\subdir1\"
CopyCDFile "c.txt","C:\"
CopyCDFile "d.txt","C:\"
CopyCDFile "f.txt","C:\"

strCD="C:\temp\subdir2\"
CopyCDFile "*.txt","D:\"
CopyCDFile "*.doc","C:\"

Sub CopyCDFile(sFile,sTarget)
Fs.CopyFile strCD & sFile,sTarget
End Sub

「相対パスと絶対パスの違いが問題となる」というのがちょっとわからないんですが、
どういう意味でしょうか。
具体的なバッチファイルの内容を見せていただければ、こちらとしても把握しやすいの
ですが…。

江指 さん (esashi.masahiro@nifty.com) 2000年 03月 29日 20時 36分 19秒

 早速のフォローありがとうございます。


>  さて、バッチファイルからの変更で困っていることがあります。DOSでのCDに
> 相当する処理はWSHでどうすればよいのでしょうか? 作業フォルダを変更
> 出来ればよいのでしょうが方法がわかりません。

むたぐちさん
> カレントディレクトリにしたいディレクトリを変数(strPath)に入れ、
> 実際に処理を書くときは、strPath & "ファイル名" のようにフルパスにして
> 処理するのはいかがでしょうか。

 単純なケースではご指摘の方法で解決しますが、ファイル名がたくさんあると
わずらわしいのと、相対パスと絶対パスの違いが問題となる(パスの文字列自体
が処理対象の)場合には適用できないと思います。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 29日 16時 54分 51秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: わたなべあつし さん

> さて、どなたかWSHでWordのテキストをコピーする記述方法を知っていらっしゃいませんか?
> VBだとSelectionメソッドを利用して、
> Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend
> Selection.Copy
> などとするようですが、このままをWSHでは記述できません。(エラー)

Selection"メソッド"ではなく、"オブジェクト"だと思いますが…。

Set objWord=WScript.CreateObject("Word.Application")

でWordのオートメーションオブジェクトを作成してから、objWordの何らかの
メソッド/プロパティでSelectionオブジェクトを参照することになると
思います。そのあたりは、マクロのヘルプを見てください。
# 私はWordを持っていないので確認できません。

あと、Unit:=wdCharacter, Count:=3, Extend:=wdExtendという引数は、たぶん文字列で
しょうから、""でくくる必要があると思います。

わたなべあつし さん (atsushi.watanabe@fujixerox.co.jp) 2000年 03月 29日 09時 37分 07秒

はじめまして。わたなべあつしと申します。
皆様のノウハウを教科書に、目下WSHを勉強中です。
さて、どなたかWSHでWordのテキストをコピーする記述方法を知っていらっしゃいませんか?
VBだとSelectionメソッドを利用して、
Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend
Selection.Copy
などとするようですが、このままをWSHでは記述できません。(エラー)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 29日 03時 11分 55秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: 江指 さん

>  さて、バッチファイルからの変更で困っていることがあります。DOSでのCDに
> 相当する処理はWSHでどうすればよいのでしょうか? 作業フォルダを変更
> 出来ればよいのでしょうが方法がわかりません。

スクリプトの作業フォルダを取得するのは、

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

でできるのですが、設定はこの方法ではできませんね。

カレントディレクトリにしたいディレクトリを変数(strPath)に入れ、
実際に処理を書くときは、strPath & "ファイル名" のようにフルパスにして
処理するのはいかがでしょうか。

例)

cd C:\temp
copy a.txt D:\
move b.txt C:\windows\

ならば、

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
Dim strPath
strPath="C:\temp\"
Fs.CopyFile strPath & "a.txt","D:\"
Fs.MoveFile strPath & "b.txt","C:\windows\"


江指 さん (esashi.masahiro@nifty.com) 2000年 03月 29日 00時 13分 54秒

 DOSのバッチファイルをスクリプトに置き換えるべくWSHの情報を探していたら、
ここのページを見つけました。何か解説書でも買おうかと思っていましたが、例が
豊富でわかりやすい解説なのでヘルプと併用すればかなり勉強になりました。
ありがとうございます。

 さて、バッチファイルからの変更で困っていることがあります。DOSでのCDに
相当する処理はWSHでどうすればよいのでしょうか? 作業フォルダを変更
出来ればよいのでしょうが方法がわかりません。
 とりあえず、今はスクリプトのショートカットを作成し、プロパティーの
作業フォルダを指定することで誤魔化しています。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 28日 00時 54分 35秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

To: 大分きもと さん

>  VB2.0も6年以上前ですが、経験は一応有ります。お奨めの入手可能な
> 書物が有りましたら是非お願い致します。

残念ながら、私はVBのプログラマではないし、VBの本を読んだこともないので、
私からはお答えできませんm(_ _)m
VB5.0と6.0はもっているのですが、本来の使い方とは違う使い方がメインに
なっていたりします。

書籍ではないですが、VB4.0にはBooks Online(?)のような、オンラインチュートリアルは
ついていなかったでしょうか。サンプルコードも本体に付属していますし、基本的な
ことに関しては、ヘルプとこれらで十分だと思うのですが…。

Win32APIを使いこなすなら、別に書籍が必要かと思います。
# APIの本は、ものすごく分厚いですね(^^;
私自身、そのステップまで行っていないのですが。

データベースを扱うのなら、さらに高度な知識が要求されるのでしょうね。

ところで、VB6.0からは、FileSystemObjectが使えるようになっていて、ファイル操作が
格段に容易になっています。(ocxを配布する必要がありますが)
# VB4.0でもこのocxを配布できるのかどうかは知りません。

To: mira さん

フォローありがとうございます。

> 今後を考えれば、一刻もはやく32bit環境に移行したほうが得策でしょう。

Win2000も登場しましたしね。

> ところで、Win98やWinNT4.0ではないですよね?
> VB4は動作保証されていませんよ。

VBは、結構、要求する環境にうるさいですよね。
ランタイムのspの違いによって、ちゃんと動作しなかったり…。

大分きもと さん (ooita.kimoto@nifty.ne.jp) 2000年 03月 27日 12時 21分 26秒
URL:http://homepage1.nifty.com/ooitakimoto/

 大分きもとです。miraさんレス有難うございます。

 VBについては4.0の32ビット版です。OSはWin98SEですが、間違い
無く動作しているようなので(親会社に決定権が有るので)どうしようも有り
ません。

 書籍に付いては参考にさせてもらいます。有難うございました。

mira さん 2000年 03月 27日 10時 31分 12秒

mira%二度目まして、です。

> 過去バージョンとの違いや記述方法のサンプルが多い書籍を探しております。

VBマガジンの過去記事とかが参考になるかと。
過去記事の一部は↓に載っています。

http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9711/conv/
http://www.int21.co.jp/pcdn/vb/noriolib/


VB4(16bit) と VB4(32bit) は別物です。
今後を考えれば、一刻もはやく32bit環境に移行したほうが得策でしょう。

ところで、Win98やWinNT4.0ではないですよね?
VB4は動作保証されていませんよ。


>・コーディングサンプル(基本部分)が多い
>・VBのバージョンの違い(歴史)を簡単に説明
>・厚さ2センチ以内で携帯しやすい物
>・値段は問わない

一冊で全部の条件を満たすのは難しいでしょうから、入門的なものを
何冊か購入した上で、

http://www.bcap.co.jp/hanafusa/VBHLP/VBHLP.htm
http://hp.vector.co.jp/authors/VA010786/
http://www2j.biglobe.ne.jp/~little-g/vbtomo.html

あたりを足がかりにしてWeb上のサンプルを探してみるというのは
いかがでしょうか?

大分きもと さん (ooita.kimoto@nifty.ne.jp) 2000年 03月 27日 02時 09分 37秒
URL:http://homepage1.nifty.com/ooitakimoto/

 はじめまして、大分きもとと申します。このHPは参考に成る事が多いので
LINKさせてもらっております。

 早速質問なのですが、私はVB2.0でVBを覚え、そこからEXCELの
VBAに移り、今度VB4.0の開発を担当します。ちまたでは6.0ですが
過去バージョンとの違いや記述方法のサンプルが多い書籍を探しております。

 VB2.0も6年以上前ですが、経験は一応有ります。お奨めの入手可能な
書物が有りましたら是非お願い致します。

・コーディングサンプル(基本部分)が多い
・VBのバージョンの違い(歴史)を簡単に説明
・厚さ2センチ以内で携帯しやすい物
・値段は問わない

 勝手ながら以上の条件でできればお願い致します。(上から優先順位です)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 03月 23日 06時 35分 12秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/

フォルダカスタマイズに重要な、desktop.iniを認識させる方法がわかりました。
desktop.iniを作成するフォルダに、あらかじめ「読み取り専用」属性をつけておけば
いいようです。(それでもうまくいかないことがあるのですが)
カスタマイズ済みのフォルダの設定を他のフォルダにも適用するスクリプトを
作ったので、公開します。

ところで、Unicodeに対応しているエディタってあります?
uni2sjisなんてスクリプトを作ったりして(^^;

Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
For Each sFile In Wscript.Arguments
If Fs.FileExists(sFile) Then
Fs.CopyFile sFile,Fs.BuildPath(Fs.GetParentFolderName(sFile), Fs.GetBaseName(sFile) & ".bak")
Set ints=Fs.OpenTextFile(sFile,1,False,-1)
str=ints.ReadAll
ints.Close
Set outts=Fs.CreateTextFile((sFile),True,False)
outts.Write str
outts.Close
End If
Next


To: HIMITU さん

> objWshShell.Run strCmd, 1, True
> の、strCmdに486Byteまではコマンド起動できるのですが、487文字超になると
> 以下のエラーが発生します。
> ”VBScript実行エラー 書き込みできません。”

これはWSHの制限ではなく、Windowsの制限と思われます。
「ファイル名を指定して実行」でも、ある一定のコマンド長制限があります。

というか、通常はそんな長いコマンドを実行させることはないと思うんですが…。

Return