久しぶりにスクリプトをアップしてみました。
(更新ですが)
手元に、自分用に作ったけど割と公開する価値がありそうな
スクリプトが溜まっています。
が、説明を書いたりするのが面倒で止まってます。
他にも、サイト(ログ)移転、FAQ集、WSH関連新情報の追加、リンク集更新、
古い文書の更新…。
どうしましょうかねw
いりや さん、
回答ありがとうございました。
ちょっと感動しています。
これから、解析して理解しようと思います。
おださん、
こういう時は海外の通販サイトの運営会社(カスタマ・サポート部)に問い合わせるのが一番です。以前うまくいっていて途中からうまくいかなくなったのですから途中なにかあったのは間違いない。ただそれがサイト側にあったとしてもこちらでは分からないからです。その切り分け作業をカスタマ・サポートのスタッフが支援してくれます。
はじめまして。
いきなりすいません。。僕は海外で通販で買い物しようとおもったのですが、今まで購入ボタンを押したら、普通にかいものできたのに、
今回はなんかエラーメッセージがでてしまいました。
Active Server Pages error 'ASP 0113' こんなメッセージです。
下のタスクバーには鍵のマーク(ssl保護付き)ていうマークがでます。
場違いなのはわかってるのですが、どうしたらよいのかわからないので、だれか教えてくれたら嬉しいです。
PC初心者なもので、いきなりこんな書き込み申し訳ありません。
@IT:運用 Windows管理者のためのWindows Script Host入門 http://www.atmarkit.co.jp/fwin2k/operation/wsh01/wsh01_01.html
というのが始まっているようです。
ъ( ゚ー^) WSH補完クンのページ
http://www.geocities.co.jp/SiliconValley-Oakland/4672/
バージョンアップしてます。
…ぬるさんところの受け売りですが。
そういや2ちゃんねるでもトラックバックが試験的に実装されたみたい
ですね。私のここでの書き込みは、どっちかというとブログ向きだったなぁ
と今更ながら思います。が、今後WSH関係の話題だけでやっていくのも
あれですし、スクリプト関係の記事/ブログなら他にもいいサイトが
増えてきましたし、やっぱりここはWSH掲示板として、2chWindows板の
スレの避難所的に、細々と続けていくのがいいのでしょうかね。
とかなんとか言ってますが、実は今、他のことにハマっていて、
WSH Lab.に手が回っていないだけの私でした。
セキュリティの関係でログオンスクリプトを作成することになりました。
グループポリシーとの併用である程度までは出来たのですが、
2つばかり実現できなくて困ってるものがございます。
1.ログオンスクリプトでクイックランチャの表示を消す方法
2.ログオンスクリプトで[スタート]→[プログラム]のプログラムフォルダを
隠しフォルダに設定する方法
上記2点で、何か解決策や参考スクリプト等ございましたら
ご教授願えませんでしょうか?
よろしくお願い致します。
インデントつけるのを忘れていました・・・。すみません。
coopie さん、
例えばこんな書き方が WSH/JScript でできます。ご参考まで。
// ここから
var path = 'e:\\a\\b\\c\\d\\e\\f';
createFolder(path);
function createFolder(path) {
var fs = new ActiveXObject('Scripting.FileSystemObject');
var pathArray = path.asPathArray();
var vol = pathArray[0];
if (fs.driveExists(vol))
createFolder2(fs, path);
else
throw new Error('Drive Not Found');
}
function createFolder2(fs, path) {
if (!fs.folderExists(path)) {
var pathArray = path.asPathArray();
var parentPathArray = pathArray.slice(0, pathArray.length - 1);
createFolder2(fs, parentPathArray.asPathString());
fs.createFolder(path);
}
}
function String.prototype.asPathArray() {
return this.asArray('\\');
}
function String.prototype.asArray(separator) {
return this.split(separator);
}
function Array.prototype.asPathString() {
return this.asString('\\');
}
function Array.prototype.asString(separator) {
return this.join(separator);
}
// ここまで
はじめまして。
WSH初心者のcoopieといいます。
フォルダ作成の関数を作ろうとしているのですが、うまくいきません。
例えば、"c:\a\b\c\d\e"のようなパスを渡すと、
フォルダが存在していなければ、a,b,c,d,eの全てのフォルダが作成されるように
したいと思っています。
初めから、行き詰まっています。
基本的な考え方だけでも知りたいと思っています。
できれば、JScriptがいいのですが、VBScriptでもかまいません。
よろしくお願いします。
くまさん、
特殊文字の削除については、実行される文脈 (与えるデータの文字コードや、そのデータが後々使われる箇所 (HTML を生成する一部をなすなど)) によって、こうすればよい、というのはかわってくると思います。
例えばロボ亭さんの CGI 集にその指針を得てはいかがでしょうか。
http://coco.wcn.to/
豊富な CGI が提供されておりまたスクリプトのサイズも適当であり調べる価値はあります。
はじめまして。rikaと申します。
WSHを使い始めたばかりなのですが、行き詰まっています。
クライアントPCに設定されている、プリントサーバ上のプリンタとの接続を解除したいのに、
削除できません。
以下の記述で実行しています。
----------------------------------------------------------------------
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set oPrinters = WshNetwork.EnumPrinterConnections
For i = 0 to oPrinters.Count - 1 Step 2
on error resume next
WshNetwork.RemovePrinterConnection oPrinters.Item(i+1), true, true
Next
----------------------------------------------------------------------
・OSはWindows2000Proです。
・クライアントに登録されているネットワークプリンタの情報は下記の通りです。
・ポート:IP_172.*.*.* (Standard TCP/IP Port)
・プリンタ名 LBP2810-1
・Active Directoryの一覧に追加されています。
ご教授のほど、どうぞ宜しくお願いいたします。
perlについて質問です。
下記のように文字の置き換えを行いたいのですが、
カタカナのリなども、変換対象となってしまいます。
このような場合どうのように対処すればいいのですか?
<置き換え処理>
$mes =~ tr/&;`'"*?<>^$\/\n\r//d; #~
宜しく御願いします。
はじめまして知り合いに顔文字をIMEに辞書としてついかするやり方を教えたいのですが、高齢者のためうまく説明できません。こんなことを可能にすることはスクリプト上可能でしょうか?
bookmarklet を使うという魔界の仮面弁士さんの案を使わせていただくことにします。
できれば、他のプログラム(エディタ等)をアクティブにしたまま、
WSH を使って、IE をアクティブにすることなく、
「奥」にある IE の複数のウィンドウのうちの「一番手前」 から
タイトルとURL情報を得たかったんですけどね。
しかし、それは WSH では無理だという、つちやさんの意見を入れて妥協します。
Sleipnir は使う気ないのですが、参考として頭の隅に入れておきます。
ともかく、違ったアプローチを知ることができて良かったです。
ありがとうございました。
≫ hoge さん
WScriptからの操作でなくても良いのであれば、お気に入りに
javascript:alert(window.clipboardData.setData('text',document.title+'\n'+document.location.href)?'コピーしました。':'コピー失敗');
というURLへのショートカットを置いておく、という手もありますよ。
IEでこのショートカットを開くと、現在開いているページのタイトルとURLが、
クリップボードに取り込まれます。
アクティヴなウィンドウの操作は、WSH自体の機能としてはサポートされていないと思います。
WindowsAPIを操作できるCOMの助けを借りるか何かしないとできないのではないでしょうか。
ちなみに、Sleipnirなどの、IEのコンポーネントを利用したタブブラウザなら、そういうことができるのがあります。
というか、Sleipnirのスクリプト(WSHを利用しています)に、「URLとタイトルのコピー」という、そのままのものがあったりします。
参考までに、選択範囲をURL・タイトルとともにファイルに保存したいときや、開いているページのリンク一覧が欲しいときや、開いているページの画像をみんなまとめてダウンロードしたいときは、Sleipnirを使っています。
>> 魔界の仮面弁士さん
「一番上」というのは、私の書き方がまずかったですね。
「一番手前にあるもの」(アクティブなもの)が求めるものです。
WSH では無理なのかな。
≫ hoge さん
「一番手前にあるもの」ではなく、「一番上にあるもの」で良いのならば、
列挙したオブジェクトの中で、Topプロパティが一番小さい物を抽出すればOKかな。
現在開いている IE のウィンドウから、ページのタイトルと URL を得て、
クリップボードにコピーしようと試みてます。
で、IE のウィンドウが一つのときは、とりあえずできたんですが、
複数の IE ウィンドウがあるときに、一番上にあるものを選び出す方法が
分からず困ってます。
// 現在開いている IE のウィンドウ(?)を得る。
var Shell = WScript.CreateObject("Shell.Application");
var WindowsShell = Shell.Windows();
for (var i = 0; i < WindowsShell.Count; i++) {
if (WindowsShell.item(i).FullName.match(/iexplore.exe$/i)) {
var ie = WindowsShell.item(i);
break;
}
}
こうすると、一番最初に開いたウィンドウが得られてしまい、目的がかないません。
どうすればいいのか分かる方、助言をください。
魔界の仮面弁士様
ありがとうございました。
無事解決いたしました。
≫ KURO さん
SDKのサンプルを参考にしてみるとか。
http://msdn.microsoft.com/library/en-us/adsi/adsi/winnt_user_must_change_password_at_next_logon.asp
[Directory Services]
└[Directory Access Technologies]
└[Active Directory Service Interfaces]
└[Active Directory Service Interfaces Reference]
└[ADSI Service Providers]
└[ADSI WinNT Provider]
└[WinNT User Object]
└[WinNT User Account Management Examples]
└[User Must Change Password at Next Logon (WinNT Provider)]
初めまして。
宜しくお願い致します。
WSH(VBS)を使用し「ユーザーアカウント」の設定を行っていたのですが、
一箇所どうしても設定出来ないところがありご質問させていただきます。
現在、以下の様に組んでいます。
Dim WSHShell
Dim WSHEnv
Dim hostname
Dim myUser
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WSHEnv = WSHShell.Environment("PROCESS")
hostname = WSHEnv.Item("USERDOMAIN")
Const UF_DONT_EXPIRE = &H0002
Const UF_MASK = &HFFFFFFFF
Set myUser = GetObject("WinNT://" & hostname & "/Manager,user")
myUser.Put "UserFlags", myUser.UserFlags and (UF_MASK xor UF_DONT_EXPIRE)
myUser.SetInfo
上記のものの「Const UF_DONT_EXPIRE」へ入れる値により設定を行っているのですが、「ユーザーは次回ログオン時にパスワードの変更が必要」の項目の設定用の
フラグコードが分かりません。
どなたかご存知の方がいらっしゃいましたらお教えください。
※例の[0002]は「アカウントを無効にする」のコードです。
A New Testing Tool
WinFeedback is a Windows Scripting extension for testing, monitoring and automation purposes,
like response timing, up-timing, functional testing, stress testing, health monitoring, task automation.
Shareware, company license $65
www.winfeedback.com
Best regards,
Thomas Borjeson
Thomas Bモjeson
Skonaren 1:3:3
SE-444 30 STENUNGSUND
Tel +46 303 72 67 00
Fax +46 303 72 66 07
Mobile +46 705 72 67 31
E-mail thomas.borjeson@telia.com
Site www.winfeedback.com
Dear toki さん
すでに開かれているExcelファイルのマクロの実行は、
Set XL = GetObject(,"Excel.Application")
XL.Run "Macro1"
でできます。またはマクロの実行だけであれば、
GetObject(,"Excel.Application").Run "Macro1"
と記述することもできます。
これを、.vbsの拡張子で保存して、FileMakerから「メッセージを送信」スクリプトで実行します。
こんにちわ、今日からWSHを使い出したばかりの初心者ですが
よろしくお願いいたします。
現在Win2000環境で、FileMaker6とExcel2003を使用しています。
1.FileMakerからWSHのファイルを開き(現在自動化可能です。)
2.WSHからExcelのマクロを実行したい(これが分かりません・・。)
(Excelのファイルはひらいたままマクロを実行したいのです。)
いろいろGoogle等で検索してみましたが見つからず、
最後の手段でこの掲示板に書き込ませていただきました。
まとめますと、WSHから 現在開かれているEXCELの マクロを実行したい。
のです。
ご教授よろしくお願い致します。
あけましておめでとうございます。
今年も当サイトをよろしくお願いします。
お返事&更新できなくてスミマセン。
そして早く移転しないと容量が…!
いりやさん、
おかげでなんとかなりそうです(^^;
ありがとうございました。
一つ補足です。実行にあたっては wscript.exe よりも cscript.exe の方がよいです。
c:\> cscript //nologo test.js
というような感じで実行します。
しげさん、
| VBスクリプトからDosコマンドを実行する際の質問
| 1)結果(stdIO)を取得する
| 2)窓を表示しない
| 以上2点を同時にできないでしょうか?
|
| WshShell.Exec(***)ならば、1)は可能
| WshShell.Run(***,0,true)ならば、2)は可能
結果をファイルにリダイレクトして、そのファイルの中身を WshShell>>run()
メソッドを終えて確認する方法ならば、1) と 2) 両方達成可能です。
論よりコード。ちょっとやってみましょう。VBScript ではなく JScript で書い
ています。
大きな流れは、リダイレクトされたファイルのパス情報をもとに File オブジェ
クト、TextStream オブジェクトを得て、1行ずつ内容を読んでいくという処理
になります。
サンプルでは、試験するコマンドは DIR コマンドとし、実行後に標準出力の結
果から意味のある情報を抽出しています。(filter0, 1, 2, 3 四つのフィルタを
用意しています。Awk とかやったことのある人ならば同等なスクリプトを数行で
構築できるでしょう。) 動かして実行結果を確認すれば動きはすぐ把握できます。
[ 実行の仕方 ]
//process(readStream, filter0);
//process(readStream, filter1);
//process(readStream, filter2);
//process(readStream, filter3);
のどれか一行のみコメントを外して保存します。.js ファイル名で。ダブルクリッ
クすれば実行が始まります。
[ WSH/JScript ソースコード ]
new ActiveXObject('WScript.Shell').run('cmd.exe /c DIR > C:\\OUTPUT.LOG', 0, true);
var readStream = file→readStream(filepath→file('C:\\OUTPUT.LOG'));
//process(readStream, filter0);
//process(readStream, filter1);
//process(readStream, filter2);
//process(readStream, filter3);
function process(readStream, filter) {
try {
filter(readStream);
} finally {
readStream.close();
}
}
function filepath→file(filepath) {
var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
return aFileSystemObject.fileExists(filepath) ? aFileSystemObject.getFile(filepath) : null;
}
function file→readStream(file) {
var ForReading = 1;
var TristateUseDefault = -2;
return file.openAsTextStream(ForReading, TristateUseDefault);
}
// filter0 : 入力内容をそのまま出力する
function filter0(readStream) {
while (!readStream.atEndOfStream)
WScript.echo(readStream.readLine());
}
// filter1 : 2003/03 で始まる行を出力する
function filter1(readStream) {
while (!readStream.atEndOfStream) {
var aString = readStream.readLine();
if (/^2003\/03/.test(aString))
WScript.echo(aString);
}
}
// filter2 : ファイルのサイズの合計を表示する。DIR コマンドの出力結果と一致するはず
function filter2(readStream) {
var sum = 0;
var nRecords = 0;
while (!readStream.atEndOfStream) {
var aString = readStream.readLine();
var anArray = aString.split(/ +/);
if (/^[0-9]/.test(aString) && !/\<DIR\>/.test(anArray[2])) {
nRecords++;
sum += new Number(anArray[2].replace(/,/g, ''));
}
}
WScript.echo('sum: ' + sum + ' バイト');
WScript.echo('nr: ' + nRecords + ' 行');
}
// filter3 : 通称 tail コマンドで提供される機能。最後の 5 行を出力 (tailSize で指定)
function filter3(readStream) {
var tailSize = 5;
var tailArray = new Array(tailSize);
var nRecords = 0;
while (!readStream.atEndOfStream) {
var aString = readStream.readLine();
nRecords++;
for (var i = 0; i < tailSize - 1; i++)
tailArray[i] = tailArray[i + 1];
tailArray[tailSize - 1] = aString;
}
if (nRecords < tailSize)
for (var i = tailSize - nRecords; i < tailSize; i++)
WScript.echo(tailArray[i]);
else
for (var i = 0; i < tailSize; i++)
WScript.echo(tailArray[i]);
}
// ここまで
はじめませてVBS初心者ですのでどうかよろしく。
VBスクリプトからDosコマンドを実行する際の質問
1)結果(stdIO)を取得する
2)窓を表示しない
以上2点を同時にできないでしょうか?
WshShell.Exec(***)ならば、1)は可能
WshShell.Run(***,0,true)ならば、2)は可能
よろしくお願いします。
>たかこ さん
'==== パスワード変更処理 =====
Public Sub ChangeCurrentUserAccountPassword(sOldPassword As String, sNewPassword As String)
With CreateObject("WScript.Network")
Call CreateObject("WinNT://" & .UserDomain & "/" & .UserName & ",user").ChangePassword(sOldPassword, sNewPassword)
End With
End Sub
Sub Main()
Dim sNewPass, sOldPass
sOldPass = InputBox("今のパスワードを入力してください。")
sNewPass = InputBox("新しいパスワードを入力してください。")
Call ChangeCurrentUserAccountPassword(sOldPass, sNewPass)
End Sub
こんな感じかな?
エラー処理等は加えてください。
はじめまして、プログラムはほとんど初心者です。
現在ユーザーにログオン時にパスワードの
変更を強制するプログラムを作成したいと
考えております。
Userflagsを利用するという話はきいたのですが
その属性の扱い方がわかりません。
これをVBScriptで作成したいのですが
何かアドバイスがありましたらどうぞ
よろしくお願いいたします。
>> cmd.exe /c notepad.exe
IISは「サービス」なので、デスクトップとの対話が必要なアプリの起動は、
ご法度です。サーバ上でメモ帳が起動されても、それを閉じる人は居ませんし。
> Executeメソッドちゃんとありますね。
ですます。
機能としては同等ですが、Execute2はJScript用、ExecuteはVBScript用ですね。
>>魔界の仮面弁士 さん
すいません勘違いしていました。
Executeメソッドちゃんとありますね。
>>魔界の仮面弁士 さん
basp21のExecuteメソッドの実績はありますでしょうか?
ExecuteだとProで有償なのでnon pro を使用しました。
メソッドはExecute2になります。
下記スクリプトでやると何分たっても戻ってきません。
Execute2をコメントし、StrConvを復活すると
正常に動作します。
<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER"></SCRIPT>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<%
Set bobj = Server.CreateObject("basp21")
' stdout = bobj.StrConv("あああ", 16)
stdout = bobj.Execute2("cmd.exe /c notepad.exe",1)
If bobj.Result > 0 Then
Response.Write "<B>" & stdout & "<B><BR>"
End If
%>
</body>
</html>
≫ takeさん
> web環境(IIS)から.bat等起動したい場合は
basp21のExecuteメソッドを使ってみては如何でしょう。
takeさん、魔界の仮面弁士 さん 割り込み失礼します。
やっとわたしと同じ事で悩んでいる人を発見しました。
私の場合VBScriptですが、takeさんと同様のことを行おうとしています。
症状としては、「起動される場合と起動されない場合がある。」です。
"待ちなし起動"していますので、WShell.Runでは何が起こったか捕らえられていません。
IISからの起動ができない(たまたま出来てる?)のであれば、皆さんはどの様に解決してるんでしょう?
何か別の方法があるという事であればご教示ください。
(IISサーバーの環境は、OS:Windows2000 WSH5.6です。)
>>魔界の仮面弁士 さん 返信ありがとうございます
web環境(IIS)から.bat等起動したい場合は
どのように実現しているものなのでしょうか?
≫ takeさん
WScriptオブジェクトは、ホストがWSHの場合のみ使用できます。
IE、ASP、ScriptControl等がホストの場合には使用できません。
.jsファイルをfunctionなしで実行する分にはうまくいくのですが
htmlから呼び出した場合、「WScriptは宣言されていません」
というエラーになってしまいます。
何か設定等ひつようなのでしょうか?
ASP(HTML)からWSHを使用する例がみあたりません。
/* hello.html */
<SCRIPT LANGUAGE="VBScript" RUNAT="SERVER"></SCRIPT>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<script src="c:\asp\hello.js" language="JavaScript"></script>
</head>
<body>
<center>
<table border="0" width="660">
<tr>
<td><input readonly type="text" name="yukokigen_e" size="20" maxlength="10" onfocus="f_hello()" value="">
</td>
</tr>
</table>
</body>
</html>
/* hello.js */
function f_hello(){
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var WShell = WScript.CreateObject("WScript.Shell");
var stream = fs.CreateTextFile("a.bat");
stream.WriteLine("sqlplus srhcp/srhcp@srhcp");
stream.WriteLine("exit");
stream.Close();
WShell.Run("a.bat", 1, true);
}
結果報告が大変遅くなってしまいました。
2003年 11月 27日 22時 22分 55秒 に書き込みをしました、小西です。
Windows95にWSH5.5(scr55jp.exe)をインストールしてみました。すると、Windowsの起動時に以下のメッセージが出て起動しなくなってしまいました。
-----------------------------------------------------------
デバイスIOSを初期化中:
エラー:I/Oサブシステムドライバを読み込めませんでした。
.\iosubsysサブディレクトリのファイルが壊れているかメモリが不足しています。
-----------------------------------------------------------
やっぱりWSH5.5はWindows95には対応していなかったのでしょうか。
その後、セーフモードでは立ち上がるのですが、通常起動にすると何度やっても同じエラーが出て起動できませんでした。
WSHってアンインストールが出来ないんですね。コントロールパネルのアプリケーションの追加と削除でWSH5.5をアンインストールすればいいさ、なんて最初は気楽に思っていたのですが、結局問題の解決は出来ませんでした。
最終的にはWindows98をインストールしてWSHを使えるようにしたので、仕事上問題は無かったのですが・・・とりあえず結果の報告でした。
akinon さん、
AKiOSさんご提供のWSH Lab. 掲示板 記事検索プログラムが便利です。こちらで Adodb.Stream を検索語として入力すると一杯でてきます!
あちゃ、すみません。
Array_select(), Array_collect() バグってました。
function Array_select(discriminator) {
var anArray = new Array();
for (var i = 0; i < this.length; i++) {
var each = this[i];
if (discriminator(each))
anArray.push(each);
}
return anArray;
}
function Array_collect(transformer) {
var anArray = new Array();
for (var i = 0; i < this.length; i++) {
var each = this[i];
anArray.push(transformer(each));
}
return anArray;
}
いりやさんへ
度々のフォローありがとうございました。
いりやさんに教えていただいた最後のやり方で、思い通りに動作させる事ができるようになりました。
WSH掲示板の過去ログにもあったのですね。
検索したのだけれど、どうしても見つからなかったので書き込んでしまったのですが...
本当にありがとうございました。
はじめまして。Takといいます。
2003/11/25のnemoさんと同じ問題でわたしも行き詰まってしまいました。
解決若しくは代替案を見つけたのであればご教示ください。
よろしくお願いします。
魔界の仮面弁士さん、owl さん、
VBScript のコードのご提示ありがとうございます。こうやって二つのコードを並べてみ
ると際立ちますね。
そうそう、魔界の仮面弁士さんがおっしゃる通り、コードは Java によく似ていますが
Microsoft JScript で書いたものです。
本家 (ECMAScript) の仕様書の概要にも書かれていますが Java と Self というプログ
ラム言語からいろいろと機能を拝借したとあります、文法 (Syntax) などはまさにそう
です。
ところで。ところで、スクリプト中の detect() メソッドはメソッド名を間違えており
ました。
このメソッドに期待していたのは、ある条件に適合する要素だけを抽出した新しい集ま
り (Collection) を返す機能でした。
わたしがお手本にしていた Smalltalk というプログラム言語の仕様と実装例をもう一回
調べてみたら detect() ではなく select() であることが分かりました。混乱を招く名
前を使用しまして申し訳ありませんでした。下記の通り、お詫びして訂正します。若干
修正しました。
[ 実行例 ]
C:\Documents and Settings\iriyak\デスクトップ>cscript //nologo select.js
------------
C:\tmp\0.doc
C:\tmp\1.doc
C:\tmp\2.doc
C:\tmp\3.doc
C:\tmp\4.doc
------------
['0.doc', '1.doc', '2.doc', '3.doc']
------------
Discriminator: [function (each) { return (/.doc$/.test(each.name)) }]
['C:\\tmp\\0.doc', 'C:\\tmp\\1.doc', 'C:\\tmp\\10.doc', 'C:\\tmp\\11.doc', 'C:\\
tmp\\12.doc', 'C:\\tmp\\13.doc', 'C:\\tmp\\14.doc', 'C:\\tmp\\15.doc', 'C:\\tmp\
\16.doc', 'C:\\tmp\\17.doc', 'C:\\tmp\\18.doc', 'C:\\tmp\\19.doc', 'C:\\tmp\\2.d
oc', 'C:\\tmp\\3.doc', 'C:\\tmp\\4.doc', 'C:\\tmp\\5.doc', 'C:\\tmp\\6.doc', 'C:
\\tmp\\7.doc']
Discriminator: [function (each) { return (/^[0-4].doc$/.test(each.name)) }]
['C:\\tmp\\0.doc', 'C:\\tmp\\1.doc', 'C:\\tmp\\2.doc', 'C:\\tmp\\3.doc']
Discriminator: [function (each) { return (/^1[0-9].doc$/.test(each.name)) }]
['C:\\tmp\\10.doc', 'C:\\tmp\\11.doc', 'C:\\tmp\\12.doc', 'C:\\tmp\\13.doc', 'C:
\\tmp\\14.doc', 'C:\\tmp\\15.doc', 'C:\\tmp\\16.doc', 'C:\\tmp\\17.doc', 'C:\\tm
p\\18.doc']
C:\Documents and Settings\iriyak\デスクトップ>
[ WSH/JScript ソースコード ]
// ここから
function Enumerator_asArray() {
var anArray = new Array();
for (; !this.atEnd(); this.moveNext()) {
var each = this.item();
anArray.push(each);
}
return anArray;
}
Enumerator.prototype.asArray = Enumerator_asArray;
function Array_select(discriminator) {
var anArray = new Array();
for (var i = 0; i < this.length - 1; i++) {
var each = this[i];
if (discriminator(each))
anArray.push(each);
}
return anArray;
}
function Array_collect(transformer) {
var anArray = new Array();
for (var i = 0; i < this.length - 1; i++) {
var each = this[i];
anArray.push(transformer(each));
}
return anArray;
}
function Array_do_(aFunction) {
for (var i = 0; i < this.length; i++)
aFunction(this[i]);
}
function Array_printString() {
var stringArray = new Array();
var quote = function (aString) {
var q = String.fromCharCode(39);
return new Array(q, aString.replace(/\\/g, '\\\\'), q).join('');
}
stringArray.push('[');
for (var i = 0; i < this.length - 1; i++) {
var s = typeof(this[i]) == 'object' ? this[i] + '' : this[i].toString();
stringArray.push(quote(s), ', ');
}
s = typeof(this[i]) == 'object' ? this[i] + '' : this[i].toString();
stringArray.push(quote(s));
stringArray.push(']');
return stringArray.join('');
}
Array.prototype.select = Array_select;
Array.prototype.collect = Array_collect;
Array.prototype.do_ = Array_do_;
Array.prototype.printString = Array_printString;
// selectFiles()
//
// folderPath 中のファイルのうち discriminator の条件に合致するものを
// 集めた Array オブジェクトを返す。要素は File オブジェクト。
function selectFiles(folderPath, discriminator) {
var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
if (!aFileSystemObject.folderExists(folderPath))
return null;
else {
var files = aFileSystemObject.getFolder(folderPath).files;
var anArray = new Enumerator(files).asArray();
return anArray.select(discriminator);
}
}
// example1() : Array.prototype.do_() メソッド例
//
// c:\tmp 中のファイル名が [0-4].doc の File オブジェクトのみ抽出して
// 各要素のパス名 (pathプロパティー) を表示させる処理を doBlock 関数
// オブジェクトで行う。
function example1() {
var folderPath = 'c:\\tmp'; // c:\tmp フォルダを対象
var discriminator = function (each) { return (/^[0-4].doc$/.test(each.name)) }; // ファイル名が [0-4].doc
var fileArray = selectFiles(folderPath, discriminator);
var doBlock = function (each) { WScript.echo(each.path) };
fileArray.do_(doBlock);
}
// example2() : Array.prototype.collect() メソッド例
//
// c:\tmp 中のファイル名が [0-4].doc の File オブジェクトのみ抽出して
// 各要素のファイル名 (name プロパティー) を要素にもつ Array オブジェ
// クトを返す。
function example2() {
var folderPath = 'c:\\tmp'; // c:\tmp フォルダを対象
var discriminator = function (each) { return (/^[0-4].doc$/.test(each.name)) }; // ファイル名が [0-4].doc
var fileArray = selectFiles(folderPath, discriminator);
var transformer = function (each) { return each.name };
var filenameArray = fileArray.collect(transformer);
WScript.echo(filenameArray.printString());
return filenameArray;
}
// example3() : Array.prototype.do_() メソッド例
//
// 複数の discriminator を用意して、Array.prototype.select() (selectFiles() 関数
// 内にて) に適用します。doBlock 関数オブジェクトで処理しているのは、File オブジェ
// クトの抽出と、各要素のパス情報 (path プロパティー) の表示です。
function example3() {
var folderPath = 'c:\\tmp'; // c:\tmp フォルダを対象
var discriminator1 = function (each) { return (/.doc$/.test(each.name)) }; // ファイル名が .doc で終わる
var discriminator2 = function (each) { return (/^[0-4].doc$/.test(each.name)) }; // ファイル名が [0-4].doc
var discriminator3 = function (each) { return (/^1[0-9].doc$/.test(each.name)) }; // ファイル名が 1[0-9].doc
var discriminatorArray = new Array(discriminator1, discriminator2, discriminator3);
var doBlock = function (discriminator) {
WScript.echo('Discriminator: [' + discriminator + ']');
var fileArray = selectFiles(folderPath, discriminator);
var filenameArray = fileArray.collect(function (each) { return each.path });
WScript.echo(filenameArray.printString());
WScript.echo('');
}
discriminatorArray.do_(doBlock);
}
//
// main
//
WScript.echo('------------');
example1();
WScript.echo('------------');
example2();
WScript.echo('------------');
example3();
// ここまで
も一つ、忘れていた。バイナリファイルを格納する場合。
(WSH 掲示板や 2ch で紹介されています。)
// ここから
var aURL = 'http://iriyak.adam.ne.jp/pic/mac.jpg'; // JPEG 画像
var filePath = '.\\mac.jpg';
saveSourceObjectTo(aURL, filePath);
invokeRunMethodWith(doubleQuote(filePath)); // filePath のファイルを開く
function saveSourceObjectTo(aURL, filePath) {
var msXMLHTTP = new ActiveXObject('Microsoft.XMLHTTP');
var adodbStream = new ActiveXObject('Adodb.Stream');
msXMLHTTP.open('GET', aURL, false);
msXMLHTTP.send();
adodbStream.type = 1; // 1 = adTypeBinary;
adodbStream.open();
adodbStream.write(msXMLHTTP.responseBody);
adodbStream.saveToFile(filePath, 2); // 2 = adSaveCreateOverWrite
}
function invokeRunMethodWith(aCommandLine) {
return new ActiveXObject('WScript.Shell').run(aCommandLine);
}
function doubleQuote(s) {
var q = String.fromCharCode(34);
return new Array(q, s, q).join('');
}
// ここまで
akinon さん、
がんばってください。
ちなみにもう一つのやり方は Dynamic HTML Object Model を利用します。リン
ク先のウェブ・ページの Dynamic HTML Object (document object) へのリファ
レンスを Internet Explorer の document プロパティーを通じて取得します。
その document を構成する html 表現は、フレームを構成しない場合ならば、
document.body.parentElement.outerHTML プロパティーを通じて取得できます。
これを外部に保存してやれば OK です。以下、サンプルです。
// ここから
var url = 'http://www.yahoo.co.jp/';
var outputFilePath = 'd:\\test.html';
example(url, outputFilePath);
function example(url, outputFilePath) {
var e = new ActiveXObject('InternetExplorer.Application');
e.visible = true;
e.navigate2(url);
while (e.busy || e.readyState != 4)
WScript.sleep(0.1 * 1000);
try {
var writeStream = file→writeStream(filepath→file(outputFilePath));
writeStream.write(e.document.body.parentElement.outerHTML);
} finally {
writeStream.close();
}
}
function filepath→file(filepath) {
var aFileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
if (!aFileSystemObject.fileExists(filepath))
aFileSystemObject.createTextFile(filepath, true); // 2nd arg : overwrite
return aFileSystemObject.getFile(filepath);
}
function file→writeStream(file) {
var ForWriting = 2;
var TristateUseDefault = -2;
return file.openAsTextStream(ForWriting, TristateUseDefault);
}
// ここまで
いりやさんへ
早速のご回答ありがとうございます。
ご指摘のコードを解析してみます。
本当にありがとうございました。
魔界の仮面弁士さん
ご指摘ありがとうございます。
とても参考になりました。