じゃけん さん 2003年 06月 26日 13時 40分 43秒

>彩香さんへ
いや、元々そんなに気にしてはいませんけどね(笑)
とりあえず、数箇所のサイトでしか使ってないハンドル名だったので^^;;;
「あさ」自体は、ここが一番メインで使ってたので、そろそろ何とかしたいと思ってたとこだったのです^^;;
まぁ、いいタイミングなので、以後お見知りおきを(笑)

>syuさんへ
ちょっとやってみました。(私は「あさ」です。爆)

syuさん、ひょっとして、スクリプトの入っているファイル名「***.html」とかにしてません?

私の環境では、「***.html」で実行した場合、location.pathnameの頭に「/」がつくようです。
拡張子を「hta」にすれば、つきません。
後、セキュリティの関係で、「html」のファイルのスクリプトは制限が多いし、かつローカルにアクセスしようとすると警告画面がでたりするので、「hta」にしたほうがいいと思います。

サンプル作ったので公開します。
syuさん、参考にして下さい。

----------test.hta----------
<HTML>
<HEAD>
<SCRIPT type="text/vbscript" LANGUAGE="VBScript">
Sub Note_OnClick
strTragetFileName = "コンピュータ名.xls"

strScriptPath = location.pathname 'スクリプト自身のフルパスファイル名取得
strScriptPath = Replace(sScriptPath,"/","") '頭のスラッシュ回避
strScriptPath = Replace(sScriptPath,"%20"," ") 'スペースの置換

'スクリプトの場所と同一フォルダにあるファイルのフルパス名作成
strFilePath = Left(strScriptPath,InStrRev(strScriptPath,"\")) & strTragetFileName

'ファイルのオープン
Set objWshShell = CreateObject("WScript.Shell")
objWshShell.Run Chr(34) & strFilePath & Chr(34)
End Sub
</SCRIPT>
</HEAD>
<BODY bgcolor="#d1d1d1">
<input type="button" value="管理図" id="Note"><br>
</BODY>
</HTML>
------------------------------
#ファイル名をtest.htmlにしても動きます。(警告画面でます)

後、location.pathnameは、WScript.ScriptFullNameと違い、スペースが%20で帰ってくるので、置換してます。
例)
「C:\Documents and Settings」

「C:\Documents%20and%20Settings」
ほかにもこのような返事を返す文字があるかも知れません。
「%20」が入ったままRunメソッド実行するとエラーになりました。

もっと早くここまで教えてくれよぉ!
とか、syuさんは思うかも知れませんが、多分、ここ見てる人は既に解決したと思っているので、とりあえず、解答を出しておきます。

でも、本当は、ここまでいくつも皆さんヒントだしてますので、自分で解決できるように頑張ってほしいんです(^^;;
とりあえず、これで頑張って下さい。

いりや さん 2003年 06月 26日 13時 04分 48秒

彩香さん、

> Word、Excelはこのように取得されていますが、
> これでは印刷には至りませんでした、プログラムだけが起動され、
> これを閉じるまで制御が待ちになっているようでした。

こちら、DDE を使用して印刷を指示するようになっているために、その部分
もシミュレートする必要があるようです。(.txt ファイルは DDE を使用し
ていないためにうまくいく)

なんとか ShellExecuteA() Win32 API まで橋渡しをする機能があって、
それが WSH から利用できれば御の字なんですけどね。そうすると DDE の
シミュレートは Windows Shell に頼めますし。

むたぐちさんの頁に紹介されていた IShellDispatch2 オブジェクトを
WinXP 上で試しておりますが、ShellExecute() メソッドがうまく機能し
ないようです。うむむ。

彩香 さん 2003年 06月 26日 11時 20分 06秒

To:いりや さん

なるほど、APIを使えるものがあるんですね、
WSHからはAPIを使えないので諦めていました(^^

To:管理人むたぐち さん

ちなみに、sPrintCommandをダンプしてみました。

"C:\Program Files\Microsoft Office\Office10\WINWORD.EXE" /x /n /dde
"C:\Program Files\Microsoft Office\Office10\EXCEL.EXE" /e

Word、Excelはこのように取得されていますが、
これでは印刷には至りませんでした、プログラムだけが起動され、
これを閉じるまで制御が待ちになっているようでした。
テキストファイルの印刷はこれで動作確認が取れました。

それなので、やはり無難にオートメーションでやってしまいました。

To:じゃけん さん

お気になさらないで下さい、もちろんHNのほうもです(^^
印刷のほうはそれで十分に納得できましたよ、
ありがとうございます。



syu さん 2003年 06月 26日 10時 47分 00秒

6/21日むたぐちさん
>To: syu さん
>結局何が問題なのか分からなくなってきましたが、まず最初の"/"を取り除いて、
>次に"\"を"/"にReplace関数で置換すればとりあえずOKということでしょうか?

結局原因はわからず当初のままCDのドライブをEドライブに固定したまま配布しました。
最終的にやりたいことはCDに焼いたhtmlファイル内で
Set Shell = CreateObject("WScript.Shell")
Shell.Run "CDドライブ名:/foldername/hogehoge.xls"
のCDドライブ名を動的に変えて使用したいってことです。各人のCDドライブ名がEドライブやらFドライブやらなもんで

あさ・・改め「じゃけん」 さん 2003年 06月 26日 09時 57分 13秒

ぬは・・・できちゃうのぉ〜(><
ミスアドバイスでした(汗)
彩香さんごめんなさいぃ(汗汗
#これは、アプリケーションインストールされているのが前提になりますね。
#それに、完全に全てのファイルを印刷することは、出来ないと思います。^^;;;
#そう思えば間違っているともいえない???ダメ?(汗)

しっかし、WMI使うと、ホントに幅が広がるんですね・・・
マジでそろそろWMI勉強しないといけないかなぁ・・・
あぁ、憂鬱(笑)


>らしさんへ
Lesson読んで、理解できないところがあれば、ここで聞いてください。
分かりやすく答えるよう努力しますよ!
頑張りましょう!^^


>彩香さんへ
ITAC?なんじゃらほい・・・ということで検索したら・・ありますね(汗)
http://www.itac.gr.jp/1k/bbs/#0625112816
これのことですね。合格おめでとう(笑)
・・・残念ながら別人です^^;;;;
あぁ、ハンドルネーム変えないといけないなぁ・・・
ということで、次回から「じゃけん」と名乗りますのでよろしく(爆)
(というか、いつもこっち使ってる)
・・・って、紛らわしくなるようなら言ってください(汗)


>アンドレ・リュウさんへ
そうですかぁ・・・お役に立てなくて残念です。(><
もし、解決したら、またここで教えて下さい^^;;;


>さとまるさんへ
期末テスト頑張れ〜(笑)
いいなぁ学生はぁ・・・(遠い目


>いりやさんへ
UWSCすごいですね・・・そこまでできるとは・・・
操作記録ソフトの中では、最高峰だと思って、昔から「しなっと」使っていたのですが、そこまでできるとは思っていませんでした(汗)
いりやさんの使い方は、すでに操作記録ソフトじゃないですもん(爆)

ぁぁ・・まだ「つちやモジュール群」使ってません(汗)


>むたぐちさんへ
あぁ〜〜!言われて見れば、UDPですね(笑)
ダメじゃぁん(><
と。いうことで、むたぐちさんお願い・・・(爆)
#でも実行側のPCにActivePerl入れていないとダメな罠(泣)

WMIのリモート実行と、リモートWSHって違うんですね・・・
言われて納得(汗)
また一つ勉強になりました^^;;;

Perl・・・やっぱり理解しておいたほうがいいかなぁ・・・
実は会社のホームページ作るのにPHPとPerl/CGI両方使ってるんですよね。
Perlは元は業者が作ったやつなんですけど、自分で修正して動かしているんです。でも、セキュリティホール作ってそうで怖くてPHP置き換え検討してたりします(笑)
その為、ActivePerlも実はインストール済みだったりします(笑)
でも、ほとんど使ってない^^;;;


さとまる さん 2003年 06月 26日 03時 28分 15秒

むだぐち さん
ありがとうございました。
「&H80000002」あたりは未だに何となくですが(^^;
目的のプログラムはおかげで何とか完成致しました!
ご返答してくれた他の方々にも感謝しています!

あぁ〜。来週は期末テストだ〜(#д#)

アンドレ・リュウ さん 2003年 06月 25日 23時 26分 11秒

To) 管理人むたぐち さん
To) あさ さん

一般ユーザーがリモートサーバ上にプロセスを作成できるようにする件で
いろいろと情報を提供いただきありがとうございました。英語のニューズ
グループには私と同じ内容のことを質問している方がいました。残念なが
ら回答がなかったり、dcomcnfgでアクセス権を追加してはどうかというよ
う大雑把な内容がほとんどでした。一般ユーザーでもリモートサーバ側の
Administratorsローカルグループに入れてやればしっかりと動作します。
が、運用管理上ちょっと。MSDNも斜め読みしたのですが、結局dcomcnfg
をどういじればよいのかさっぱりわからず、まる二日つぶれました(笑。
ということで、現時点では管理者権限がないと実行できないという結論に
なりそうです。もうこれで逃げます。
管理人むたぐち さん、あさ さん ありがとうございました。

管理人むたぐち さん 2003年 06月 25日 21時 59分 24秒

To: あさ さん

> もちろんTCPSocketクラスには、MagicPacketメソッドありますよね?(笑)

よく考えると、"TCP"Socketだけに、UDPなMagicPacketは送信できない気がしてきました。
やっぱPerlScriptでSocketクラス作りますかね?(w

(DMSのTCPSocketクラスの使用例、SSTPだー)

> リモート WSH

WMIのリモート実行と、リモートWSHは別物になります。
リモートWSHは、リモートPC上でスクリプトを実行する仕組みですね。
WMIのリモート実行とは、リモートPC上の情報を取得したり、プロセスを作成する等の
メソッドを実行するということです。

> むたぐちさんはPerl使いですか?(^^;;

おかげさまで、ぱっとソースを出されて、それが何をしてるものか、くらいは
分かるようになってきました。
そんなレベルでコンポーネントを作ろうとしてるから無謀です。

Perlの文法は、ここで勉強させてもらってます。
とほほのperl入門 http://tohoho.wakusei.ne.jp/wwwperl.htm

ところでActivePerlをインストールすると、拡張子plsのPerlScriptを実行するエンジンが
インストールされるんですが、これ、WinAMPのプレイリストファイルの拡張子と
見事バッティングしてるんですよね(w

WinAMPを後からインストールすると、レジストリの
HKEY_CLASSES_ROOT\.pls\が上書きされてかなり悲しいことになります。
関連付けでPerlScriptが実行できないばかりか、cscript hoge.plsなんてやっても
「スクリプトエンジンがねーぞ」と怒られる始末。

それでもWinAMPは良心的な方で、plsの関連付けを外すことができますし、
Winamp_Backに元のファイルタイプ(PerlScriptFile)を保存してくれてるので復旧も楽です。

ごく稀に、.extキーではなく、関連付けられたファイルタイプキーの内容を直に
上書きしちゃうマナーの悪いアプリがあっていかんですな。

> 「いろいろな呼ばれ方」

なれてますからー。


To: さとまる さん

というわけで(?)、あささんが引用された部分を参考にしてみてください。
まずRegReadで配列として得られた値をばらして、Long値に変換して、
RegWriteするって感じでしょうか。
Long値を超える数字になってしまうと駄目なのは引用の通りですので、
他の方法を使わないといけません。
そこにはregedit.exeを併用してどうたらと書いてありますが、それは
あれを書いたのがWMIが出てくる前の話だったからであって、今ならWMIを
お勧めします。

下の例は、バイナリ値を書き込んで、それをそのまま読み出すという
サンプルです。書き込みも読み込みも配列のままできますので楽です。

Const HKEY_LOCAL_MACHINE = &H80000002
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
".\root\default:StdRegProv")

sKeyPath = "SOFTWARE\WshRegBinTest" 'キー
sValueName = "BinaryValue" '値の名前
aValue=Array(CByte(&H01),CByte(&H0A),CByte(&H1E),CByte(&H45),CByte(&H64)) '値

oReg.CreateKey HKEY_LOCAL_MACHINE,sKeyPath 'キーの作成
oReg.SetBinaryValue HKEY_LOCAL_MACHINE,sKeyPath,sValueName,aValue 'バイナリ値の作成

MsgBox "バイナリ値HKEY_LOCAL_MACHINE\SOFTWARE\WshRegBinTest\BinaryValueを作成しました。"

oReg.GetBinaryValue HKEY_LOCAL_MACHINE,sKeyPath,sValueName,aGetValue 'バイナリ値の読み込み

For Each iValue In aGetValue
s = s & Right("0" & Hex(iValue),2)
Next

MsgBox s 'バイナリ値を表示


To: つちや さん

> DMC.DLL

なるほど、"DMonkeyComponent"だったのが、"DoMaCro"になったってわけですね。

書庫を簡単に扱えるコモンアーカイバのラッパークラスみたいなのがあれば
便利でしょうね。
各DLLで共通した働きをするメソッドは、統一的に呼べるようにして、
ユーザーは各DLLの細かい仕様を知らなくても楽に使えるようにするわけです。

Set Compress = CreateObject("DMC.Compress")
Compress.Silent = True '進捗ダイアログを出さない
Set archive = Compress.CreateArchive("C:\nantoka\hoge.zip") '書庫オブジェクト作成。対応dllが見つからないならエラー
archive.Password="hirakegoma" 'パスワード指定
archive.ExtractALL "C:\" '書庫をすべてC:\に解凍
archive.ExtractFile "aaaa\aaaaa.txt","C:\hoge" 'aaaa\aaaaa.txtというファイルをC:\hogeに解凍
archive.AddFile "C:\bbbb.txt","aaaa\bbbb.txt" '書庫にC:\bbbb.txtというファイルを追加

Set files = archive.Files '書庫内のファイルがすべて格納されたコレクションを返す
For Each file In files
If file.Name="a.txt" Then
file.Extract "C:\","aa.txt" 'C:\にaa.txtという名前で解凍
End If
Next
MsgBox files("aaaa\bbbb.txt").RealSize 'aaaa\bbbb.txtの圧縮前のサイズを表示
Set files = Nothing
Set archive = Nothing

こんなことができればWSHユーザーには感涙ものですよ(w


To: 彩香 さん

> WSHを使ってフォルダの中にあるファイル(拡張子を選ばず)
> を一切合切通常使うプリンタで印刷を行うことってできますか。

HKEY_CLASSES_ROOT\.extキーの(標準)の値は、拡張子extのファイルタイプになります。
HKEY_CLASSES_ROOT\filetype\shell\print\commandキーの(標準)の値が印刷コマンドに
なるので、これをWshShell.Runで実行してやればいいわけです。
この際、引数となるファイル名は%1となっているので、Runするときは%1をファイル名に
置換してやります。

で、実際作ってみました。デバッグは適当なのでそこんところよろしくです。
ファイルかフォルダをD&Dすると、そのファイルで印刷コマンドがある奴は
片っ端から印刷します。

原理的にはいりやさんのUWSCを使った方法とほぼ同じになります。
(shell.applicationを使って、FolderItemオブジェクトを取得し、
InvokeVerb "print"とやるとWSHでも可能ですが、ここでは省略します)

ワードとか、印刷コマンドが何だかよく分からないファイルタイプは、
このスクリプトでは無理なので、そこは工夫して何とかしてください。
あささんのおっしゃるように、オートメーションを利用するとかですね。

Set WshShell=WScript.CreateObject("WScript.Shell")
Set Fs=WScript.CreateObject("Scripting.FileSystemObject")

For Each sArg In WScript.Arguments
If Fs.FolderExists(sArg) Then
For Each oFile In Fs.GetFolder(sArg).Files
ret=PrintFile(oFile.Path)
Next
ElseIf Fs.FileExists(sArg) Then
ret=PrintFile(sArg)
End If
Next
MsgBox "終了"

Function PrintFile(filename)
'filenameのファイルを印刷する。実行できたらTrueを返す
sExt=LCase(Fs.GetExtensionName(filename)) '拡張子
sExtKey="HKCR\." & sExt & "\"
On Error Resume Next
sFileType=WshShell.RegRead(sExtKey) '拡張子のキーの(標準)はファイルタイプ
If sFileType="" Then 'ファイルタイプが得られない場合は終了
PrintFile=False
Exit Function
End If
sPrintCommandKey="HKCR\" & sFileType & "\shell\print\command\" '印刷コマンドのキー
sPrintCommand=WshShell.RegRead(sPrintCommandKey) '印刷コマンドラインを取得
If sPrintCommand="" Then '印刷コマンドが得られない場合は終了
PrintFile=False
Exit Function
End If
WshShell.Run Replace(sPrintCommand,"%1",filename),1,True '印刷実行
On Error Goto 0
End Function

管理人むたぐち さん 2003年 06月 25日 19時 51分 02秒

●WSCで引数付きのイベントを公開する

ご存知の通り、WSC(Windows Script Component)とは、XML+スクリプト言語によって記述可能な
COMコンポーネントのことです。
今回は、これを使ってイベントを公開する際、引数を指定する方法について解説します。

なお、WSCでイベントを公開する基本的な方法は、WSHヘルプの
 Windows スクリプト コンポーネント
  スクリプト コンポーネント チュートリアル
   スクリプト コンポーネントの作成
    イベントの公開
を参考にしてください。

WSCのヘルプの<event>要素の項目には、引数に関する構文は記述されていませんが、
実は、<method>要素と同様に、<event>要素内に<parameter>要素を定義してやることで、
イベントの引数を指定してやることができるのです。

具体的には、
<public>
...
<event name="myevent">
<parameter name="arg1"/>
<parameter name="arg2"/>
</event>
...
</public>
てな具合で、引数をいくらでも定義できます。

イベントの発行は、引数なしのイベントと同様、fireEventメソッドを用いますが、
このメソッドの第二引数以降に、<parameter>で定義した分だけ引数を追加します。

具体的には、
fireEvent "myevent",argval1,argval2
のようにします。

クライアントからの呼び出しは
Sub myevent(arg1,arg2)
...
End Sub
のようになるわけです。
※実例は最後に掲載します。

これ、またもや、undocumentedなテクニックですね。
実は、PerlScriptを使ってWinsockコントロールみたいなコンポーネントを作ろうかなあ
と思ってヘルプ読んだら、イベントの引数指定できないから本物みたいなのはできないなあ
と思って諦めかけたところ、
http://groups.google.com/groups?q=fireEvent+wsc&hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&selm=uH0KXIIp%23GA.52%40cppssbbsa03&rnum=1
の投稿をみつけた次第です。


●【おまけ1】WSCのその他のテクニック集

・デフォルト(既定)プロパティ/メソッド
<property name="sname" dispid="0"/>あるいは<method name="factorial" dispid="0"/>
と記述します。

・読み取り専用プロパティ
<property>内に<put>を指定しなけりゃいいだけです。

・パラメータつきプロパティ
obj.Item(key)のようなプロパティを実現する方法です。
<property>内の<get>および<put>内に<parameter>を入れることで可能になります。
http://groups.google.com/groups?q=wsc+default+property&hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&selm=uhjt9qmsAHA.444%40tkmsftngp03&rnum=1
詳細は↑参照のこと。デフォルトプロパティに関してのみ適用できるそうです。


●【おまけ2】WSCで不可能なこと

・デストラクタ
コンストラクタも厳密にはないが、WSCはVBSのClassステートメント/モジュールと違って
関数外の部分(<script>直下)にもコードを書けるので、そこで変数の初期化などが可能。
デストラクタもどきもClassステートメントを併用して、無理やり実装する方法がある?らしい
http://groups.google.com/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&threadm=pIdt5.124954%24eS6.1268497%40news1.rdc1.md.home.com&rnum=5&prev=/groups%3Fhl%3Dja%26inlang%3Dja%26lr%3D%26ie%3DShift_JIS%26c2coff%3D1%26q%3Dwsc%2Bdestructor%26btnG%3DGoogle%2B%258C%259F%258D%25F5
ここを参照。上手くいかないとのことだが。

・定数
タイプライブラリを作成するのに、定数の定義ができないのが不便ですねえ。

・引数の省略指定
いわゆるoptionalな引数を定義すること。これ、できないんでしょうか?
http://groups.google.com/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&threadm=OaJ4EYAUAHA.261%40cppssbbsa05&rnum=5&prev=/groups%3Fq%3Doptional%2Bwsc%26num%3D50%26hl%3Dja%26lr%3D%26ie%3DUTF-8%26inlang%3Dja%26c2coff%3D1%26sa%3DN%26tab%3Dwg
WSCというよりVBSの制限みたいですね。JScriptなら可能らしい?


●【おまけ3】イベント通知の実例

ここでは、とあるオブジェクト(ProgID=test.event)のRunModeプロパティを変更すると、
OnChangeModeイベントが発生し、その引数によりRunModeの古い値と新しい値を取得
できるようにします。
なお、RunModeプロパティは"mode1","mode2","mode3"の3種類のみ存在し、
他の値を代入しようとするとエラーを出します。
また、インスタンス作成時は"mode1"になるように初期化しておきます。

<?xml version="1.0" encoding="Shift_JIS" ?>
<component id="test.event">
<?componet error="true" debug="true" ?>
<registration progid="test.event" />
<public>
<event name="OnChangeMode">
<parameter name="strOldMode" />
<parameter name="strNewMode" />
</event>
<property name="RunMode" internalName="mode">
<get internalName="readMode"/>
<put internalName="writeMode"/>
</property>
</public>
<script language="VBScript">
<![CDATA[
Dim mode
mode="mode1" '変数の初期化

Function readMode()
'RunModeプロパティの取得
readMode=mode
End Function

Function writeMode(newVal)
'RunModeプロパティの設定
Select Case LCase(newVal)
Case "mode1","mode2","mode3" '実在するRunModeが指定された場合
If LCase(newVal)<>mode Then 'RunModeが変更された場合
fireEvent "OnChangeMode",mode,LCase(newVal)
'OnChangeModeイベント送信。引数はRunModeの古い値、新しい値
mode=LCase(newVal) '新しい値を代入
End If
Case Else '実在しないRunModeを代入しようとした時
Err.Raise 100,"wshbbs","無効な代入です。" 'エラーを発生させる
End Select
End Function
]]>
</script>
</component>

次に、クライアント側のコードです。

Set test = WScript.CreateObject("test.event","test_")
'CreateObjectメソッドの第二引数によりイベントをバインド

MsgBox test.RunMode '現在のRunModeを表示
test.RunMode="mode2" 'RunModeプロパティの値を変更

'WScript.Sleep 1000 'たぶん上の行が実行されるとすぐにイベントが発生するので必要ないと思う

Sub test_OnChangeMode(strOldMode,strNewMode)
'OnChangeModeイベント。RunModeプロパティの値が変わると呼ばれる
MsgBox "実行モードが" & strOldMode & "から、" & strNewMode & "に変わりました。"
WScript.Quit
End Sub

いりや さん 2003年 06月 25日 19時 31分 04秒

filePath = "c:\output.txt";
workDirectory = "c:\";

invokePrintCommandToShell(filePath, workDirectory);

function invokePrintCommandToShell(filePath, wdir)
    def_dll ShellExecuteA(hwnd, string, string, string, string, long) :long :shell32.dll
    hwnd = 0;
    lpFile = filePath;
    lpOperation = "Print";
    lpDirectory = wdir;
    lpParameters = "";
    nShowCmd = 1; // SW_SHOWNORMAL
    ret = ShellExecuteA(hwnd, lpOperation, lpFile, lpParameters, lpDirectory , nShowCmd);
    ifb ret > 32 then
        result = true;
    else
        result = false;
    endif
fend

いりや さん 2003年 06月 25日 19時 29分 18秒

彩香さん、

はじめまして。いりやと申します。

Win32 API の ShellExecuteA() を利用する方法が WSH からあれば目的は
達成できると思います。
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpuipf/_win32_shellexecute.htm

WSH ではないのですが、うみうみ屋さんの UWSC というアプリケーション
では Win32 API をサポートしますので、エクスプローラでファイルを選
んでコンテクストメニューから印刷を選ぶのとほぼ同じ効果を次のような
UWSC スクリプトで実現可能です。
http://www002.upp.so-net.ne.jp/umiumi/

もちろんすでにお書きになった Component Object Model を使った印刷の
方法でも達成できると思います。

ご参考まで &lt;&nbsp;&gt;

彩香 さん 2003年 06月 25日 18時 52分 56秒

>あささんへ

そうですかぁ、やはりアプリケーションを特定しないと
無理でしたか(^^;

OfficeのWordやExcelがメインなので、
これならば拡張子を見て、
Set myWord = CreateObject("Word.Application")
のような振り分けをして、不可視で起動してアプリの
Printメソッドを呼び出せば使えそうですね?

WSHでは一括印刷が無理と分ったので大きな収穫でした、
これでまた別のアプローチをしてみます。

厳密にはアプリケーションがOSの印刷を行うAPIを呼び出しているの
かなとも思えなくもないですけどね(^^

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

P.S.

ITACの掲示板に今日書き込みされていません?
覚えていたお名前が偶然にも同じでしたので、
もし人違いだったらごめんなさいm(__)m

実は私もその一人でした。

らし さん 2003年 06月 25日 17時 57分 24秒

Lesson1〜Lesson14
よんでみます・・・とりあえず・・・・
それからっす・・・・ありがとーーーです。

あさ さん 2003年 06月 25日 17時 17分 21秒

>らしさんへ
そういう用途はWSHの見せ所ですね。^^
「VBSで、できます。」おいおぃ^^;;
だけではかわいそうなので・・・・とりあえず、FileSystemObject関連を調べて見ましょう。
やり方は、一つのフォルダ内にある、ファイルを全て列挙しながら、ファイル名から頭2文字取り出し、その2文字のフォルダが存在しなければフォルダ作成し、対象のファイルを移動する。
という流れのプログラムになるでしょう。

このサイトのLesson1〜Lesson14あたりまで、とりあえず読破して下さい。
フォルダの中のフォルダの中の・・ファイルまで、参照したいのであれば、「再帰呼び出し」という手法でプログラムしなければなりません。
これは、ちょっと初心者の方は理解しにくいかも知れません。

ここの過去ログにも似たような処理をしているものがあると思いますので、探して見てくださいね。
それでは、頑張って下さいね。^^


>彩香さんへ
印刷ですかぁ・・・それは、ちょっと難しい・・・いや無理?(汗)
印刷するファイルの種類が特定されるなら、まだ可能だと思いますが、
なんでもかんでも印刷したいとなると、無理だと思います。

基本的にファイルは、「そのファイルを扱うアプリケーション」が印刷するものです。
つまり、ExcelのファイルはExcelが印刷しますし、WordのファイルはWordが印刷します。
そのファイルが開けないと印刷できないわけです。

※例外として、何のファイルでも読み込めるソフトとかがありますので、そっちでファイルを開き印刷する・・・という考え方もありますね(汗)
#自在眼とか・・・

簡単な例は、テキストファイルがそれにあたりますね。
メモ帳でも秀丸エディタでもTeraPad、VxEditor、K2Editor、TepaEditor、JmEditorでも(爆)開くことができて、印刷できると思います。
これは、ファイルの中にどのようにデータが保存されているのか、公開されている(もしくは独自で調査)為、そのデータ形式にアプリケーションが対応しているからできることなのです。

で。話を戻して・・・

「特定のアプリケーションのデータのみ印刷する。」という話であれば、ある程度可能だと思います。
Microsoft Office製品であれば、アプリケーション自身を操作するために、コンポーネントが公開されているので、そちらで動かすことができると思います。
#が、普通は公開されていない場合が多いです。

ただ、やったとしても、プログラミングの技術や知識がないと、難しいと思います。


>つちやさんへ
解説ありがとうございます(嬉)
その説明文章TOPページにそのまま載せちゃいましょう(笑)

しかし、説明見てると、沢山あるエディタより「本田さんのコンポーネント」の方が気になるのは私だけでしょうか(^^;;;;

「むたぐちさんの詳細な紹介」も探しましたよ。むたぐちさん作のスクリプト使ってデータ取り込んで(汗)
で、検索したら、結構最近で、自分も読んでるし(汗)
いかにさら〜と読み飛ばしていたか分かりますね(汗)

FileMaker・・・まったく知らなかったのに・・・そんなに使われているんですか!(汗)
データベースといえば「Oracle、SQL Server、Access、DB2」とかが有名ですよね。
マイナーなところで「Pervasive(Btrieve)」とか(^^;;;
勉強になります(汗)

と、いうことで、つちやさんのページをもうちょっと読んで、一回使って見たいと思います^^;;;

彩香 さん 2003年 06月 25日 16時 46分 37秒

はじめまして、彩香と申します。

WSHを使ってフォルダの中にあるファイル(拡張子を選ばず)
を一切合切通常使うプリンタで印刷を行うことってできますか。

フォルダの中のファイルまでは取得することができたのですが
印刷のところが分りません。

宜しくお願いします。


つちや さん 2003年 06月 25日 14時 29分 05秒

Dear あささん

どうもです。
初めて訪れてくれた方にもわかりやすいように、という意図が感じられないところですみませんです。
万人向けじゃないのは、よおくわかってますが、だいたいいつも後回しにしているもので。

で、簡単な解説をば。
TeraPad、VxEditor、K2Editor、TepaEditor、JmEditor…どれもDelphiで製作されてまして、
エディタ部分に本田さんという方が製作されたコンポーネントを使用しているというテキストエディタです。
このエディタ部分にメッセージを送ることによって、ちょっとした編集作業などができるので、
外部からテキストを操作したいときに重宝します。
私は、用途と気分によってこの5つのエディタとWZ Editorを併用しています。

DoMacroはTeraPad操作用に作成したActiveX DLLで、これを介することにより、
TeraPadをオートメーション操作のごとく操作することを可能にしています。
WSHで用いることによって、WSHをTeraPadのマクロとして使うことができます。
同じようなものとして、K2Editor用のK2ECOMというのもあります。

DMonkeyはむたぐちさんの詳細な紹介が過去ログにありますのでご参照を。
Delphi製アプリにマクロ環境を導入することを目的に作成された環境で、
JavaScript互換の言語が使用されます。
マクロとして組み込むだけでなく、単独でDMonkeyを実行するための環境も公開されています。
とにかく多機能で、ソースがすべて公開されています。

FileMakerはFileMaker社の出しているデータベースソフトで、
もとMACソフトですがWindows版もあり、MAC界では最大、Win界ではAccessに次ぐシェアを誇ります。
特徴は、とにかくユーザーフレンドリーなインターフェースで、
初心者がもっともとっつきやすいデータベースソフトかもしれません。
使いやすいのですが、機能的には不満な部分もあるので、
WSHとかDMonkeyを使って機能追加したりしています。

なんだか、今はMySQLをWSHから操作していることの方がおおいですが。。

らし さん 2003年 06月 25日 13時 33分 39秒

あるフォルダの中に、2000コほどのファイルがあります。

そのファイルを整理整頓したいと考えていますができますでしょーか??

ファイル名の最初の2文字のフォルダを作成し、
そのフォルダの中に、ファイルを移動させたい・・・というものですが・・・

vbsでできるのであれば、教えてください。
VBSはまったくの初心者です。

どなたかhelpおねがいします。

らし さん 2003年 06月 25日 13時 32分 00秒

あるフォルダの中に、2000コほどのファイルがあります。

そのファイルを整理整頓したいと考えていますができますでしょーか??

ファイル名の最初の2文字のフォルダを作成し、
そのフォルダの中に、ふぁ降りを移動させたい・・・というものですが・・・

vbsでできるのであれば、教えてください。
VBSはまったくの初心者です。

どなたかhelpおねがいします。

あさ さん 2003年 06月 25日 13時 23分 41秒

>つちやさんへ
え〜と・・・ごめんなさい(汗)
DMonkeyもFileMakerProもDoMacroもTeraPadもVxEditorも・・・・知らないです(汗)

つちやさんのホームページらしきところも一通り目を通しましたが、正直よくわからんです(汗)
見たところは以下のところです。
https://sourceforge.jp/projects/dmonkey/
http://www2.jan.ne.jp/~kajika
http://csx.jp/~tsuchiya

私の認識は以下であってますでしょうか(汗)
DMonkeyは、独自スクリプト(JavaScript互換?)の・・・コンパイラ&実行かな?
FileMakerProはMAC用のデータベースソフト?Accessみたいな感じ?
TeraPadは・・・テキストエディタ・・・ですね。
DoMacroは・・・なんだろ(汗)TeraPadの操作用独自マクロ?
出てくる説明文に聞いたこと無いモジュール名などが頻発してるので、何がどこまで出来るのか、理解に苦しんでいます(汗)

あ。希望機能は、半分冗談だったので、まじめに答えてもらったのが申し訳ないです・・・ごめんなさい(><

つちや さん 2003年 06月 25日 11時 40分 00秒

Dear むたぐちさん あささん

実は、例のあれとは、DMonkeyをActiveX DLLにしてコンパイルしたもので、
http://www2.jan.ne.jp/~kajika/dl/dm_com.lzh
こっちの方ですよね。(といおうか、こっちの方にしてしまいました)
これは、Set DM = CreateObject("DMonkey.Script")でインスタンスを形成し、

DM.Exec "println('hello');"
MsgBox DM.StdOut

みたいにして、DMonkeyスクリプトを実行します。
ファイルを実行するときは、
DM.ExecFromFile "C:\Sample\base64.dms"
のようにします。

Socketクラスは私にはわからないので、DMonkeyの方で記述できないでしょうか。
統合コモンアーカイバにあるUNLHA.DLLなどは、DMonkeyから操作することが可能なので、
きっとUNRAR.DLLもできるのでは。


DMC.DLLの方は、名前はDMonkeyにもとづいていますが、中身はまったく別物になってます。
(といおうか、なってしまいました)
こちらはどちらかと言えば、DoMacroの後継で、より汎用的にしたものです。
だからやっぱり名前はDMC.DLLのままになってます。
ZIPとCABは他のDLLなしで圧縮・解凍に対応する予定ですが、
他のアーカイバは上のコモンアーカイバの各DLLが必要になるでしょう。

ちなみに、DMonkeyのページには、DMonkeyを走らすスクリプトホストDMSHがありますが、
私がそれを勝手に拡張しているDMRun.exeというのも存在しています。
これは、最近JmEditorにも対応しました。
http://www2.jan.ne.jp/~kajika/dl/dmrun.lzh

あさ さん 2003年 06月 25日 10時 09分 12秒

>つちやさんへ
「例のあれ」が何かはわかっていませんが、ぜひ「TCPSocketクラス」お願いします(爆)
もちろんTCPSocketクラスには、MagicPacketメソッドありますよね?(笑)
あと、オブジェクトのシリアライズみたいなのも希望(^^;;
CompressにZipとRarも希望。(ってわがままな私。笑)


>アンドレ・リュウさん
私もリモートはやったことないので、関係あるかわかりませんが、Script56.CHMの
「Microsoft Windows スクリプト テクノロジ」−「Windows Script Host」−「リモート WSH をセットアップする」
の項で、
「1.コンピュータに WSH Version 5.6 をインストールします。」
「2.自分のユーザー アカウントをリモート コンピュータのローカル管理者グループに追加します。」
「3.サーバー上で Poledit.exe を使用して、リモート WSH を有効にします。」
とかかれているので、リモートでスクリプトを動かすときには、管理者権限が必須なのかも知れません。

もしくは、私の勝手な想像ですが、スクリプトに署名などして、認証すればいけるかも・・・とか思ったりします。(的外しているかも知れません)


>さとまるさんへ
えぇ〜と。そのページから丸々引用です。^^;;;
--------------------------------------------------
 REG_DWORDを指定すると、anyValueの値に文字列型の値を指定しても、自動的に整数値に変換され書き込まれますが、REG_BINARYでは整数値しか指定できません。

 バイナリ型のデータで、たとえば値がf5,18,0c,1eなら&H1E0C18F5(もしくは504109301)のように指定します。
 1(=&H01)などの1バイトの値をそのまま書き込もうとすると、01 00のように2バイトになってしまいます。これを回避するには、CByte(&H01)のように、明示的にバイト型に変換した値を指定します。
 ただし、REG_BINARYはLong型の整数しか指定できないため、書き込める値に限度(すなわち&HFFFFFFFFまで)があります。これを越えるデータを指定したい場合は、.regファイルを自前で用意し、
WshShell.Run "regedit /s hogehoge.reg"
のように/sオプションをつけて実行し、レジストリに書き込んでください。(/sオプションをつけると、確認メッセージが出なくなります)
--------------------------------------------------
と、いうことで、読み込んだ値がいくつか確認して見てください。


>アルジャーノンさんへ
むたぐちさん指摘の「Set」っぽい気がしますね(笑)
オブジェクトを代入するときは、かならずSetを使わなければなりません。

Set WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter("\\SERVER\LP8300C")

<%
Option Explicit
Dim WshNetwork
Set WshNetwork = Server.CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter("\\SERVER\LP8300C")
Set WshNetwork = Nothing
%>
とやってみてください。
どうでしょ?


>むたぐちさんへ
あ。そうそう「ソケット」・・その言葉が思い浮かばなかった(汗)
Perlは、他の言語と言語仕様がかけ離れてて、ちょっと使いにくい(と感じる)です。^^;;;
むたぐちさんはPerl使いですか?(^^;;
やっぱ標準機能だけではソケットダメですかねぇ・・・(><

#しっかし、なぜか、むたぐちさんって「いろいろな呼ばれ方」しますよね(笑)
#無駄口さん・・・って・・・うちのパパに失礼なぁ(爆)

さとまる さん 2003年 06月 25日 07時 17分 23秒

むだぐち さん、ありがとうございます!!!
リンク拝見致しました!
書き込むことは理解し出来るようになりました。
・・・ですが、この場合が
---------------------------------------------------------------
Dim WShell,a
Set WShell = WScript.CreateObject("WScript.Shell")
a = WShell.RegRead("HKCU\Control Panel\Appearance\CustomColors")
'上記でaに代入したバイバリ値を下記にコピーさせたいのですが・・・
WShell.RegWrite"HKCU\Control Panel\Desktop\UserPreferencesMask",a,"REG_BINARY"
----------------------------------------------------------------
「型が一致しません」とエラーになります。
本当はこれもhttp://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/wshshell.htmにかいてあったりするのかもしれませんが見つかりません。
どうかご指導お願いします。

管理人むたぐち さん 2003年 06月 25日 02時 38分 55秒

To: ヒデ さん

正解は、
Strg = "HKLM\system\ControlSet001\Control\ComputerName\ComputerName\ComputerName"
ですね。ComputerNameキーは何故か二層化されてるんです。


To: あさ さん

標準機能だけでソケット使いたいですよねえ。

ActivePerlを入れて、use socket;なんちゃらかんちゃらなPerlScriptを書いて、
WSC化するとか…。って敢えて前提条件を無視した発言をしてみる(w


To: つちや さん

おお、例のあれですね。
タイムリーなのでTCPSocketクラスもお願いします(w

> マニュアルなど全然作ってませんので、オブジェクトブラウザを見て、
> 試すしか今のところないです。

http://sourceforge.jp/projects/dmonkey/
ここのDMonkey Helpを参考にしてもらえばいいのでは?
(完全互換…というわけでもないのかな?)


To: アンドレ・リュウ さん

DCOMについては、私もあまり、というか全然分かってないですが…。
dcomcnfgで、Windows Management Instrumentationのプロパティを開くと、
それらしい設定項目が出てきますが、下手に弄ってよいものか…。

あとは
microsoft.public.win32.programmer.wmi
microsoft.public.wbem
あたりのログを探してみるか、質問してみるかですね。
http://groups.google.com/groups?num=50&hl=ja&inlang=ja&lr=&ie=Shift_JIS&c2coff=1&q=wmi+dcomcnfg&btnG=Google+%8C%9F%8D%F5


To: さとまる さん

http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/wshshell.htm
ここに「REG_BINARYの値を読む例」というそのものズバリな参考例がありましたのでどうぞ。
各項目の値がバイト型データになっている配列として得られるわけです。
バイト配列じゃないので、For...Nextでちゃんと読めます。


To: アルジャーノン さん

私もASPは詳しくないんですが、やはり何らかの権限の問題かと。
詳しい方の降臨を待ちましょう。
(まさかSetが書いてない、とかそういうレベルの問題じゃないですよね)

アルジャーノン さん 2003年 06月 24日 23時 26分 58秒

>あささんへ
回答ありがとうございました。
調子にのってソースを公開します。
まず、vbsファイルの方ですが
WshNetwork = WScript.CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter("\\SERVER\LP8300C")
です。このファイルをダブルクリックしたら、通常使うプリンターの設定は
いろいろと変更できます。
そしてASPファイルの方は、
<%
Option Explicit

Dim WshNetwork

WshNetwork = Server.CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter("\\SERVER\LP8300C")

Set WshNetwork = Nothing
%>
以上です。ASPファイルは、仮想ディレクトリーに直結した物理ディレクトリにあり、IIS管理下で動作しています。
特にIISでの仮想ディレクトリーの設定はデフォルト値と変えていませんが、
ただ、スクリプトの実行権をチェックしている程度です。
ああでもないこうでもないと、素人の悲しい性で、他に何かの設定がかわっているのかもしれません。いろいろと自分なりに調べましたが、上記のようなASPで
OKだと書いてあるように思えるのですが、

さとまる さん 2003年 06月 24日 21時 33分 34秒

今回は質問だけです。どなたかご回答お願いします。

VBScriptでレジストリのバイナリ値(バイナリデータ)を読み込むことが出来ず
「型が一致しません。」とエラーになります。
他の値は読み込むことが可能なのにバイナリ値だけエラーになります。
どなたか解決策を教えて下さい。
お願いします。

環境
OS = WindowsXP HomeEdition
VBS(WSH?) = Version 5.6(だったけ?とにかく最新版です。)

アンドレ・リュウ さん (ihopeyourhappyend@hotmail.com) 2003年 06月 24日 20時 23分 46秒

初歩的な質問かもしれませんがどうかよろしくお願いします。
リモートサーバ上にプロセスを作成することに関してです。

サーバー  :ドメインAに参加するメンバーサーバ、Windows2000 Server+SP3
クライアント:ドメインAに参加するWindows 2000 Professional+SP3

スクリプトの内容

Set objWMIService = GetObject("winmgmts:\\" & "RemoteServer" & "\root\cimv2")
Set objProcess = objWMIService.Get("Win32_Process")
intReturnValue = objProcess.Create("notepad.exe", , , intPID)
WScript.Echo "Process ID: " & intPID

上のようなスクリプトを書いたのですが、Administrator権限をもつアカウント
でクライアントにログオン後、上記スクリプトを実行するとリモートサーバにプ
ロセスを作成できます。Domain Usersにしか属していない一般ユーザーUserXで
ログオン後実行するとあたかも実行されたかのようにProcess IDの値が帰ってく
るのですが実際にはサーバー上で実行されていません。UserXにAdministrator
権限を与えることは運用管理上避けたいのです。UserXがリモートサーバ上でプ
ロセスを作成するにはどんな方法でアクセス権を与えればよいのでしょうか。
こちらでやったことは、「コンピュータの管理」内にあるWMIでUserXにセキュリ
ティを追加しただけですが、まだ不十分のようです。
dcomcnfgでも設定がいるようなのですが、何をどう追加するのかわかりません。
このあたりの必要な追加設定の方法をご存知でしたらご教授ください。

つちや さん 2003年 06月 24日 18時 18分 36秒

ども。近況報告を兼ねて。

■DMC.DLL
ちょっとActiveX DLLを作ってみました。
めざせ(SIGNAL9さん作)スイスアーミーということで、結構多機能です。

現在サポートしているクラス
Clipboard…クリップボード
Compress…Cab解凍、UNLHA.DLLにコマンドを送る
Crypt…BlowFish暗号化・復号化、CRC32・MD5計算
Debug…NotePadを使用してデバッグ
Dialog…開く・保存・パスワードダイアログ
Editor…TEditorを使用したEditorの文字列を取得・書き換え
HTTP…HTTPプロトコルを利用してデータ取得・GET/POST
INI…INIファイルの操作
StringUtils…文字列操作に関する様々なコマンド
StrList…ストリングリストのラッパークラス
WinAPI…FindWindowやShellExecute、SetForegroundなどのサポート

たとえば、クリップボードを使う場合は、

Set Clip = CreateObject("DMC.Clipboard")
Clip.AsText = "コピーしたい文字"
If Clip.HasText Then
MsgBox Clip.AsText
End If

といった使い方をします。
マニュアルなど全然作ってませんので、オブジェクトブラウザを見て、
試すしか今のところないです。
別途私が作ったVxEditor.inc TepaEditor.inc JmEditor.incなどを使うと、
それぞれのエディタを操作することもできます。
専用ページもないので直リンクですが、
http://www2.jan.ne.jp/~kajika/dl/dmc.lzh
に今のところ転がっています。

その都度私が必要なものとか、あったら面白そうなものを追加している状態です。

■TsvPad
何ヵ所かで、アプリケーションがCOM化したらいいなあという話をしてたのですが、
やっぱり自分で作ってみようということで、タブ区切りテキストファイル用エディタを
ちょっとCOM化してみました。(一応CSVファイルも使えます)
そうするとWSHをマクロがわりに使えて便利です。
(最初DMonkeyを搭載していたのですが、そうするとファイルサイズが膨大になるので、
 のりかえてしまいました。)
もっとメソッドなどを増やしたら、公開したいなっと思ってます。

あさ さん 2003年 06月 24日 15時 31分 31秒

えぇ〜・・・ゴホン。(汗)
質問です(^^;;;;

「MSWinsock.Winsock」「BASP21」等、追加コンポーネントを使わずに、Windows2000標準で、MagicPacketを送信する方法はないでしょうか。

フリーのツール等はあるのですが、自分で(VBSで)やってみたいというだけの話です(汗)

ちなみにMagicPacketとは、電源がOFF状態のマシンAにマシンBから「電源つけなさい!」と送信するパケットのことです。「Wake On LAN」対応のLANボードで、かつマザーボードと接続し、BIOSで有効にしている場合に、このような事が出来ます。
ここが詳しいかな?
http://plaza.across.or.jp/~kusunoki/wol_1.htm

参考までに、どこかのサンプル見ながら、MSWinsock.Winsockを使ってのソースを作ったので、載せます。
でも、動作未確認です(^^;;;;

なんせ、自分が使ってるマシンがWake On LANできるように配線等をしているのに、そのマシンにしかWinsockが入っていないのです。
たしか、ライセンスの絡みもあるので、他のマシンにWinsock入れるわけにもいかず(泣)


Const D_IP_BROADCAST_ADDRESS = "192.168.0.255" 'ブロードキャストアドレスです。
Const D_MAC_ADDRESS = "00-00-00-5A-6C-DB" 'MACアドレスです。
Dim objSocket
Set objSocket = CreateObject("MSWinsock.Winsock")

With objSocket
.Protocol = 1 'UDP
.RemoteHost = D_IP_BROADCAST_ADDRESS
.SendData CreateMagicPacket(D_MAC_ADDRESS)
.Close
End With

Msgbox D_MAC_ADDRESS & "宛てにMagicPacketを送信しました。"

Private Function CreateMagicPacket(strMacAddress)
Dim strRet

Dim strItem
Dim strTemp
Dim strData
Dim intLoop

Dim strArrayBuffer
Dim strArrayMacAddres

strRet = ""

'MacAddreeの加工
Select Case Len(strMacAddress)
Case 12
'作ってもいいかも
strArrayMacAddres = -1 'Error

Case 17
strArrayBuffer = Split(strMacAddress, ":")
If Ubound(strArrayBuffer) = 5 Then
strArrayMacAddres = strArrayBuffer
Else
strArrayBuffer = Split(strMacAddress, "-")
If Ubound(strArrayBuffer) = 5 Then
strArrayMacAddres = strArrayBuffer
Else
strArrayMacAddres = -1 'Error
End If
End If

Case Else
strArrayMacAddres = -1 'Error
End Select

if strArrayMacAddress <> -1 Then
For Each strItem in strArrayMacAddres
strTemp = strTemp & Chr("&H" & strItem)
Next

For intLoop = 1 to 16
strData = strData & strTemp
Next

strRet = String(6, &HFF) & strData
End if

CreateMagicPacket = strRet
End Function

やっぱ標準だけじゃダメなのかなぁ・・・
ダメならあきらめてsndmagic使わせてもらいます(><
http://www.st.rim.or.jp/~yumo/pub/sndmagic_chglog.html

あさ さん 2003年 06月 24日 13時 17分 36秒

>あいてっ子さんへ
参考になってよかったです。^^
でも、むたぐちさんの指摘したShellApplicationを使った方法のほうが、ステキなプログラムになりますよ(汗)
ぜひ、そちらも調べて見てくださいね^^


>geniさんへ
VBSの呼び出しまでは、うまくいっていると思われますので、後はパラメータを拾うだけですね。

とりあえず、せっかくこのページにたどり着いたので、「Lesson12 ネットワークとコマンドラインオプション」のWshArgumentsオブジェクトのところをよく見て見ましょう。
マイクロソフトのページから「Script56.CHM」の日本語ヘルプもありますので、そちらも参照して下さい。サンプルが載っていたと思います。
あ。今気が付いたけど、このBBSの表題のところの「オンラインヘルプ」のリンクがそうですね(笑)そこからダウンロードしてくださいね。


>ヒデさんへ
さとまるさんの書き込み通り「キー名」だからだと思いますね。
私がパッと見てすぐ思いついたのは、レジストリへのアクセス権が無いのでは・・・と思ってしまったのですが(汗)

まぁ、ちなみに、コンピュータ名あたりの情報なら
Set objWshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Domain = " & objWshNetwork.UserDomain
WScript.Echo "Computer Name = " & objWshNetwork.ComputerName
WScript.Echo "User Name = " & objWshNetwork.UserName
と、簡単に取得できたりします。(笑)
レジストリを読みに行く必要はないですね^^

さとまる さん 2003年 06月 24日 12時 22分 29秒

はじめまして。
さとまる と申します。

>ヒデさんへ
HKLM\system\ControlSet001\Control\ComputerName\ComputerName
は値じゃなくキー名だからなのでは!?
うちはWinXPだけど・・・。

>geniさんへ
スイマセン。<HTML>がつくやつはいまいちわかりません。

ヒデ さん 2003年 06月 24日 10時 37分 05秒

はじめまして。
ヒデと申します。
初心者なのでさっぱり見当がつかないので教えて
頂きたく投稿いたします。

下記のVBSの最後の行で
「読み取ることができません」コード80070002で異常終了
してしまいます。
ない頭でいろいろなページを渡り歩きましたが解決できな
ませんでした。

Windows2000のコンピュータ名を取得したいのですが・・・
ご指導お願いできればと思います。


Dim WSHShell
Dim Strg
Dim C_name
Set WSHShell=Wscript.CreateObject("Wscript.Shell")
Strg = "HKLM\system\ControlSet001\Control\ComputerName\ComputerName" 'なぜ読めない?
C_name = WSHShell.RegRead (Strg)

geni さん 2003年 06月 24日 10時 30分 13秒

はじめまして、geniと申します。
windowsで汎用的に動くものってな感じで探していたら
WSHというものがあると聞き、ここにたどりつきました。

早速質問で悪いのですが、HTMLからWSHを呼び出すときに
WSH内の関数に引き数を渡す方法がいまいちよくわかりません、

HELPのRUNの説明の中には「渡すべきパラメータをすべて含める必要があります」
とだけしか書いてありませんし、、、
どの辺りを調べればそのことが乗っているでしょうか、、
一応HTMLとWSHのソースを書いておきます。

HTMLファイルとWSHファイルは同じフォルダのなかにあります

///HTMLはここから
<HTML>
<HEAD>
<TITLE>
VBSCRIPT_WSH_SAMPLE
</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
Private Sub Load_VBS(strSrh)
Dim objShell
Dim strFolderPath

Set objShell = CreateObject("WScript.Shell") 'オブジェクトの作成
strFolderPath = location.pathname 'ファイルパスを取得
strFolderPath =Left(strFolderPath,InstrRev(strFolderPath,"\")) & "vb.vbs" '同一フォルダ内のアイテム指定
strFolderPath =Mid(strFolderPath,2)
objShell.Run strFolderPath strSrh 'アイテムの起動
End Sub
' -->
</SCRIPT>
</HEAD>
<BODY>
<FORM METHOD=POST accept="Load_VBS(text1.value)">
<INPUT TYPE="text" NAME="text1">
<INPUT TYPE="submit" NAME="Command1" VALUE="押す">
</FORM>
</BODY>
</HTML>

///WSHはここから
Public sub CsvToHtm(strSrh)
dim objCsv

set objCsv = wscript.createObject(wscript.FileSystemObject)
objCsv.OpenTextFile("test.csv")
objCsv.close

magbox strSrh
end sub

あいてっ子 さん 2003年 06月 24日 10時 07分 26秒

御報告が遅くなりまして申し訳ありません。

>あさ様、むたぐち様
レスありがとうございます。
おかげさまでスクリプトが完成いたしました。
移動ループの中にファイルを一つ移動ごとに
objWshShell.Popupを用いて
「●個目移動中です」というポップアップを
一秒づつ表示させることにいたしました。
(ファイルの大きさ的に丁度よいのが一秒でした)
いくつ移動中か一目でわかり、よい感じです。(^^)
本当にありがとうございました。

あさ さん 2003年 06月 24日 09時 41分 39秒

>アルジャーノンさんへ
えぇ〜と。いったいどのような処理をしているのでしょうか・・・

まぁ、なんとなくですが、ASPの場合、WSHと比べてセキュリティ上の制限がかかっている部分が多々ありますので、その辺かと思います。
単純にローカル資源へのアクセスが、拒否されているだけかもしれません。
#ごめんなさいASP詳しくないです(汗)

それから、「ASPでダメになり、VBSで動くサンプルソース」を公開していただけると、より正確な回答を得られると思われます(^^;;;


>真琴さんへ
あ。笑ってけなしたわけではないですよ(汗)
VBでは、「インクルード」って言葉自体あまり使わないので・・・
でも、その言葉を知っているという事は、C言語とかその他の言語に明るい証拠だと思いました。
ですので、ソースだけ載せて、細かい説明は省かせてもらったんです(笑)


>tomさんへ
動いて良かったですね。^^
これからも一緒に頑張りましょう(笑)
やっぱり「動きました」ってだけでも書き込みもらえると、回答した側としてはうれしいですね^^
多分、むたぐちさんもそう思うと思いますので、質問者は「結果どうなったか」を書いてもらえると良いと思いますが、どうでしょう?(^^

>むたぐちさんへ
レジストリの編集ソースありがとうございます。
ちゃっかり私もコピペして保存しました(笑)
それから、XML。
過去に「なんちゃってXML」でないwsfも一回作っているんです。
しかも、実は今PHPで触るために勉強していたりもします。
#でもWSHだとShiftJISでもOKな罠(笑)


>いりやさん、むたぐちさんへ
そう言ってもらえるとうれしいですね。
ここの掲示板の閲覧頻度も最近上がってますが、さらにあがりそうです(爆)
これからもよろしくお願いします。^^

> …いや、やっぱそれなりにお手柔らかに願います。
いやいや、私がむたぐちさんにつっこまれることの方が多いはず(笑)

アルジャーノン さん 2003年 06月 23日 22時 33分 54秒

ASPからのSetdefaultPrinterとvbsファイルからの
SetDefaultPrinter、同じ処理をしているのに、何故
vbsファイルはできて、ASPからは駄目なのでしょうか?
誰かおしえてください。

管理人むたぐち さん 2003年 06月 23日 17時 45分 42秒

Scripting Clinic コラムで、WMI入門の日本語訳が追加されてました。
(半年以上前ですけど)

WMI スクリプト入門 : 第 1 部
http://www.microsoft.com/japan/msdn/columns/scripting/scripting06112002.asp
WMI スクリプト入門 : 第 2 部
http://www.microsoft.com/japan/msdn/columns/scripting/scripting08132002.asp

ちなみに第3部は未訳。
第3部(英語)
http://msdn.microsoft.com/library/en-us/dnclinic/html/scripting01142003.asp

Scripting Clinicって全部が日本語訳されてるわけじゃないんですね…。


To: CORNELIUS さん

レジストリのサブキーの存在するキーを削除するスクリプト、
結構使いでがあるかもしれないので作ってみました。

Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_PERFORMANCE_DATA = &H80000004
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006

Const BaseKey = "SOFTWARE\WshRegDeleteExSample"
strComputer = "."

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")

aKeys=Array(BaseKey,BaseKey & "\subkey1",BaseKey & "\subkey2",BaseKey & "\subkey1\subsubkey",BaseKey & "\subkey1\subsubkey\subsubsubkey")

For Each sKey In aKeys
oReg.CreateKey HKEY_LOCAL_MACHINE,sKey
Next

MsgBox "レジストリキーを作成しました。レジストリエディタで" & vbCrLf & _
HKEY_LOCAL_MACHINE\SOFTWARE\WshRegDeleteExSampleを確認してください。"

RegDeleteEx HKEY_LOCAL_MACHINE, BaseKey 'レジストリ削除関数を呼び出す

MsgBox "レジストリキーを削除しました。"

Sub RegDeleteEx(iRootKey,sKey)
'sKey以下にサブキーがある場合は、まずそれを再帰的に削除する。
oReg.EnumKey iRootKey, sKey, aSubKeys 'サブキーの列挙
If IsArray(aSubKeys) Then 'もし、サブキーが存在するなら
For Each sSubKey In aSubKeys '各サブキーに対して再帰呼び出し
Call RegDeleteEx(iRootKey,sKey & "\" & sSubKey)
Next
End If
oReg.DeleteKey iRootKey,sKey '削除処理
End Sub


To: いりや さん

http://www.microsoft.com/japan/developer/library/vbcon98/vbconorganizingobjectstheobjectmodel.htm
あたりです。

これはあくまで、VBでCOMコンポーネントを作成する際のリファレンスですが、
汎用的なCOMコンポーネント設計指針として読めなくもないというところですかね。
COMコンポーネントで外部からインスタンスを作成できないクラスを従属オブジェクトというのが、
一般的な表現かどうかは分かりませんが、この説明ではそう書いてあるということです。


To: あさ さん&真琴 さん

> 「なんちゃってXML」

これはちょっと表現が悪かったかもです。
WSHのリファレンスには、「比較的厳密でない構文」とありますね。
どこまでが「比較的厳密でない」のかは確かによく分からないですが。

wsfファイルの文頭に、
<?XML version="1.0" standalone="yes" encoding="Shift_JIS" ?>
と書くと、厳密なXMLの構文解析が行われるようになります。

こうするとスクリプトコード部の記号を隠蔽するために、
<![CDATA[ ... ]]> セクションで括ったりしなくてはならない、などの
XML的厳密さが要求されるようになります。

これは、HTML 4.0 Strict とHTML 4.0 Transitional の関係に似てるかもしれません。
状況に応じて、XMLで書くか、「比較的厳密でない構文」で書くかを選択するって感じです。

個人的には、「比較的厳密でない構文」はお手軽に書くとき、
XMLは気合入れて書くときに使います。
というのも、「比較的厳密でない構文」は確かに厳密じゃない分、記述しないと
いけないタグも少ないのですが、どうしてもそれが理由で「曖昧さ」が残ってしまいます。
単純なスクリプトではほとんど問題が出てこないのでしょうが、複雑なスクリプトになると、
その「曖昧さ」が原因となって訳の分からないエラーに悩まされるといった事態が
起こりかねないです。
なので、多少面倒ではありますが、XMLの文法に従ってきちっと記述してやる方がいいわけです。
XMLの記述ミスしている場合は、スクリプトが実行される前にエラーを出してくれるので、
XML記述に起因するエラーは未然に回避できるということです。

> http://www.microsoft.com/japan/technet/scriptcenter/default.asp

う…日本語版あったんですね。
というわけで、こっちをどうぞー。おそらく英語版に比べて過不足ないと思います。
(昨日、英語の方をほとんど読破してしまったぞ…といってもほとんどコードばかり
なので大したことはなかったが…)


To: いりや さん&あさ さん

私もいりやさんに同感です。
いろんな意見が出た方が、話題が広がりますし、私自身も勉強になりますんで、
是非しり込みせずに意見を出しまくっていただけると幸いです >ALL
もちろん、間違いに対する容赦ないツッコミも歓迎ですよ。
…いや、やっぱそれなりにお手柔らかに願います。

tom さん 2003年 06月 23日 16時 58分 16秒

あささん、むたぐちさん
ありがとうございました!!
無事スクリプトが完成しました。
プログラムの勉強をこれからも、がんばりたいと思います。
また、こちらで質問をさせていただくことがあると思いますが、
宜しくお願いいたします。

真琴 さん 2003年 06月 23日 16時 03分 16秒

ヒカリブシ さんへ
ありがとうございました。
どうやら、うちが使っているのは、2.0のようでした。よかったよかった(笑)
ちなみに、なにかのバージョンが5.1以上だとWSH2.0だって意味なんでしょうか。

あさ さんへ
「インクルード」ですか(笑)  って、笑われちゃった感じですが、ありがとう
ございました。やっぱり、<job 〜〜 とかの(最小限の)タグみたいなのを書か
ないといけなんですねぇ。あささんのサンプルを見本に、うちのプログラムにも組
み込んでみて、うまくいきました。どこまでが最小限なのか、分かんなかったんで
助かりました。

むたぐち さんへ
ありがとうございました。すこしずつXMLとかも、勉強していかないといけない
のかなぁって、感じです。

いりや さん 2003年 06月 23日 13時 05分 26秒

あささん、

スタンスは人の数だけあってよいと思いますよ。私は掲示板に投函するとき
誰のどんな反応でも非常に貴重に感じます。人はどうして同じ話題をこうも
別に考えるのか? お返事をいただくたびに、新しい観点や新しい発想が得ら
れますから正しいとか間違いとかそんなことは全く感じません。

いりや

あさ さん 2003年 06月 23日 10時 13分 21秒

むぅ(汗)
やっぱ、むたぐちさんすごいなぁ・・・
力の差を感じてしまう(汗)

毎回ですが、私の答えが知識もなく、なぁ〜んも調べていないのが、バレバレになってるよぉ(恥)
はい。私が書いたのは「なんちゃってXML」です(泣)
#でも、そうだと分かってるつもりです・・・つもりぃ・・(^^;;;

でも、結構これだけしかタグ書いていないサンプル多いですよね。

しかも、やってることは、かっこ悪いときてるし(汗)
いりやさんあたりの質問になると、苦しくて答えられないし(汗)

質問者へのスタンスも寛大だし(汗)
私のスタンス間違ってたら言ってくださいね>むたぐちさん

まだまだ、ここで勉強させてもらいます(苦笑)
よろしくお願いします(^^;;;


それから、むたぐちさんが見つけたサイト
http://www.microsoft.com/technet/scriptcenter/default.asp
・・・は、ここと同じじゃないですかね?(汗)
http://www.microsoft.com/japan/technet/scriptcenter/default.asp

内容の比較はしてないですが、こっちは日本語だったりします(^^
日本語見て、欲しいサンプルなかったら、英語も見てみる。
って感じでしょうか。


いりや さん (iriyak@mcn.ne.jp) 2003年 06月 22日 11時 45分 39秒

むたぐちさん、

> JSGlobal(jscript.dllのタイプライブラリ)やVBScript_Global(vbscript.dll)に
> 含まれるクラスは、すべて従属オブジェクト(MSDNライブラリにはそう書いてある)で
> あるからです。

解説ありがとうございました! msdn ライブラリ、私も読んでみたいのです
がどちらになりますでしょうか?

http://www.microsoft.com/japan/msdn/scripting/default.asp

を少し散策しましたが、ちょっと見つかりませんでした。。

> ただし、JScript内でJScriptのクラスをインスタンス化したオブジェクトを、別言語に
> 渡すことは可能です。オブジェクトをやり取りする方法は色々あると思いますので

はい、ちょっとこちらの方向性を検討したいと思います。(wsc, ...etc)

管理人むたぐち さん 2003年 06月 22日 03時 43分 20秒

※ここからは前ページの返信になります


To: ヒカリブシ さん

ScriptEngineMajorVersionはVBSエンジンのバージョンを返すので、
WSHのバージョンを知りたい場合はWScript.Versionの方がいい気がします。
最新は5.6ですね。
5.6以前は、スクリプトエンジンとWSHのバージョンが一致せず混乱しましたが、
現在は統一されています。


To: 真琴 さん

真面目に使いこなそうと思うとXMLの勉強は必須になると思いますが、
wsfは「なんちゃってXML」でも動くようにできていますんで、
あささんが提示されたような最低限のタグでも、動作することはします。
詳しい文法等は、WSHのヘルプを当たってみてください。詳説してあります。


To: CORNELIUS さん

RegDeleteメソッド(というよりこれが呼び出すWin32 API)の挙動は、OSによって
変わるそうです。
具体的にはNT系だとサブキーがあると削除できないですが、9x系だとできるようです。

つまり、NT系でサブキーのあるキーを削除するには、再帰的にサブキーを削除していく
しかなさそうです。
ところが、WshShellのレジストリ操作系メソッドには、サブキーの列挙を行うメソッドが
ないので、サブキーがあらかじめどんな名前か知ってる場合しか削除できません。

この問題に対する一つの解決法としては、WMIを用いる方法があります。
そこでさっき紹介したページが役立つわけですが。

http://www.microsoft.com/technet/scriptcenter/registry/default.asp の
Enumerate Subkeys
Delete a Registry Key

を組み合わせて、再帰処理を書けばいけるでしょう。


To: ヒカリブシ さん

WSHで使うJScriptならやっぱりAYAさんのところが最強だと思います。
http://member.nifty.ne.jp/aya/
(JScript .NETの解説も始まったのねー)


To: yoka さん

WMIだとWin32_DiskDriveToDiskPartitionかな?と思って、Google Groupsで検索すると、
こんなのが引っかかってきました。
http://groups.google.com/groups?q=Win32_DiskDriveToDiskPartition&hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&selm=OdSeZjTSCHA.1468%40tkmsftngp11&rnum=2

クエリー文に出てくるASSOCIATORS OF とかAssocClass=とかは私にとっては謎ですが、
WMIオブジェクトブラウザを見る限り、Win32_DiskDriveクラスの各ドライブのDeviceID下に
Win32_DiskDriveToDiskPartitionクラスというAssocClassがあって、そこから
Win32_DiskPartitionクラスのセットが得られるって感じですか。
同じように、Win32_DiskPartitionクラスの各パーティションのDeviceID下に
Win32_LogicalDiskToPartitionクラスがあって、そこからWin32_LogicalDisk
クラスのセットが得られると。

後は、よくわかりませんが、
Win32_DiskPartitionクラスの、Bootableプロパティ、BootPartitionプロパティが
「状況」(アクティブかどうか)に対応してるのかな?
DeviceID="Disk #0, Partition #0"のPartition #0が基本、他が拡張という解釈で
いいのかな?

ちなみにこんな調子で階層を下っていくと、
Win32_LogicalDisk.DeviceID="C:"
 Win32_LogicalDiskRootDirectory.PartComponent
  Win32_Directory.Name="C:\\"
   CIM_DirectoryContainsFile.PartComponent
    CIM_DataFile
とかに行けるわけですね。奥が深いなぁ。


To: ぐちやま さん

> アクティブなフォルダウィンドウに、フォルダまたはテキストファイルを新規作成するにはどうすればいいんですか

まず、アクティブなフォルダウィンドウがどれかを調べるのは、Win32APIを使わないと
無理でしょうし、vbsファイルをダブルクリックした時点でアクティブなフォルダ
ウィンドウはそのvbsファイルが存在するフォルダウィンドウに変わってしまいます。
ので、あまり仕様としてあまり好ましくないんじゃないでしょうか?

考え方としては、「実行するvbsファイルが存在するフォルダに、新しいフォルダやファイルを
作成する」方が好ましいと思います。この方向で考えてみてください。
(で、いいのかな?)


To: syu さん

結局何が問題なのか分からなくなってきましたが、まず最初の"/"を取り除いて、
次に"\"を"/"にReplace関数で置換すればとりあえずOKということでしょうか?

管理人むたぐち さん 2003年 06月 21日 23時 29分 22秒

Script Center
http://www.microsoft.com/technet/scriptcenter/default.asp

こんなページ発見。
WMI/ADSI/CDO/Shell.Application等のサンプルが大量にあっていい感じです。
機能のリファレンスではなく、やりたいこと(たとえば、「ファイルを移動する」とか)
がインデックスになっているので見やすいです。
これ、かなりお勧めですよ。英語ですけど。


今回の返信は微妙に順不同です。先にこのページの返信から行きます。


To: いりや さん

私もあまり詳しくないのですが、JScriptのクラスをCOMを通じて他言語から
直接インスタンス化する方法はないような気がします。
VBScript.RegExpや、Scripting.FileSystemObjectなどは外部から作成可能な
オブジェクトですが(VBではCreateObject関数やNewキーワードを用いる)、
JSGlobal(jscript.dllのタイプライブラリ)やVBScript_Global(vbscript.dll)に
含まれるクラスは、すべて従属オブジェクト(MSDNライブラリにはそう書いてある)で
あるからです。

ただし、JScript内でJScriptのクラスをインスタンス化したオブジェクトを、別言語に
渡すことは可能です。オブジェクトをやり取りする方法は色々あると思いますので
ここでは略します。
(この返信、何か書いていて不安になってきました。見当違いかも)


To: あいてっ子 さん

Shell.Applicationを使ったファイル操作だと、実行中にエクスプローラと
同じダイアログを出すことができます。
詳しくはWSHから呼び出せるオブジェクト-Shellオブジェクト (ShellApplication)を
ご覧ください。

もちろん、cscriptで実行して、Wscript.Echoで経過表示するというあささんの手も
有効だと思います。

以下はボヤキです。

FolderItemsコレクションに任意のFolderItemオブジェクトをAdd/あるいはRemove
できれば便利なんだがな…。
FolderItems2コレクションのInvokeVerbExメソッドでまとめてファイル処理ができるので。

現状だと、個々のFolderItemオブジェクトをInvokeVerbメソッドで処理するか、
Folder.Itemsでフォルダ内の全アイテムを格納したFolderItemsコレクションを得て、
それを一括して処理するしかない。

Shell.ApplicationのWindowsメソッドからフォルダのShellFolderViewオブジェクトを
取得して、SelectItemメソッドで任意のアイテムを選択したのち、SelectedItemsメソッド
を使って、「任意のFolderItemオブジェクトを含んだFolderItemsコレクション」を
得る技もあるにはあるが、かっこいいとはとても言えないしなあ。
http://www.users.gr.jp/ml/archive/wsh/313.asp こんなの。

2年くらい考えてるネタですが未だにこれといった解決策が出てきません。


To: tom さん

本題とはあまり関係ないですが、上で書いたShell.ApplicationのNameSpaceメソッド
を使ってFTPをフォルダと同等に操作できるらしいです。

参考例はJScriptですが、一応。
Windows Scripting Host 25 FolderItemhttp://member.nifty.ne.jp/aya/wsh/wsh25.htm

あさ さん 2003年 06月 21日 17時 27分 55秒

>tomさんへ
あ。きたきた(笑)
見た感じ、ものすごく難解なプログラムになってますね(笑)
使っていない変数や、意味の無い処理を省くと、もっと見やすくなると思います。

で。まず、問題点は、OpenTextFileのモード指定が「読み取り専用」だということですね。
この場合、ファイルに書き込みしたいので、「2」の書き込み専用としてファイルを開かないといけません。
エラーの直接の原因はこれですね。

ただ、文面やソースからは、やりたいことがいまいちよく分からないので、どうなんでしょう(汗)
これでいいのかな???


プログラム初心者だと思いますので、コメント付きで作って見ました。
----------sample.vbs----------
'定数の定義
const D_FTP_FILENAME = "c:\www\ftp.txt"

'使用する変数の定義
Dim strDate
Dim strLogFileName
Dim objFso

'日付の取得
varDate = Date

'月と日からログのファイル名を作成する。
strLogFileName = "testlog_" & Right("00" & Month(varDate),2) & Right("00" & Day(varDate),2) & ".log"

Set objFso = WScript.CreateObject("Scripting.FileSystemObject")

'ファイルを書き込み専用で開く。
Set objFile = objFso.OpenTextFile(D_FTP_FILENAME,2)
'1:Reading(読み取り専用)
'2:Writing(書き込み専用)
'8:Appending(追加書き込み)

'ファイルに一行書き込み
objFile.WriteLine strLogFileName

'ファイルを閉じる
objFile.Close

Set objWshShell = WScript.CreateObject("WScript.Shell")
objWshShell.Run "ftp -i -s:" & D_FTP_FILENAME
------------------------------

FTPコマンドを使ったことないので、よく分からないのですが、
「testlog_0621.log」の一行だけ書かれたファイルを出力すればよいのですよね??
もし、その他の出力が必要であれば、WriteLineの行を変更する必要があるでしょう。

おそらくtomさんにとって、VBSに関して勉強しなければならないことは多いですよ。
文法、プログラミングの方法なども、まだまだ未熟だと思います。
とにかく頑張って下さいね^^;;

マイクロソフトのページからWSHの日本語ヘルプがダウンロードできますので、そちらも見たほうが良いと思います。
URLはここの過去ログを探せばいっぱい出てると思います。
Script56.CHMというやつです。

#しっかし、VBSってFormat関数なくなってるんですね(泣)
#そっちに悩んでしまった(汗)

いりや さん (iriyak@mcn.ne.jp) 2003年 06月 21日 16時 47分 15秒
URL:http://iriyak.adam.ne.jp/uwsc.html

はじめまして、いりやと申します。いつもは UWSC というソフト
ウェアを使ってたまに WSH/JScript を使用しております。

http://hidebbs.net/bbs/umiumi?sw=7

質問が一つありまして VBScript.Regexp のように WSH/VBScript
が提供しているオブジェクトを Component Object Model を通じ
てその他のプログラミング言語処理系から利用することができま
すが、JScript のオブジェクトでもこのような形で利用できる手
段とかってあるのでしょうか??

c:\windows\system32\jscript.dll からタイプライブラリをダン
プして眺めたりもしたのですがうまくいきませんでした。。

もしご存知の方いらっしゃいましたらご教示いただけるとありが
たいです。

いりや


tom さん (manbow@intaa.net) 2003年 06月 21日 14時 20分 50秒

はじめまして、WSH初心者のtomと申します。
先日は中途半端な書き込みをしてしまい、申し訳ございませんでした。

一点ご教授していただきたいのですが、よろしいでしょうか?
環境はWindows2000Server の端末2台でWSH Ver2.0になります。
この片方の端末からもう片方の端末へWSHを起動するだけで、
FTPでファイルを転送したいと考えています。
ファイル名がxxxlog_0306.logのようなファイル名+年月のファイルなので、
はじめはバッチファイルで行おうとして変数が使用できなかったので、WSH
でやろうと思ったのですが、なかなかうまくいきません。

現在は以下の手順で行っています。
1.dateで日付データを取得して年月だけstrという変数に記録する。
2.ftpのコマンドを記述している(ログインして指定のディレクトリの移動まで)
ftp.txtに、さきほどのstrで取得したデータと指定のファイル名を最後の行に追記。
3.その後『WshShell.Run "ftp -i -s:ftp.txt"』で読み込ませようとしています。
しかし、2で正常に書き込みができず、悩んでいます。

<処理開始>
str = date
str2 = ""
str3 = ""
test = mid(str,3,2)
test2 = mid(str,6,2)

'取得データが前月分のための処理(テスト)

if test2 = "06" then
str= "05"
test2 = str
str = "testlog_" & test & test2 & ".log"
end if

’テキストファイル書き込み処理

set FS = CreateObject("Scripting.FileSystemObject")

FilePath = "c:\www\ftp.txt"

set TxtStrm = FS.OpenTextFile(FilePath,1)

if FS.FileExists(FilePath) = false then
TxtStrm.WriteLine str
end if

TxtStrm.Close

’FTP処理
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "ftp -i -s:ftp.txt"

<終了>
あつかましいと思いますが、ご指摘頂けたらと思います。

あさ さん 2003年 06月 21日 10時 12分 00秒

>ヒカリブシさんへ
Java頑張って下さい(^^;;;

私の場合、WSH作るのはVBで十分だし、Windowsアプリケーション作るならVB/C/C++とかになるし、サーバサイドスクリプトするならPHPになってしまうので(汗)
#まぁそうは言っても、もう何年もアプリ作ってませんが^^;;;

まぁ、やってもDHTMLでちょろちょろとJavaScript使うぐらいですねぇ・・
しかし、クロスブラウザやアクセシビリティ考えると、たいしたことできないので、出来合いのスクリプトに手を加えれば十分だったりします。

その為、少しカジってJavaは言語として面白くないと感じたので、興味が湧きません(笑)
#よく分かってませんが、サーブレットとかは気になりますけどね^^;;


>あいてっ子さん
そういう処理は、向いてないですねぇWSHは(笑)
ちょっと違う方向かも知れませんが、WSH5.6なら似たような事ができなくもないです。

まず、ひたすらもくもくとコピーするスクリプトをcopy.vbsとして作ります。
exec.vbsとして、copy.vbsを呼び出すスクリプトも作ります。
#名前は何でもいいですよ(^^;;;

で、exec.vbsの中で、
Dim objWshShell
Dim objExec
Set objWshShell = CreateObject("WScript.Shell")
Set objExec = objWshShell.Exec("cscript.exe c:\test\copy.vbs")
Do While objExec.Status = 0
objWshShell.Popup("コピー中",5,"コピー処理")
Loop
みたいな感じで、いけると思います。
(このソースは動作未確認だが、似たような処理作った事有り)

とりあえず5秒おきにポップアップが出てきて、OKかキャンセル押すか、5秒たつと、終了チェックする形になります。
まぁ5秒だとうるさいと思うので、適度に数字を合わせてください。
#「ポーーン、ポーーン、ポーーン、ポーーン・・・」みたいな(笑)

本来なら、「Do While〜Loop」の間に「WScript.Sleep 100」とか入れるのですが、おそらくPopup出してる時間で十分お休みになると思うので^^

・・・と。
ここまで書いてふと思う・・・
素直にコマンドプロンプト立ち上げて、
「cscript.exe c:\test\copy.vbs」で起動して、随時出力するのではダメ?(汗)
あ。cscript.exeとwscript.exeの違い分かりますよね?(汗)
Script56.CHMのヘルプを参照すれば、詳しく載ってますよ^^

あいてっ子 さん 2003年 06月 20日 16時 01分 38秒

初めて掲示板に書き込みをさせていただきます。
ただいまVBSにて、
「指定フォルダの中で条件に合うファイルをMOへ移動させる」
スクリプトを作成しております。
ファイルの数・容量共に多い為、ファイル移動中に「ファイルを移動しています」といったようなウインドウか何かを見せておきたいのですが、
そのようなことを実現させる方法はないでしょうか?
ない知恵を絞ってみたのですがどうにも思いつきません。
よろしくお願いいたします。

ヒカリブシ さん 2003年 06月 20日 11時 35分 06秒

あさ さん、

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

> Javaっすかぁ・・・WSHで使ってる紹介サイトは、確かに少ないかもですねぇ。
> で。探して見ました。
> http://www.usagi-js.com/
> http://member.nifty.ne.jp/aya/
> このあたりはどうでしょ?(私は見てません。笑)

やはりウェブで見れる情報はこの2サイトにしかないみたいですね。
あとはマイクロソフトのホームページですか。
う〜ん、WSHとしてのJScriptはあまりポピュラーじゃないみたいですね...

でもとりあえず色々勉強してみます。
ありがとうございました。

あさ さん 2003年 06月 20日 10時 06分 47秒


>yokaさんへ
頑張って下さいね(汗)
私は、ドライブ関係の情報を取得したことないので、これ!という答えは出せないです。申し訳ない(汗)
あ。で、でも、紹介したサイトはWSHではないので気をつけてね^^;;;

>ヒカリブシさん
Javaっすかぁ・・・WSHで使ってる紹介サイトは、確かに少ないかもですねぇ。
で。探して見ました。
http://www.usagi-js.com/
http://member.nifty.ne.jp/aya/
このあたりはどうでしょ?(私は見てません。笑)

>CORNELIUSさんへ
うーん。実は、レジストリもVBSでは触ったこと無かったり(汗)
RegDeleteで一括削除がダメなら、奥の階層から消していくしかないですね。
その辺のサンプル見てると、みんなそんな感じで削除しているようです。

もしくは、RunメソッドかExecメソッドで、外部プログラムを呼び出す形にするかですね。
(Windows2000以降の話になりますが)レジストリの編集なら、reg.exeというのがあります。それを使えば、一括削除できそうです。(未確認)
#W2KServerのリソースキットかサポートツールだったかも知れませんが(汗)

reg.exeの使い方はここにありました。
http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/prodtechnol/windowsserver2003/proddocs/entserver/reg.asp

もしくはフリーソフトで探すとか(^^;;;

>真琴さんへ
「インクルード」ですか(笑)
それをしたければ、呼び出し側の拡張子を「.wsf」にしないとダメかもです。

----------yobidasimoto.wsf----------
<job id="yobidasimoto">
<script language="VBScript" src="yobidasisaki.vbs"/>
<script language="VBScript">

'なんかいろいろ処理
Dim strMoji
strMoji = "テスト"

Call Hyouji(strMoji)

</Script>
</job>
------------------------------------
----------yobidasisaki.vbs----------
Sub Hyouji(strMoji)
Wscript.Echo strMoji
End Sub
------------------------------------
と。こんな感じでしょうか。(動作未確認)
いろいろ調べて見てくださいね。^^

>omさん?Tomさん?へ
えぇぇぇ〜とぉ・・・・
なぜに中途半端な書き込みを(汗)
しかも昨日だし(笑)

Return