お前ら、wsh使ってますか? part6 at WIN
[2ch|▼Menu]
1:名無し~3.EXE
06/08/08 21:41:13 hqaA5ks/
こんなことコンピュータにやらせろよ。そう思ったことはありませんか?
簡易的な実行環境も含めて普通のOSだったら当たり前に備わっている自動実行。
Windowsの標準に備わっているそれがWSH(Windows Script Host)です。
また、ここではWSHだけに限らずWMI、ADSIなどのネタもOKです。

・煽りや荒らしは無視の方針で。基本的にsage進行です。

・ここでヒントを得て完成したスクリプトは、出来れば皆さんにお披露目してください。
 同じことで悩んでいる人のためになります。

・質問する際は、OS及び使用するコンポーネントのバージョンもお忘れなく。

●過去スレ
#1 スレリンク(win板)
#2 スレリンク(win板)
#3 スレリンク(win板)
#4 スレリンク(win板)
#5 スレリンク(win板)

その他 >>1-10 あたり

2:名無し~3.EXE
06/08/08 21:42:04 hqaA5ks/
●便利なリンク
Windows Script
URLリンク(www.microsoft.com)
MSDN Library (オンラインドキュメント)
URLリンク(msdn.microsoft.com)
Windows Script 5.6 ドキュメント ダウンロード (exe 形式; 1.67 MB)
URLリンク(download.microsoft.com)
OLE/COM Object Viewer ダウンロード (exe 形式; 656 KB)
URLリンク(download.microsoft.com)

Sesame Script (スクリプト作成初心者向けコラム)
URLリンク(www.microsoft.com)
Hey, Scripting Guy! (スクリプトのQ&A・ハウトゥ集)
URLリンク(www.microsoft.com)
Windows管理者のためのWindows Script Host入門 (@IT内記事)
URLリンク(www.atmarkit.co.jp)
Windows XP に含まれるコマンドラインツールの紹介 (@IT内記事)
URLリンク(www.atmarkit.co.jp)
ADSI (Active Directory Service Interfaces) の特集記事全文
URLリンク(web.archive.org)

●個人サイト
Windows Script Wiki
URLリンク(winscript.s41.xrea.com)
趣味のJavaScriptなページ
URLリンク(homepage3.nifty.com)
Windows Scripting Host Laboratory
URLリンク(www.roy.hi-ho.ne.jp)
Tips - (小技にも満たない)微ワザ集
URLリンク(www1.u-netsurf.ne.jp)

3:名無し~3.EXE
06/08/08 21:42:58 hqaA5ks/
●コンポーネント関連リンク

○Microsoft 製外部コンポーネント
DCOM
(98/Me) URLリンク(www.microsoft.com)
(95)  URLリンク(www.microsoft.com)
MDAC - データベース・メールボックス・WebDAV・バイナリの操作
URLリンク(msdn.microsoft.com)
WMI(95/98/NT4.0) - 統一されたコンピュータオブジェクト化モデルを提供するスクリプティングAPI、リモート管理
URLリンク(www.microsoft.com)
ADSI - Active Dictoryの機能を操作
URLリンク(www.microsoft.com)
MSXML - XMLパーサ、SAX・DOM API、XSLT変換、POST/HTTPダウンロード
URLリンク(www.microsoft.com)

○サードパーティ製外部コンポーネント
BASP21 - メール、ファイルエンコード、文字コード変換、FTP/HTTPアップ、その他
URLリンク(www.hi-ho.ne.jp)
Doodle2 - グラフィック変換、操作、描画
URLリンク(www.vector.co.jp)
DynaCall - Win32APIコール
URLリンク(people.freenet.de)
AutoItX - マウス・キーボード・クリップボード操作
URLリンク(www.hiddensoft.com)

4:名無し~3.EXE
06/08/08 21:43:41 hqaA5ks/
●WSH(COM)参考書籍

「はじめてのWindows Scripting Host」 (株)アンク著 技術評論社
URLリンク(www.amazon.co.jp)

「[改訂版] VBScriptポケットリファレンス」
URLリンク(www.amazon.co.jp)

「使いながら覚えるWindows Scripting Hostプログラミング入門」 竹田英雄著 エーアイ出版
URLリンク(www.amazon.co.jp)

「Windows Scripting Host入門 with VBScript」 毎日コミュニケーションズ
URLリンク(www.amazon.co.jp)

「WSHで楽しむWindows95/98/NT4.0版 ウィンドウズ・スクリプティング入門 VBScript編」 メディアテック出版
URLリンク(www.amazon.co.jp)

「WSHクイックリファレンス」 羽山博著 オライリー・ジャパン
URLリンク(www.amazon.co.jp)

「Rubyを256倍使う本 邪道編」 arton著 ASCII
URLリンク(www.amazon.co.jp)

「ADSIスクリプトによるWindows2000システム管理 Windows2000管理者ガイドブック」ピアソン・エデュケーション トーマス・エック 著
URLリンク(www.amazon.co.jp) (どちらかというとVBによる操作本?)

「標準ASPテクニカルリファレンス」山田祥寛著 SOFTBANK
URLリンク(www.amazon.co.jp)

5:名無し~3.EXE
06/08/08 21:44:21 hqaA5ks/
●JavaScript、VBScript 以外のWSHで使える言語

TCLScript
URLリンク(tclscript.sourceforge.net)
Perl
URLリンク(www.activestate.com)
Ruby
URLリンク(www.geocities.co.jp)
Python
URLリンク(www.python.jp)
PHP
URLリンク(www.php.net)
REXX
URLリンク(www.borg.com)

6:名無し~3.EXE
06/08/08 21:47:19 hqaA5ks/
テンプレ終わり。なかったので立てました。
リンク切れ修正したり、簡潔にしたり、書籍をAmazonでまとめたり、色々追加したりしてみました。
まずかったらごめんなさい。

7:名無し~3.EXE
06/08/08 22:44:29 m2nJYuN9
やっと立ったか
>>1

8:名無し~3.EXE
06/08/09 02:18:52 HZLszs1m
おつりんこ


9:名無し~3.EXE
06/08/09 21:29:00 3ZEp9c5C
元ネタURLリンク(www.apple.com)

10:名無し~3.EXE
06/08/10 01:20:51 dgC59hri
そろそろ、大学入試に採用して欲しいものだ。

11:11
06/08/10 02:20:10 /7XeLnYy
こっそり。
連載って大変です・・・

12:名無し~3.EXE
06/08/10 11:10:30 QZ8c+eSn
>>11
ただの11に興味はありません。

13:名無し~3.EXE
06/08/13 11:50:50 41wVJTOD
「VBScrip逆引き大全 500の極意」 井川はるき著 秀和システム
URLリンク(www.shuwasystem.co.jp)

14:名無し~3.EXE
06/08/13 20:54:27 8j+UDFyv
ファイルをD&Dすれば、その配下に「2006年08月」の年月フォルダを作って
振り分けてくれるスクリプトはどこかにないですか?

15:名無し~3.EXE
06/08/13 21:14:49 mVE7+F6R
見当たらないものを作るのがこのスレ。とにかく書いてみろよ。

16:名無し~3.EXE
06/08/13 22:15:18 Th0qG/nU
簡単っぽいね

現在の年・月取得
→「y年m月」というフォルダがないなら作る
→引数のファイルをそのフォルダにコピーor移動

>>14
がんばれ

17:名無し~3.EXE
06/08/15 17:13:21 5toxITo3
本当にスクリプトで画面の解像度を変更できませんか

18:名無し~3.EXE
06/08/15 20:34:44 5SvS0Mip
>>17
WScript.exe自体の機能では出来ない。
そういう機能のあるCOMを探すか作るかすれば出来る。
WMIのWin32_DisplayConfigurationあたりでも出来るかもしれないが
面倒なので自分で調べて。

というか、コマンドラインから解像度変更するツールは確かあったから
そいつをWshShellのRunで呼ぶのが一番手っ取り早いかも。

19:名無し~3.EXE
06/08/18 02:23:11 huYxnQWS
IE7をCOMで扱うときの資料ってどこかにありますか? メソッド一覧とか。

自作のIE自動運転ツールで、CreateObject("InternetExplorer.Application")ってやって新規IEをいくつも立ち上げてるんですが、
IE7のタブ機能で、同じIEの新規タブを使うように変更したいんです。


20:名無し~3.EXE
06/08/18 03:20:19 huYxnQWS
あと、CreateObject("InternetExplorer.Application") みたいな感覚で、
FireFoxって扱えないのでしょうか?
どっかに資料があったら教えてください。

21:名無し~3.EXE
06/08/18 05:52:24 X3GM4s/3
前まで使っていたHTAがある日突然文字化けして使えなくなってしまいました。
拡張子をHTMLにすると文字化けも解消し、動作します
なんとか元通りHTAのまま動作するようにしたいのですが、なにが原因なんでしょうか
ちなみに他のHTAは文字化けしませんでした

22:名無し~3.EXE
06/08/18 06:09:17 Y6b9lzs3
>>21
<meta http-equiv="Content-Type" content="text/html; charset=****" />

を入れてみたら?****はshift_jis, EUC-JP, UTF-8など

HTAスレがありますよ
HTAをもっと流行らせる計画
スレリンク(tech板)l50

23:名無し~3.EXE
06/08/18 10:26:16 cwDh88nh
>>19
URLリンク(msdn.microsoft.com)

IE7は使ったことないから分からないけど
タブで開くには Navigate2で第2引数のフラグ(BrowserNavConstants)に
navOpenBackgroundTab = 0x1000を立てればいいんじゃないかな


24:名無し~3.EXE
06/08/18 10:27:46 cwDh88nh
ああ間違えた
navOpenInNewTab = 0x0800
でもいいね

URLリンク(msdn.microsoft.com)


25:名無し~3.EXE
06/08/19 21:40:24 Ax5AbTvR
789 名無し~3.EXE [sage] 2006/08/19(土) 13:35:26 ID:IAl43imz
MS06-023で指摘された脆弱性対応版ですかね?
バージョンは 5.6.0.8831

Windows 98、Windows Millennium Edition (Windows Me)、および Windows NT 4.0 用の Windows Script 5.6
※OS本体はサポート終了、しかも何故か→【要認証】
URLリンク(www.microsoft.com)
URLリンク(download.microsoft.com)

Windows 2003 用の Windows Script 5.6 【要認証】
URLリンク(www.microsoft.com)
URLリンク(download.microsoft.com)

簡単な説明
このダウンロードは、Visual Basic Script Edition (VBScript) Version 5.6、JScript Version 5.6、Windows Script Components、
Windows Script Host 5.6、および Windows Script Runtime Version 5.6 からなる Microsoft Windows Script をインストールします。

スレリンク(win板:789番)

26:名無し~3.EXE
06/08/26 08:36:17 7AZj00I6
バッチファイルの結果って、wsh からコピーできないんでしょうか。
Alt + Space を SendKeys してもメニューが出ないので、困ってます。
かなりぐぐったけど、結局できなかったって話しかないし。

-- 8< Login-FTP.bat 8< --
@echo off
TITLE FTP-Tool
ftp hoge
echo "FTP 終わったら [OK] をクリックしてください"

-- 8< FTPcopy.wsf 8< --
set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd.exe /k Login-FTP.bat", 1, false
MsgBox "[OK] をクリックしてください"
Do Until objShell.AppActivate("FTP-Tool")
WScript.Sleep 100
Loop
objShell.SendKeys "%({ }ES)%({ }EY)"
WScript.Sleep 100
Set objExec = objShell.Exec("notepad.exe")
Do Until objShell.AppActivate(objExec.ProcessID)
WScript.Sleep 100
Loop
objShell.SendKeys "%(EP)"
WScript.Sleep 100
objShell.SendKeys "%(FA)"
WScript.Sleep 500
objShell.SendKeys "FTP.log"

27:名無し~3.EXE
06/08/26 09:21:16 NGHbsPUz
>>26
Run じゃなくて Exec を使う。
WshShell.Exec の返り値として WshScriptExec のオブジェクトが返ってくるから
その StdOut を読めばいいよ。

28:26
06/08/26 11:18:57 7AZj00I6
>>27
サンクス! 全然考えてなかったやりかたでした。

試しました・・・ら、かんじんの FTP 処理がコマンドプロンプト上で
入力できないんですね・・・。
WSH から標準入力としてコマンドを送りつければよいのでしょうが、
FTP を自由に使いたいのでそういうわけにも行かず・・・。

うーむ・・・。
標準入力だけは WSH を経由しないようにできないものか・・・。


29:26
06/08/26 11:31:17 7AZj00I6
あ、標準入力っていうか、普通にコマンドプロンプト上で操作できて、
その後で Exec の結果を取得できなくちゃいけないのか。

・・・できそうにないな・・・。

30:名無し~3.EXE
06/08/26 12:03:52 X5Z8XRwb
出来ることをできそうにないとか言って諦めきれるならやらなきゃいいさ。
諦めきれないなら調べるなり試行錯誤するなりすればいいさ。

それが出来ないと本当に困るという状況で必死になってるなら自分で解決まで
這い蹲ってでも辿り着くだろうし、解決できないなら出来なくてもたいして困らないから
必死になりきれてないだけ。本人が別に解決しなくてもいいや程度に考えてるなら
俺等が手を掛けることでもないし、これ以上教えることは何も無さそうだな。

31:26
06/08/26 12:23:05 7AZj00I6
いや、まだやってますけど・・・。

32:名無し~3.EXE
06/08/26 22:54:38 caN/FdXT
HTAって、背景透過できない?

33:名無し~3.EXE
06/08/26 23:22:22 NGHbsPUz
このスレ的な回答なら COM を作ればできる かな。

34:名無し~3.EXE
06/08/27 18:11:11 iJpflacd
難しいそうでつね。

35:19
06/08/27 23:34:30 7+PWpyeP
>>23-24
情報感謝です。そんなIE7を反映した資料があるの、全然知らなかった。

複数サイトに対して自動巡回をするため、これまでは
CreateObject("InternetExplorer.Application") でIEをいくつも立ち上げてたんですが、

・IEインスタンスが存在しない→
  ・CreateObject("InternetExplorer.Application")
  ・それに対してNavigate2 URL (これまでどおりの処理)
・IEインスタンスが存在する→
  ・インスタンス取得
  ・それに対してNavigate2 URL, navOpenInNewTab
  ・新規タブで作った新インスタンスを取得、それに対して巡回操作

こう改造することで、1つの窓の複数タブにまとめることができました。
縮小表示で複数の巡回を一覧できて快適です。

ただし、IE7beta3がめちゃめちゃ落ちやすい罠。実用にはちょっと厳しいです。
いっぺん落ちるとDOM関係の内部構造がぐちゃぐちゃになるらしく、
IE7を再起動してもDHTML要素が取得できなくなります。
タスクスケジューラでexplorer.exeを全部殺して立ち上げなおすと、なぜか治る。
あと、普通に使ってても、Formで日本語入力できなくなったりすることがやたら多い。

9月のIE7正式版登場までには、もうちょい使い物になるようになってくれないと…。


36:26
06/08/29 01:28:54 o0XsAnyT
Alt + Space を SendInput する .exe を作って
wsh から呼び出すことにして解決しましたです。

37:名無し~3.EXE
06/09/03 02:10:24 9m7JaXWT
フォルダAにあるファイル全てと(サブフォルダ内のファイルを含む)
フォルダBにあるファイル全てを(サブフォルダ内のファイルを含む)比較して
同じファイル名のものがあれば、フォルダAのファイルをフォルダBのファイルに
上書きしたいのですが、どのような繰り返し処理を行えばいいのかわかりません。
初歩的な質問で申し訳ないのですが、どなたか参考になるご意見を聞かせて下さい。

38:名無し~3.EXE
06/09/03 02:23:00 M/8yjKeF
まずFileSystemObjectを使ってフォルダAにあるファイル全てを列挙して
配列(または連想配列)に入れておく。
あとはフォルダBのファイルを1つずつ調べていき、配列に同じ名前があれば
フォルダAのファイルを上書きコピーすればいいんじゃない?

列挙→GetFolder + Files 辺り
上書きコピー→CopyFile もしくは GetFile + Copy 辺り

39:37
06/09/03 23:36:27 9m7JaXWT
>>38
レスありがとうございます。
参考書片手に四苦八苦していたところに
ヒントを頂けて大変助かります。
早速試してみますね。

40:名無し~3.EXE
06/09/04 00:42:41 4RNTB77S
念のため言っとくと、GetFolder + Filesの列挙処理は、再帰的にな。
下層フォルダもぜんぶ処理対象にするためには。
もしわかんなきゃ「再帰」をキーワードに入れてぐぐること。

41:名無し~3.EXE
06/09/04 16:42:27 QYJv5P/p
JScriptからフォルダ共有の解除を行いたいと考えているのですが、外部からアクセスされている場合、
「この操作を続行しますか? (Y/N) [N]:」ってプロンプトが表示されてうまく動きません。
調べた感じでは標準入力(StdIn)に"Y"って送ってあげれば良い気がするのですが、うまく動いてくれません。
私が作ったjsファイルの内容は...

var WShell = WScript.CreateObject("WScript.Shell");
var objNet = WShell.Exec("net share Share /DELETE");
while (!objNet.StdOut.AtEndOfStream)
{
var strLine=objNet.StdOut.ReadLine();
var nPos=strLine.indexOf("この操作を続行しますか?");
if (nPos>=0)
{
objNet.StdIn.WriteLine("Y");
}
}

ちなみに誰も使用していない場合はちゃんと共有が解除されます。
対象はWindows2000 Serverです。
どうすればうまく動くようになりますか?
教えてエライ人!

42:名無し~3.EXE
06/09/06 02:31:02 6VRM8O2+
WShell.Exec("cmd /c echo y | net share airplane /DELETE");

あーあ、なんだよこの旧世代プログラマがやりそうな力技は
こんなことを考えついて試してしまう自分が嫌だ


43:名無し~3.EXE
06/09/06 03:14:37 W4o+AU9u
>>42
なるほどw パイプ便利だな

44:名無し~3.EXE
06/09/06 03:46:18 mG/64ktE
むしろ当然の解決策だと思った

45:名無し~3.EXE
06/09/06 08:24:38 Z523kT6K
stdinを読んでるわけでないようだから>>42もうまくいかない

46:41
06/09/06 11:01:06 B7U19HoE
>>42,43,44,45
レスありがとうございます。
wktkしながら試しましたが私の環境ではダメでした... (´・ω・`)
なんでだろうな...

47:名無し~3.EXE
06/09/07 00:01:08 Sux4zrox
>>46
var prc = GetObject("winmgmts:{impersonationLevel=impersonate}")
.ExecQuery("SELECT * FROM Win32_Share");
for ( var e = new Enumerator(prc); !e.atEnd(); e.moveNext() ) {
var sd = e.item();
if ( sd.Caption == "Share" ) sd.Delete();
}

48:47
06/09/07 00:02:48 7NNz2Yc3
しまった。プロセス操作のヤツからコピペしたから変数名が変だ。

49:名無し~3.EXE
06/09/07 10:45:44 EZRTppgw
>>47
同様のスクリプトを作ってやったことあるけれど
誰かが共有フォルダにアクセスしていると共有解除されないような


50:41
06/09/07 11:25:34 kklWKgcq
>>47
レスありがとうございます。
試したところ無事動作しているみたいです!
もしやあなたはネ申でつか。
...WMIは色々使えそうですね (. .)〆

>>49
簡単にやってみたところ大丈夫そうです。
もう少し色んなケースを試して見たいと思います。

PS.
レスくれた方々ありがとうございます。


51:名無し~3.EXE
06/09/12 17:21:16 6aj+7wdR
指定したフォルダのmp3ファイルをランダムで実行したい。

Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "C:\MP3\*.mp3",3,true

これじゃエラー出るんだけど何故?この場合ってワイルドカード使えない?

52:名無し~3.EXE
06/09/12 17:22:50 8qFdY5Hd
    _, ,_  パーン
 ( ‘д‘)  
   ⊂彡☆))Д´) 

53:名無し~3.EXE
06/09/12 17:47:46 A3UEU+1f
*はランダムではない。
任意の文字列という意味。
Runの引数にワイルドカードなんて認められてない……はず。

ランダムで実行したかったら
すべてのファイルパスを配列にぶちこむ

Rndとかでファイル数以下のランダムな整数作る

それをインデックスにしてファイル実行する




54:名無し~3.EXE
06/09/12 19:29:56 5GCyJ/an
var WSHShell = WScript.CreateObject("WScript.Shell");
var Fso = new ActiveXObject("Scripting.FileSystemObject");
// .mp3ファイル名をmp3[]配列に格納
var folder = Fso.GetFolder("C:\\MP3");
var mp3 = [];
for (var e = new Enumerator(folder.Files); ! e.atEnd(); e.moveNext()) {
    var f = e.item();
    if (/\.mp3$/i.test(f))
        mp3.push(f);
}
var i;
do {
    // ランダムに並べ替え
    for (i = 0; i < files.length; i++) {
        var r = Math.floor(files.length * Math.random());
        var t = mp3[i];
        mp3[i] = mp3[r];
        mp3[r] = t;
    }
    // プレイ
    for (i = 0; i < files.length; i++)
        WSHShell.Run(mp3[i], 3, true);
} while (true); // trueで無限ループ

55:名無し~3.EXE
06/09/12 19:41:04 jll2Gkhp
WSHで、既に作成されているExcelファイルを開き、そこにある
イメージコントロールに画像を表示させるにはどうしたら良いの
でしょうか?

Option Explicit
Dim objExcel
Dim objExcelBook
Dim objExcelSheet

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objExcelBook = objExcel.Workbooks.Open("D:\Book1.xls")
Set objExcelSheet = objExcelBook.Worksheets(1)

objExcelSheet.cells(1,1).value = "aaa"
objExcelSheet.Image1.Picture = LoadPicture("D:\test.jpg")

objExcel.Quit
Set objExcelSheet = Nothins
Set objExcelBook = Nothing
Set objExcel = Nothing

を実行すると、A1に"aaa"が入る所までは良いのですが、LoadPictureの
行で「致命的なエラーです」が出てしまいます。
おそらく、Image1の指定方法に問題があるかと思うのですが、具体的な
指定方法または、それについて記載されているURLなどを教えて頂けない
でしょうか?

56:名無し~3.EXE
06/09/12 20:01:14 5GCyJ/an
>>54
× files.length
○ mp3.length
です

57:51
06/09/12 23:16:11 rMXBUJr8
>>53
>>54
サンクス。動作は確認できたが、出来ればWSHで書いて欲しかった。javascriptはウヴォア

58:名無し~3.EXE
06/09/12 23:30:42 5MYDPybn
WSH は VBScript だけのもんじゃないよ?

59:名無し~3.EXE
06/09/12 23:36:25 muCQp/dj
JavaScriptもPerlもRubyもPythonも。

60:名無し~3.EXE
06/09/13 00:08:35 ry6CWKuK
あーそうなのかー
無知ですまぬ

61:名無し~3.EXE
06/09/13 10:17:38 74VYdgSO
>>55
> おそらく、Image1の指定方法に問題があるかと思うのですが、
問題ないよ。試しにその前で
MsgBox TypeName(objExcelSheet.Image1)
ってやってみな。これで「Image」が返るなら、正しくImageオブジェクトを参照出来てる。

問題があると言えば、objExcel.Quitの前にobjExcelBook.Closeが必要なのと
Set objExcelSheet = Nothingの、Nothingのスペルが間違ってることくらいだが
エラーが出ている部分は問題なし。おそらく間違ってるのではなく、仕様として出来ないんだろうね。
Picture = LoadPictureをブックのVBAモジュールに書いて、VBSからそのプロシージャを読んでみれば?
画像のパスはVBS側で指定することも可能だし。

62:55
06/09/13 11:01:41 P4go6OWL
>>61
御回答ありがとうございます。

> MsgBox TypeName(objExcelSheet.Image1)
> ってやってみな。

 こうすれば、オブジェクトの確認が出来るんですね。
 やってみた所、「Image」と表示され、参照方法には問題が無かった様です。

> 問題があると言えば、objExcel.Quitの前にobjExcelBook.Closeが必要なのと
> Set objExcelSheet = Nothingの、Nothingのスペルが間違ってることくらいだが

 そこに行く前に、エラーで止まっていたので気付きませんでした。

> おそらく間違ってるのではなく、仕様として出来ないんだろうね。

 御指摘の方法等を含め、別の方法を検討してみます。

63:55
06/09/13 20:42:40 8lTHFtaw
>>61
御指摘の通り、Excel側にVBAを仕込み、VBS側から実行したら画像の表示が出来ました。

やった事は、

1. Module1の下に、下記の様なマクロを仕込む。

Sub Macro1()
Worksheets("Sheet1").Image1.Picture = LoadPicture("D:\test.jpg")
End Sub

2. VBS側のLoadPictureの行を下記の様に変更

objExcel.Run ("Book1.xls!Module1.Macro1")

です。

Macroの実行方法が分からなかったのですが、
URLリンク(suiten.wig.nu)
が参考になりました。

今回は、ありがとうございました。

64:名無し~3.EXE
06/09/14 23:27:15 XRemmWNN
VBScriptから別のVBScriptを呼び出すことはできますか?
あとユーザライブラリの関数を呼び出す的なことをしたいのですができますか?
一度作った関数をコピペするのが面倒で。
よろしくお願いします。

65:名無し~3.EXE
06/09/14 23:36:11 6COp2u2i
ファイル読み込んで Eval
後者は意味が良く分からんが ユーザライブラリって何?

66:名無し~3.EXE
06/09/14 23:40:30 8WXwarb4
外部のスクリプトを読み込みたいんでしょ
wshなら素直に.wsfファイル作って、

<package>
<job>
<script language="VBScript" src="外部スクリプト1.vbs" />
<script language="VBScript" src="外部スクリプト2.vbs" />
<script language="VBScript" src="メイン.vbs" />
</job>
</package>

67:名無し~3.EXE
06/09/15 00:22:29 MxvWsxE+
あとついでに、ライブラリはクラス化すると吉。
VBScriptのクラス機能って存在感なさすぎて忘れがちだけどね。


68:名無し~3.EXE
06/09/15 00:49:05 6z+vLxyz
>>65,66,67
ありがとです。外部スクリプトの呼び出しは最初
Set obj = WScript.CreateObject("WScript.Shell")
Set obj2 = obj.Run("RunNotepad.vbs")
ってやってWin32オブジェクトじゃないって怒られたんですが、2行目を
obj.Run "RunNotepad.vbs"
で出来ました。いろんなやり方があるようですね。
ライブラリはクラス化して中にメソッド書けばいいのですかね?
いや、皆さん作られた関数をどうやって再利用されているのかと思いまして。

69:名無し~3.EXE
06/09/15 00:50:34 1e9FhoNf
コピペさ

70:名無し~3.EXE
06/09/15 00:54:36 3qVVhzeE
wsh で使うようなのは書き捨てが基本だな、私は。
String とか Date とか Number とかの prototype にいくつかメソッドは突っ込んでるけど(JScript)。

71:名無し~3.EXE
06/09/15 01:49:36 hZMJWHVe
wshしこしこ書くのとドトネトでアプリ作るのと
作業量が大して変わらないことに最近気付いた

72:print.vbs
06/09/17 03:36:23 pIeGPZjs
ファイルをまとめて印刷するツールです。
'Print files

Option Explicit

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

Dim ws
Set ws = CreateObject("WScript.Shell")

Dim argv,file,name,ret
Set argv = WScript.Arguments

Dim tpad,i,code

If argv.Count > 0 Then
For Each file In argv
If Fs.FileExists(file) Then
name = Fs.GetFileName(file)
Set tpad = ws.Exec("C:\Free\TPad\TeraPad.exe """ & file & """")
WScript.Sleep 100
i=0
Do
ret = ws.AppActivate(tpad.ProcessID)
WScript.Sleep 100


73:print.vbs
06/09/17 03:38:27 pIeGPZjs
i=i+1
If i>100 Then
MsgBox "Activate 失敗 print前"
WScript.Quit
End If
Loop While ret = False
ws.SendKeys "^pp"
WScript.Sleep 5000
i=0
Do
ret = ws.AppActivate(tpad.ProcessID)
WScript.Sleep 100
i=i+1
if i>100 Then
MsgBox "Activate 失敗 print後"
WScript.Quit
End If
Loop While ret = False
tpad.terminate
set tpad = Nothing
Else
MsgBox file & "というファイルは存在しません。"
End If
Next
Else
MsgBox "ファイルをD&Dしてください"
End If


74:print.vbs
06/09/17 03:56:30 pIeGPZjs
ソースが無駄に長くてすみません。そういう書き方がしみ付いているもので

前スレまであったソースアップ板は、無くなったのでしょうか?

使い方は、印刷したいファイルをドラッグ&ドロップするつもりで作ったのですが、
過去スレを読みなおして見るとSendToで使うほうが便利そうです。

中でteraPadを呼び出しています。(作った当時使っていたエディタだったので)
sendkeysで操作しているだけなのでそういう操作ができるほかのエディタ用にも書きかえれると思います。

一応私の環境(Win98)では、3,4ページのファイル4,5個は、まとめて印刷できました
あまり大きなファイルを印刷するには、むいていないと思います。

まだあまり、wshにはなれてなくて、マニュアルを見ながら作りました。
sleepの値などもいいかげんで、その辺も含めて添削していただいたらありがたいです。

75:名無し~3.EXE
06/09/17 10:41:23 GAjliUIS
プリントアウトはFileSystemObjectを使って出来たはず、と思って
URLリンク(www.microsoft.com) を参考に
こんなん書いてみたけど、エラーは出ないのにプリントアウトできない。なんで?
\\MyPC\BJF9000 はUSBポートに接続したプリンタで、共有してます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var objWSHNet = new ActiveXObject("WScript.Network");
objWSHNet.AddPrinterConnection("LPT2:", "\\\\MyPC\\BJF9000");
var printer = fso.CreateTextFile("LPT2:", true);
try { printer.Write("printout test");} catch(e) {;}
printer.Close();
objWSHNet.RemovePrinterConnection("LPT2:");

76:print.vbs
06/09/17 14:54:53 pIeGPZjs
>>75

AddPrinterConnection
リモートの MS-DOS ベースのプリンタ接続をコンピュータ システムに追加します。

ちょっと前、メーカーに
「プリンタ(CANON PIXUS 550i)をMS-DOSで使えるようにできるかどうか」たずねたところ、
「MS-DOSで使えるようにはできない」という回答でした。
多分私の環境では、このスクリプトは使えないと思います。

77:名無し~3.EXE
06/09/17 15:50:48 8OXBNlvH
WshScriptExec オブジェクトについて質問させてください。

var sh = new ActiveXObject("WScript.Shell");
var exe = sh.Exec("cmd.exe /c dir");
while (exe.Status == 0) { WScript.Sleep(100); }
WScript.Echo("完了");
if (!exe.StdOut.AtEndOfStream) { WScript.Echo("出力結果\n" + exe.StdOut.ReadAll()); }

上記のスクリプトで "cmd.exe /c dir" を実行して結果を取得しようとしています。
しかしファイル数の多いフォルダではいつまで待っても (exe.Status == 1) になりません。
どうやら StdOut の容量制限があり、Read されるまで実行が止まってしまうようです。

(exe.Status == 1) を待たずに StdOut.ReadAll() をすればすぐに終了するのですが
StdOut.ReadAll() は、EOFまで(プログラム終了まで)帰ってきませんので
実行待ちの間に Terminate() したりすることができなくなってしまいます。
StdOut.Read() も入力があるまで待つので使えません。

良い解決策はないでしょうか?

78:名無し~3.EXE
06/09/17 16:36:09 RpCl687c
>>77
こういうふう(↓)にはしたくないってことかな

var sh = new ActiveXObject("WScript.Shell");
var exe = sh.Exec("cmd.exe /c dir");
var dir = [];
while (! exe.StdOut.AtEndOfStream) { dir.push(exe.StdOut.ReadLine()); }
WScript.Echo("完了");
WScript.Echo("出力結果\n" + dir.join("\n"));

それなら、こういうのは?

var sh = new ActiveXObject("WScript.Shell");
var dirfile = "dir.txt";
var exe = sh.Exec("cmd.exe /c dir > " + dirfile);
while (exe.Status == 0) { WScript.Sleep(100); }
WScript.Echo("完了");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile(dirfile);
WScript.Echo("出力結果\n" + f.ReadAll());
f.Close();

79:目民 ◆xQYoLwVGxQ
06/09/17 16:41:19 oMWuro07
まぁ、>>78と同じだけど。

var sh = new ActiveXObject("WScript.Shell");
var exe = sh.Exec("cmd.exe /c dir");
var str = "";
while (!exe.StdOut.AtEndOfStream){
    str += exe.StdOut.ReadLine() + "\n";
}
WScript.Echo("完了");
WScript.Echo("出力結果\n" + str );

ファイルの多いフォルダで実行してみると、最後の一行に異常に時間がかかるね。
実用的側面からは、単にファイルにリダイレクトするのが早いと思う。

80:77
06/09/17 17:30:31 8OXBNlvH
>>78-79様ありがとうございます。

最終的には hta でつかおうと思ってるんですが
StdOut.ReadLine(), Read(),ReadAll() を使うと出力待ちの間、どうしても画面がフリーズしちゃうんです。
出力がない時は StdOut.AtEndOfStream が true になってくれればいいのですが・・・

あんまりファイルに書き出したくないのですが、やっぱそうするしかないでしょうか。

81:目民 ◆xQYoLwVGxQ
06/09/17 17:52:05 oMWuro07
>>80
while (!exe.StdOut.AtEndOfStream){
    str += exe.StdOut.ReadLine() + "\n";
    // ココで必要な処理
}
じゃ、ダメなの?


82:77
06/09/17 18:24:19 8OXBNlvH
>>81
そこで Sleep() や setTimuout() しちゃうと 時間がかかりすぎるし
どっちにしても ReadLine() のところで止まっちゃうので・・・

あ、すいません。実際には dir だけじゃなくて時間のかかるコマンドも使いたいと思ってます。

83:名無し~3.EXE
06/09/17 18:30:11 DkiP0mWC
>>77
URLリンク(www.vector.co.jp)
URLリンク(www.vector.co.jp)


84:目民 ◆xQYoLwVGxQ
06/09/17 18:32:31 oMWuro07
>>82
なるほど〜。
やっぱり、ファイルに書き出すのがいいと思うよ。

85:77
06/09/17 20:06:55 8OXBNlvH
ファイル使うことにします。わがまま言ってすみません。
しかし >>83 すごいですね。
これだけ苦労されてるということはやっぱ簡単な方法はないということですね。

86:名無し~3.EXE
06/09/18 16:03:23 0Yyqe12A
>>77
HTAなら、これも。
URLリンク(www.vector.co.jp)


87:dir_+w.vbs
06/09/18 21:14:02 TkVYNr1Z
フォルダを再帰的に検索して中のファイルを書きこみ可能にする

' chmod +w **

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

Sub FileRW(filespec)
Set f = fso.GetFile(filespec)
ReadOnly=1
If f.attributes and ReadOnly Then
f.attributes = f.attributes - ReadOnly
End If
End Sub

Sub FolderRW(filespec)
Set subf = fso.GetFolder(filespec)
For Each FileName In subf.Files
FileRW(FileName)
Next
For Each FolderName In subf.Subfolders
FolderRW(FolderName)
Next
End Sub


88:dir_+w.vbs
06/09/18 21:14:40 TkVYNr1Z
Set argv = WScript.Arguments
If argv.Count <= 0 Then
Wscript.Echo "ファイルをD&Dしてください"
WScript.Quit
End If
For Each file In argv
If fso.FolderExists(file) Then
FolderRW(file)
ElseIf fso.FileExists(file) Then
FileRW(file)
Else
Wscript.Echo file & "というファイル・フォルダは存在しません。"
End If
Next
Wscript.Echo "書きこみ可 終わり"


89:dir_+w.vbs
06/09/18 21:21:50 TkVYNr1Z
こんなのwshで書かなくても標準のやり方があるのでしょうか?

いろいろなところのサンプルプログラムをつぎはぎして作ったので自信がないです。
特にBASICでの再帰呼び出しが。
間違いや他のやり方があったら指摘してください。

一応自分で動作チェックした限りは正常に動いているみたいです。

90:名無し~3.EXE
06/09/18 21:35:28 IGnQYkUN
attrib /s -r *.*

91:名無し~3.EXE
06/09/18 21:35:41 1rgAgV0s
attrib -r %1 /s /d

92:89
06/09/18 22:13:54 TkVYNr1Z
>>90 >>91
試してみたのですが、うまくいきません。
win98ではできないんじゃないでしょうか

93:名無し~3.EXE
06/09/18 23:23:17 j9Uaecc1
cygwinでchmod -R +w でできないかな?

94:名無し~3.EXE
06/09/19 03:10:53 +HpwiHbO
>>92
できる。コマンドプロンプト開いて attrib /? してみ。

95:名無し~3.EXE
06/09/19 03:26:44 X9V4Hq4y
>>93
UnxUtils の chmod でできました。

cygwin は、昔入れて日本語化するだけで一週間ぐらいかかっていたような気がするので
とりあえずパス

>>92は、今から試します

96:名無し~3.EXE
06/09/19 03:30:30 PvS6FX5U
システムついてると一緒に指定しないと外せなかったりとか
変な規制がついてるよね。あととりぶ

97:名無し~3.EXE
06/09/19 03:39:25 X9V4Hq4y
>>94
attrib /? を行うとフォルダも受け付けるようなニュアンスなんですが、
実際に試してみるとファイルは受け取るけど、フォルダはだめみたいなんですが?

98:77
06/09/19 12:50:31 PvS6FX5U
>>86
どうもです。

すれ違い気味(htaねた)でわるいけど、
Exec() の代わりに Run()を使ったら実行中でもhtmlがフリーズしないことがわかった。

これってJavaScriptでマルチスレッドみたいな動作だけど、普通に使ってても大丈夫なのかな?

99:名無し~3.EXE
06/09/20 14:48:55 NLxtOcqj
98の頃のバッチファイルを見つけた。

ffind . -attr dh | xargs attrib -h

ATTRIBでディレクトリを操作するときは1個ずつでないと駄目なようだ。
ffindもxargsも外部ツールなので、OS標準コマンドだけでは一括は無理だったのかも。


100:名無し~3.EXE
06/09/24 22:24:37 zXp/H8j6
ネット株取引でEトレを使っていますが
wsh で自作した便利なツールがあれば、ただで暗号化しないでクレ。

101:名無し~3.EXE
06/09/25 02:23:37 VGXX8PLt
見積もりは無料ですよ?

102:名無し~3.EXE
06/09/26 20:51:06 OGK5SGUc
作ってもらうほどではないので退散します。

103:名無し~3.EXE
06/09/28 13:45:46 P5EUWFW0

Windows Script File( .wsf )についての質問です。OSはWinXP SP1。
wsfは
<script language="VBScript" src="パス"/>
と定義すると、src属性値で指定したパスのファイルを参照できますが、
特定のディレクトリに置いたvbsを、別のディレクトリに置いたwsfから
ファイル名のみで参照する方法を教えてください。

相対パスが使えるので、同一ディレクトリに置けば、ファイル名のみで参照可能ですが
別ディレクトリの場合は、もちろんそのままではファイル名のみでの参照は出来ません。
パスを通せば出来るかとも思ったのですが、パスを通してもダメでした。
(WshShell.Runではファイル名だけで呼べるので、パスがきちんと通っているのは間違いないのです。)
参照するvbsを置くディレクトリは固定ですが、wsfは別ドライブに置く可能性もあるし
作成後、移動する可能性もあります。wsf、vbs側では、もう出来ることは無いので、
後はOS側の設定になると思いますが、どこをどのようにすれば解決するかが解りません。
どうかご教示願います。


104:名無し~3.EXE
06/09/28 16:34:28 H6IHIklM
htmlと同じ要領でいいんじゃないの?

test1.wsf
└testfolder
  └test2.vbs
って配置した時、

testfolder/test2.vbs
or
./testfolder/test2.vbs
でパスを指定したら動いたぉ

105:名無し~3.EXE
06/09/28 16:37:36 H6IHIklM
ごめん、ちゃんと読んでなかった
wsfはいろいろ動かすのね
誰かまかせた

106:目民 ◆xQYoLwVGxQ
06/09/28 17:31:22 McUJ8oIU
>>103
"VBSDir"みたいなユーザー環境変数を作って、
(システムのプロパティ→詳細設定タブ→環境変数(XPの場合))

var WshShell = WScript.CreateObject ("WScript.Shell");
with( WshShell ){
    CurrentDirectory = ExpandEnvironmentStrings("%VBSDir%");
}

とか?

// VBSの話なのにJScriptだけど気にしないでw

107:名無し~3.EXE
06/09/29 15:56:35 KPftmCI3
>>103
WSCを使う。

108:名無し~3.EXE
06/09/29 16:18:18 KPftmCI3
>>72
terapadには/pがないのかと思ったらあるじゃないですか。
terapad.exe /p
じゃ駄目なの?


109:103
06/10/01 11:02:53 WUxruDIK
>>106
残念ながらダメでした。
ご教示いただいたものを参照を書いてる行の前に入れても、
job分けしても、コードが実行される前に参照が評価されてしまうようで
ファイルが見つからないというエラーが出ます。

>>107
現在いくつか使ってます。
しかしwscは>>103の条件を満たしていません。なぜならwscは1ファイル単位の登録が必要で、
「特定のディレクトリに置いた」もの全てに対して有効になるようなものではないからです。
レジストリを使うのは全く構いませんが、「特定のvbs」ではなく「特定のディレクトリに置いたvbs」に
有効な方法をお願いします。
特定のディレクトリに置いた物を個別登録無しで使える方法があるならwscでも構いませんが。



ということで、ご回答には感謝しますが解決には至っておりませんので引き続き宜しくお願いします。


110:名無し~3.EXE
06/10/01 11:27:13 Mjb4Qp/j
ディレクトリさえ分かったならあとはファイル読み込んで Eval で評価すれば良いじゃん?

111:名無し~3.EXE
06/10/01 12:27:11 kCPKYKBO
wscの中に
<script language="VBScript" src="パス"/>
を並べて、
wsfからは、
wsc.メソッド名
で呼び出せ。
という意味だったけど通じなかった?
getobject("script:wscのフルパス")ならレジストリは不要だけど、これはどっちでも。


112:名無し~3.EXE
06/10/01 16:52:54 kCPKYKBO
>>75
form feed \f を送るとか。


113:名無し~3.EXE
06/10/02 04:29:12 +WL/W97H
>109
ここで究極の選択。スクリプトで wsf ファイルを書いて実行。

114:名無し~3.EXE
06/10/02 19:14:34 bWQ93X+m
すいません。知ってたら教えて頂きたいんですが
WScript.CreateObject(strProgID[,strPrefix])
などで作成したオブジェクトのプロパティやメソッドを調べる方法ご存知の方いますか?

115:名無し~3.EXE
06/10/02 19:19:41 9vzbPfN/
URLリンク(www.google.com)

116:名無し~3.EXE
06/10/02 20:00:19 kbswuek+
>>111
wscの<script>にsrc属性が使えるなんて初耳だけどできるの?
仕様的に他のファイルに実装を書けるとは思えんのだが

117:名無し~3.EXE
06/10/02 20:21:15 V60uXU1H
>>114
URLリンク(www.vector.co.jp)


118:114
06/10/02 21:36:01 bWQ93X+m
>>115,117
私の探し方が足りなかったみたいですね
解決しました、ありがとうございます

119:名無し~3.EXE
06/10/06 21:09:26 e+UOKJbW
DynaCallにEnumWindowsのサンプルがついてますが、
これを参考に特定文字列を含むウインドウにメッセージを送るってのを作ったのだけど、
なんかClassなのに変にグローバルになってて、どれをどう再利用できるのかよくわからんのです。
うまくカプセル化できませんか?

120:名無し~3.EXE
06/10/06 22:28:17 drRRZZ4o
日本語でおk

121:名無し~3.EXE
06/10/14 17:33:06 COmDsoWy
hosyu

122:名無し~3.EXE
06/10/14 22:13:32 kOCNeboH
DOS窓から行う作業があったので、wscript.execにやらせようとしているのですが、DOS窓では数秒で完了するコマンドがexecでは動作中のまま帰ってきません。
動くコマンドと動かないコマンドがあったりするのでしょうか?
ちなみに動かそうとしているのは業務用のソフトです

123:名無し~3.EXE
06/10/14 22:27:57 3YNrV18h
そもそも WScript オブジェクトに exec メソッドなんて無かったような気がするのだが。
何を以て返ってこないと判断したのか分からんし。

124:名無し~3.EXE
06/10/14 22:52:54 kOCNeboH
WshScriptExec の間違いでした
DOSだとすぐ出力結果のファイルが出来るんですが、WshScriptExecだと黒いウィンドウが開いてそこから進まないです

125:名無し~3.EXE
06/10/15 00:23:27 0zheqdL0
プロンプト画面に何も出力されないのは仕様。
WshScriptExec オブジェクトは StdIn / StdOut プロパティ使って入力したり出力受け取ったりする。
MSDN にサンプルコードも多分あるだろ。
進まないってのは入力待ちしてるんじゃね?

126:名無し~3.EXE
06/10/15 00:44:16 bYSqBt4L
>>122
以下のVBSスクリプトが参考になるかも。

Option Explicit
Dim ws,i
Set ws = CreateObject("WScript.Shell")
i = ws.Run("%COMSPEC% /C DIR C:\ > C:\sample.log" , 1, true)
ws.Run "NOTEPAD C:\sample.log" , 1, true
Set ws = Nothing
WScript.Quit(i)

127:名無し~3.EXE
06/10/15 21:08:26 Tn/lrPJD
私も122さんと同様にDOSの業務用ソフトをwshで動かそうとしているのですが、
以下の部分が分からず困っています。便乗して質問させてください。

動かそうとしているDOSの業務ソフトは実行するとメニューが出力され
メニューから番号を選択して、出力ファイルを得るものなのですが、
番号の選択を自動化したいと思い、「入力=」が表示されたら、
Sendkeysをしようと以下のようなvbsを作成したのですが、
Exec メソッドがプログラムの実行終了後に行われるため、
業務ソフトが終了するまで、StdOutが取得できず困っています。


Set ws = CreateObject("WScript.Shell")
Set wsExec = ws.exec("業務ソフト.exe")

Do Until wsExec.StdOut.AtEndOfStream
If InStr(strLine,"入力=") <> Then
wsExec.Sendkeys.("1")
End If


Loop


メニューが出力されるDOSをwshから操作する良い方法がありましたら
教えてください。

128:名無し~3.EXE
06/10/15 21:21:46 ZvvyBgQg
StdIn 使えばいいんじゃね?
と思ったが GUI アプリか? それにしちゃ StdOut 読んでるよな。
つか strLine が書き変わってないようだが。

> Exec メソッドがプログラムの実行終了後に行われる
の意味が分からん。

129:名無し~3.EXE
06/10/15 22:05:37 Qx1lq3WL
strLine = wsExec.StdOut.ReadLine は要らないの?
InStr(strLine,"入力=") > 0 じゃないの?
SendKeys と ("1") の間にある . は必要なの?

ごめん、VBScriptはあんまわかんないけど、これは明らかに動くわけないよね。

130:127
06/10/15 22:08:50 Tn/lrPJD
>>128さん
127のvbsを実行すると、DOS窓で黒いウィンドウが開いた状態で業務アプリが
入力待ちになったまま止まってしまいます。
StdOutが出来ているかを確かめるために、127のIf文を以下のように書き換えて
実行しました。

If InStr(strLine,"入力=") <> Then
  WScript.Echo strLine
End If

DOS窓で黒いウィンドウが開いた状態で業務アプリが入力待ちになり、
ずっと止まったままになります。
真っ黒で止まっているDOS窓に業務ソフトを終了させる番号の「9」を入力すると
WScript.Echo strLine が実行され、
メッセージボックスに「入力=」が表示されました。

某HPでExecメソッドは、Execを使って実行されたスクリプトまたはプログラムの実行終了後、
実行開始前のいずれかに行われると書いてあったので、業務ソフトが終了するまで
メッセージボックスが表示されなかったのかな?と思ったのです。

勘違だったらすみません。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4786日前に更新/291 KB
担当:undef