こゆりさん、
| WWWサーバ側のHTMLのバックアップをWindows標準のftp.exeを使用
| して、差分、更新されたフォルダ、ファイルをダウンロードするの
| をWSHで実現したいのですが、サンプル等なにか情報がありました
| ら教えてください。よろしくお願いします。
差分バックアップの根幹機能を他のソフトウェアにお願いしても
よいのであれば・・・
サーバ側のファイルに Windows のファイルシステムを経由してア
クセスできる前提でお話しますと、起動の指示だけを Windows
Script Host が引き受け、差分バックアップを Mercury さんのディ
スクミラーリングツールにお願いする、という役割分担で実現可
能です。
Mercury's Software Lab.
http://www5.wisnet.ne.jp/~mercury/
ディスクミラーリングツール
http://www5.wisnet.ne.jp/~mercury/dmt/index.html
また、FTP プロトコルが前提となるのであれば、Sota さんの
FFFTP の「ミラーリングアップロード機能」「ミラーリングダウ
ンロード機能」を使えば実現可能です。ただ FFFTP はコマンドラ
インで動作させたことがないのでどこまで連携できるかはちょっ
と分かりません。もしかしたら UWSC のような GUI の自動操作ア
プリケーションとの連携も考慮しなければならないかもしれませ
ん。
Sota's Web Page
http://www2.biglobe.ne.jp/~sota/
FFFTP
http://www2.biglobe.ne.jp/~sota/ffftp.html
UWSC
http://www002.upp.so-net.ne.jp/umiumi/
WWWサーバ側のHTMLのバックアップをWindows標準のftp.exeを使用して、差分、更新されたフォルダ、ファイルをダウンロードするのをWSHで実現したいのですが、サンプル等なにか情報がありましたら教えてください。よろしくお願いします。
タマネギさん、
http://www.borncity.com/WSHBazaar/WSHDynaCall.htm
http://members.tripod.co.jp/IUnknown/WSH/dwhelper/topics/
にエッセンスが詰まっています。
WSH初心者です。
IEで「ツール」−「インターネットオプション」のセキュリティのタブの
設定情報をVBScriptで取得する事は可能でしょうか?
宜しくお願い致します。
WSH(VBS)からでもWin32 APIって使えるのでしょうか?
いりやさん、
カレントディレクトリーの指定うまくいきました。
どうもありがとうございました。
いりやさん、
ご教授ありがとうございました。
>このフォルダに格納されている任意のファイルを削除する、
>という手続きを検討されてみてはいかがでしょうか。
検討してみたいと思います。
以上です。
いりやさん、
ご教授ありがとうございました。
>このフォルダに格納されている任意のファイルを削除する、
>という手続きを検討されてみてはいかがでしょうか。
検討してみたいと思います。
以上です。
祥子さん、
インターネット一時ファイルの保管場所が、
C:\Documents and Settings\ユーザ名\Local Settings\Temporary Internet Files
フォルダであることに目を付けて、このフォルダに格納されている任意のファイルを削除する、という手続きを検討されてみてはいかがでしょうか。なお、このフォルダはデフォルト値で利用者が任意に変更可能です。環境にあわせてご調整ください。
初投稿ですが、どうぞよろしくお願いします。
質問なんですが、
InternetExplorerの「インターネット一時ファイルの削除」
と同じことを、CUIで実現したいです。
IEのオブジェクトなど、いろいろ調べてみたのですが、わかりません。
どなたかわかる方いらっしゃいましたら、
ご教授お願い致します。
以上です。
かつやさん、
任意のサイト (URL) でそのようなメッセージが表示されますか?
それともある特定のサイトで発生する事象でしょうか。また再
現性はありますか?可能ならば URL を明示いただければ環境に
依存する話なのかそうでないかの切り分けが可能です。
WebBrowserコントロールを、VBScriptの中で使ってます。
一回目のNavigate2メソッドは問題ないんですが、
リロードすると、”Permission Denied”というエラーメッセージが表示されます。
同様の現象を経験されたかた、どのように解決しましたか?
WebBrowserコントロールを、VBScriptの中で使ってます。
一回目のNavigate2メソッドは問題ないんですが、
リロードすると、”Permission Denied”というエラーメッセージが表示されます。
同様の現象を経験されたかた、どのように解決しましたか?
まるさん、
一例です。コマンドプロンプト (cmd.exe) の組み込みコマンドで
ある start コマンドの D オプション (start /?) を使ってもう少
し簡潔に書けるような気もしますが、とりいそぎ。
parent.js (WSH/JScript) からあるバッチファイルをキックします。
そのときカレントディレクトリを c:\ に変更しています。
キックされた child.bat 内で cd コマンドを実行しカレントディ
レクトリの値を c:\cd.log に格納します。
c:\cd.log の中身を確認し、parent.js 実行時のカレントディレク
トリ (C:\Documents and Settings\iriyak\My Documents) と違う
ことを確認します。
[ 実行例 ]
C:\Documents and Settings\iriyak\My Documents>type parent.js
var aShell = new ActiveXObject('WScript.Shell');
var q = String.fromCharCode(34);
aShell.currentDirectory = 'c:\\'; // カレントディレクトリを C:\ にする
aCommandLine = q + 'C:\\Documents and Settings\\iriyak\\My Documents\\child.bat' + q;
aShell.run(aCommandLine);
C:\Documents and Settings\iriyak\My Documents>type child.bat
cd > c:\cd.log
C:\Documents and Settings\iriyak\My Documents>cscript //nologo parent.js
C:\Documents and Settings\iriyak\My Documents>type c:\cd.log
c:\
C:\Documents and Settings\iriyak\My Documents>
DOSのアプリケーションを、ディレクトリーを指定した上で実行させる方法を教えてください。
バッチだと
cd c:\testfolder
mycommand.exe
の様に書くと c:\testfolder で mycommand.exe が実行されますが、これと同じ事をWSHスクリプトで行ないたいのです。
どなたかよろしくお願いいたします。
すいません。自己解決しましたm(__)mお騒がせしてすみません。
WinndowsXPの場合、
HKLM\SOFTWARE\Microsoft\" & _
"Windows NT\CurrentVersion\RegisterdOwner"に情報がありました。
ところでO'Reilly本って、ミスが多くないですか?説明しているのと内容が異なっているのが目立ちます。オライリーHPを見ても正誤表もないので困りますね(^^;
始めまして。オライリー本WSHクイックリファレンスを順追ってやっていっているのですが、RegReadメソッドのところで
"HKLM\SOFTWARE\Microsoft\" & "Windows\CurrentVersion\RegisterdOwner"
からユーザー名を抽出してくるのですが、WindowsXPproではREGEDITを開いてもそのような項目が存在せず、抽出することが出来ません。
WSHそのものに対する質問から外れますが、XPの場合、どこに同じ情報が書き込まれているのでしょうか? ご助言いただければ幸いです。
よろしくお願いいたします。
ご回答ありがとうございます。
まだまだ理解が足りないので勉強し
出直したいです。
初心者にもかかわらず丁寧に回答いただいて感謝してます。
これからよろしくお願いします。
「フォルダのショートカット」について質問させていただいたytです。
ご回答ありがとうございました。
>> 「フォルダのショートカット」を動的に作成したく、
>> こちらのスクリプトを参考にさせていただいております。
>> 動作環境が「Win2000,WinMe,WinXPのみ」ということになっていますが、
>> これは何が理由なのかご存知ないでしょうか。
> その機能がエクスプローラに実装されたのが、Win2000からだからです、
> って説明になってないですけど実際そういうことだと思うのですが…。
> 単にClassIDをレジストリに書き込むだけでは駄目だと思います。
> Win98のshell32.dllには、その機能がおそらくないからです。
XPでレジストリにCLSIDを追加した場合でもダメだったので、
恐らくCLSID以外の部分ではないかと思っていたのですが、
機能自体がwin2000以降だったのですね。。。
「フォルダのショートカット」機能について、どのOSから搭載されたかなどの
情報を見つけることができていなかったので助かりました。
お手数をおかけしました。
むたぐち様 ご回答ありがとうございました。
管理者のむたぐちさま自らご回答ありがとうございました。
2.検索プログラムの使い方が分かりません。
この件に関しましては、Googleを使用することによって解決致しました。
ありがとうございました。
1.ASPファイルからVBSファイルの起動させ方が分かりません。
こちらの問題にしていた件が上手く行ったかどうかが分かりませんでした。
過去ログを使用して検索キーとしてWSCRPIT.exeを使用したのですが、
私の探したい内容では有りませんでした。
現象
ピッというビープ音を出してそのまま目的とした結果が現れませんでした。
タスクマネージャーで確認した所WSCRIPT.exe は起動しているみたいでした。
いろいろな所で検索したデータなので内容をまだ理解していません。
Data_2.VBSだけをダブルクリックすると、現在動いているモジュール名がメッセージボックス
で表示します。
Data_1.ASPから起動するとメッセージボックス自体が表示されませんでした。
予定
Data_2.VBSで取得した際に、同一モジュールが動いている時にメッセージを表示したい。
(チェックしたいモジュールは市販のソフトなのでそのモジュールの中に、
同時起動チェックを組み込むことが出来ません)
私のスクリプトの書き方がオカシイのかもしれませんので、
下に私が記述したスクリプトを記載しておきます。
--------------------------------------------------
Data_1.ASP
--------------------------------------------------
<%
Dim ObjWshShell
Set ObjWshShell = Server.CreateObject("Wscript.Shell")
ObjWshShell.Run "C:\Inetpub\wwwroot\D\VBS\Data_2.vbs"
%>
--------------------------------------------------
Data_2.VBS
--------------------------------------------------
for each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery ("select * from Win32_Process")
WScript.Echo Process.Name & ":" & Process.ProcessID
Next
--------------------------------------------------
Dear むたぐちさん
とりあえず
www2.jan.ne.jp/~kajika/dl/cryptcom.zip
においてあります。
むたぐちさんだったら、特に説明はいりませんよね。
近々、トップページからリンクをはることにします。
CipherSaberで使われるRC4は、ライセンスが不明瞭なので、個人的な用途以外の場合は注意が必要です。
参考までに、CAST128やAES用のCOMは、
download.paipai.net/texts/components.htm
ですね。
> 関係ない話ですが、XPのCD-R焼き機能をWSHから呼べないですかねえ。
Shell Objectを使えば、限定的に呼ぶ事はできます。
FolderオブジェクトのCopyHereメソッド等を使って、CD-Rの名前空間にファイルを
コピーした後、CD-Rドライブに対して「これらのファイルを CD に書きこむ」を
実行するために、FolderItemVerb.DoItメソッドを発行する……という流れです。
――ただ残念な事に、この方法で実現出来るのは、書き込みウィザードを
起動する所までとなります。それ以上の制御はできません。
(タイミングが合えば、SendKeysでボタン押下ぐらいはできるかも知れませんが)
# パケットライト系のソフトウェアがインストールされていれば、
# FileSysemObjectだけで事足りるのですけれどね。
XPの書き込みウィザードに頼らず、より高度な制御を行うとすれば、
IMAPI(Image Mastering API)の呼び出しが必要になるようなのですが、
その為のディスパッチインターフェイスなタイプライブラリが標準で
用意されていないらしく、スクリプトからの呼び出しはできません。
# 「CreateObject("IMAPI.MSDiscMasterObj")」でいけるかと思ったけど、無理でした。(T_T)
## IMAPIがWSHでサポートされていれば、音楽CDさえもスクリプトで作成できるのですけれどね。
To: 常連のみなさま
いつもお世話になっております。
最近、管理人の私が全然顔を出してなくて恐縮です。
To: つちやさん
暗号化COMコンポーネント、公開を期待してます。
ある事件とある人の影響を受けて、ちょっと暗号化にハマっているので…。
ヘルプが面倒ならば、タイプライブラリだけでも公開していただければ
いいんじゃないでしょうかw
スラッシュドット ジャパン | IE に一見普通のファイルを実行可能な凶悪バグ
http://slashdot.jp/security/04/01/29/039216.shtml?topic=41
これ、やばすぎですねー。
またHTAやWSHが悪用されそうです。
しかし、そもそも.folderファイルなんて何のためにあるんだろう?
とりあえず、最近の書き込みに対してお返事します。
To: yt さん
> 「フォルダのショートカット」を動的に作成したく、
> こちらのスクリプトを参考にさせていただいております。
> 動作環境が「Win2000,WinMe,WinXPのみ」ということになっていますが、
> これは何が理由なのかご存知ないでしょうか。
その機能がエクスプローラに実装されたのが、Win2000からだからです、
って説明になってないですけど実際そういうことだと思うのですが…。
単にClassIDをレジストリに書き込むだけでは駄目だと思います。
Win98のshell32.dllには、その機能がおそらくないからです。
ちなみにこの「フォルダのショートカット」、便利ですけど使いどころを
間違えると結構怖いこともあります。
デスクトップにフォルダを作って、そこに、よく使うフォルダの
「フォルダのショートカット」を作成すると、タスクバーの
ツールバーからポップアップでファイルまで辿れて便利です。
ですが、デスクトップにあるファイルのバックアップを取ろうと思って、これまたXPの
エクスプローラの便利機能である、CD-R焼き機能を使った時に問題発生。
何と、フォルダのショートカットを展開しだして、リンク先ファイルまで
コピーしだしたんですよ。
これは意外な盲点でした。
関係ない話ですが、XPのCD-R焼き機能をWSHから呼べないですかねえ。
バックアップを完全自動化、しかも自分にとって都合のよいバックアップ
スクリプトができれば完璧なんですが…。
To: z さん
> ここのサイトにあるfiletree.vbsを参考にファイルやフォルダの
> フルパスなどを表示させるようにしたのですが、child.Path
> はうまく動くのですが、child.DateCreatedはエラーが起こって
エラーが起こるのは、Shell.ApplicationのFolderItemオブジェクトに、
DateCreatedプロパティがないからです。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shellfol.htm
ここに書いている、FolderオブジェクトのGetDetailsOfメソッドを使えば、
更新日時は取れます。
作成日時は無理かもしれません。
FileSystemObjectのFileオブジェクトにはDateCreatedプロパティがあります
ので、FileSystemObjectを併用するか、最初からFileSystemObjectだけを
使って記述するかの二択になると思います。
tree.vbsの方は、FileSystemObjectだけで記述してあるので、こっちを
ファイル名も出力するように改良するのが楽かもしれません。
まあ、なんせ再帰処理の習作的スクリプトですから、というわけでもないですけど、
色々弄ってみてください。
To: GAN さん
> 1.ASPファイルからVBSファイルの起動させ方が分かりません。
Server.CreateObjectでWshShellオブジェクトを呼び出し、
Runメソッドを実行してやるといいと思います。
今書いた単語を検索キーワードにすれば、具体的な方法が見つかると思いますよ。
> 2.検索プログラムの使い方が分かりません。
AKiOSさんの検索スクリプトには、ダウンロード機能がないので、
別途ダウンローダーを導入してください。
右クリック→対象をファイルに保存 でも可能ですけど
面倒ですからね。
ソースをコピーアンドペーストすると、多分文字コードや改行コードの問題で
認識されなくなっちゃうんじゃないかと推測してます。
http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/src/wshbbs.lzh
これは私の作った、この掲示板の内容をメーラーで読むための
スクリプトですが、こちらにはダウンロード機能がついてますので、
これを併用するのも手です。
コメント行をよく読んでください。
あと、Googleを使うのもお勧めです。
site:www.roy.hi-ho.ne.jp Server.CreateObject
って入れてみて下さい。うちのサイトと掲示板の過去記事が検索対象になります。
もしhi-hoのroyサーバーで、うち以外のScript関係のサイトが誕生すれば、
この方法は使えなくなってしまいますが、今のところ大丈夫ですね。
サイト移転時には、この掲示板に検索機能を入れてやろうと
画策してるんですが、いつになることやら…。
はじめまして。
GANと申します。
WSH lab掲示板 記事検索プログラム(以後、検索プログラムと明記します。)の
使い方が分から無かったため、膨大な過去ログと戦っていたのですが、
見付ける事が出来ませんでした。
質問内容としては2個有ります。
1.ASPファイルからVBSファイルの起動させ方が分かりません。
どのようにしたらASPファイルからVBSファイルを起動させる事が
出来るのでしょうか?
2.検索プログラムの使い方が分かりません。
初っ端の
●記事ファイルについて
index.shtml : 最新記事リスト(WSH Lab.掲示板のページ)
list<NUM>.shtml : 過去記事リスト(最新記事リストの最後にリンクがあります)
これをどうすれば良いのか分からず、検索プログラム上には
WSH Lab. 掲示板 記事リスト一覧 記事ファイルが見つかりません。
と表示されます。
同一フォルダに本掲示板から過去ログのデータをソースの表示で
コピーしたList97.htmと言う形式のファイルを保存しても何も
起きません。
どうすれば良いのでしょうか。
よろしくお願い致します。
はじめまして。
ここのサイトにあるfiletree.vbsを参考にファイルやフォルダの
フルパスなどを表示させるようにしたのですが、child.Path
はうまく動くのですが、child.DateCreatedはエラーが起こって
しまいます。どうしてなのかよくわからないので教えていただけるでしょうか?
よろしくお願いします。
はじめまして。
「フォルダのショートカット」を動的に作成したく、
こちらのスクリプトを参考にさせていただいております。
動作環境が「Win2000,WinMe,WinXPのみ」ということになっていますが、
これは何が理由なのかご存知ないでしょうか。
私が調べた限りでは、desktop.iniに記述する
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
がWin98以前ではHKCR\CLSID以下に存在しないからではないかと思っているのですが。
また、もしこれが理由であるとして、上記のCLSIDと同内容のCLSIDを新たに定義し利用することでWin98でも可能ということにはならないでしょうか。
お手数をおかけしますが、何か情報をお持ちでしたらお教えください。
よろしくお願いします。
>いりやさん
確かに意思疎通というものは難しいですね。
例え全ての人に共通の言葉であっても、文字で見たり話で聞いたりしても伝わりにくいものです。(例えば風景の説明であったり、地図の説明であったり。)
ましてや、人それぞれ思っている単語が違う意味を持っていたら、余計に伝わりにくくなりますよね。
ソフトウェア開発のお仕事をされているみたいですね。
私も4月からはソフトウェアエンジニアとして働くことが決まっているのですが、
先が思いやられます。。。
自分の説明下手には反省するところがいっぱいです。
また今後も機会があれば、色々と教えていただきたいです。
あと、分析は実にわかりやすく、的確です。
私もそういった分析能力を身につけていけるようにがんばります。
では、ありがとうございました。
> and又orを使用する際はどのように記述すればいいんでしょか?
使用している言語にもよりますが、例えば、このような形になります。
≪VBScript≫の例
| Dim X, Y
| X = 1
| Y = 2
| If (X = 1) And (Y = 1) Then
| :
| End If
| If (X = 1) Or (Y = 1) Then
| :
| End If
≪JScript≫の例
| var X = 1;
| var Y = 2;
| if( (X == 1) && (Y == 1) )
| {
| :
| }
| if( (X == 1) || (Y == 1) )
| {
| :
| }
≪JScript.NET≫の例
| var X : int = 1;
| var Y : int = 2;
| if( (X == 1) && (Y == 1) )
| {
| :
| }
| if( (X == 1) || (Y == 1) )
| {
| :
| }
≪PerlScript≫の例
| my $X = 1;
| my $Y = 2;
| if (($X eq 1) and ($Y eq 2))
| {
| :
| }
| if (($X eq 1) or ($Y eq 1))
| {
| :
| }
下記で質問させて頂いた件、解決いたしました。
ありがとうございました。
ハマーさん、
成功しましたか!
まずはお疲れさまでした。
さて、今後の意思疎通がより円滑になればよいと思い、ずれがなぜ起きたのか少し整理
してみました。
★☆
[ 状況 ]
まず、わたしの頭で「 WSH = wscript.exe/cscript.exe をスクリプトホストとして
JScript や VBScript 言語のプログラム X を実行することである」という思考が悪さを
して、以下のハマーさんの記述を読んで、HTML ファイルの SCRIPT タグに書き込まれた
JScript スクリプトとは別に X がいて、それが項番 (1) の「WSH のファイルなのか」、
と自動思考をしてしまいました。
(1) JavaScript と WSH のファイルは別にしておりまして
(2) WSH を呼び出す
(3) WSH での呼び出しは可能なのですか?
(4) WSH 内で呼び出しても
(5) JScript 内での WSH 処理が可能みたい
(6) という JS で WSH を使っているんです
(7) このまま WSH に入れても
ですが X がどう実行されるのかという情報がなかったために、続く「ファイル名を変数
として読み込む」ことの意味も問題の要点も分かりませんでした。
その後にお話が進む中で以下のキーとなる要素が分かって、ファイル構成、配置、スク
リプトの実行モデル (実行されるされ方) が明確になりました。そこから先は意思疎通
のずれはゼロになったとおもいます。
(a) WSH は WScript.Shell (Windows Script Host 製品をインストール時にバンドルさ
れている Component Object Model の一つ) そのものかそれを利用した手続きを格納し
ている JScript ファイル (.js) あるいは WScript.Shell オブジェクトを使用した手続
き一般のことを指している。
(b) JScript ファイルの実行環境であるスクリプトホストはウェブブラウザ (Internet
Explorer で wscript.exe/cscript.exe ではない。
(c) ファイルが分かれているのは SCRIPT タグの SRC フィールドを使って外部ファイル
をインクルードしているからである。
[ 分析 ]
以上の整理した結果を眺めてくると、どうすれば意思疎通のずれを小さくあるいはなく
せるのかヒントが見えてきます。
(a) は、人によって言葉の定義や理解や使い方は千差万別であることを踏まえると「自
分の頭の中の言葉の定義と相手のそれとは一緒かもしれないし違うかもしれない」ぐら
いな気持ちをもって臨めばよいと思います。言葉の理解度の高い低いをもちだす前に。
(b), (c) は、いわゆる実行される文脈の話をしています。どういう環境で何のスクリプ
トがどう実行されるか。たぶんここは日本語での説明に加えて、実際に動かしているス
クリプト(ファイルが複数あれば全部) を両者で共有することによって説明を補完できる
可能性を秘めていると思われます。
実際 (b) はファイル数、ファイル名の拡張子やファイルの内容から分かりますし、(c)
も内容から分かります。仮に説明が十分とは言えなくともプログラムそのものが補完し
てくれています。
[ さいごに ]
今後は、実行される文脈というものをなるべく表に出して課題や問題を共有していける
といいですね。
★☆
> もしや、先生などされてるのでは?
いえいえ、ソフトウェア開発を伴うプロジェクトに従事しております。お客様やプロジェ
クトメンバと意思疎通をはかっていますが、意思疎通は実にむずかしい。
日々発見があり修行の毎日です。
こんにちわ。
ご質問させていただきたいのですが、if文を使用する際、
and又orを使用する際はどのように記述すればいいんでしょか?
お願いいたします。
>いりやさん
ありがとうございます。
返事が遅れて申し訳ございません。
http://www002.upp.so-net.ne.jp/umiumi/
早速、調査してみたいと思います。
また何かありましたら書き込みさせていただきます。
はじめまして
WSH初心者のものです。
WSHでアプリケーションの制御をしようと思い、
<script language=VBScript>
<!--
-->
</script>
の中にRUNメソッドを使ってアプリケーションを起動するよう書いたのですが、アプリケーション起動後、その中のボタンを自動的に選択して、
押す方法がわかりません。
どうかよろしくおねがいします。
>いりやさん
ありがとうございます!
おかげさまで変数の割り当てに成功しました!
いりやさんの説明が実にわかりやすかったからです!
もしや、先生などされてるのでは?
>いりやさん
ありがとうございます!
今卒業研究の最中でして、CGIではなくJScriptを使用しての受け渡しに挑戦していまして、
一応の知識のみで形作りをしていましたので全く理解できていませんでした。
こんな私の説明でお聞きしたいことが理解いただけて本当に感謝します!
今日はバイトのため今からすぐに試すことができませんが、帰ってから早速試してみたいと思います。
本当にありがとうございます。
後者の winOpen() では、c:\ というディレクトリ情報を objFai.text から得た値に付加していません。だから後者の winOpen() を採用する場合は、objFai.text がファイルのフルパス情報を持っていることが前提となります。(c:\ベンゼン環.doc という風に)
補足でした。
ハマーさん、
いえいえ、こちらこそご面倒をおかけしています。でもコミュニケーション上の距離も
ずいぶん縮まったとおもいません??
「+objFai+の部分で表示されるファイル名を変数としてwinOpen.jsに読み込みコマンド
を押すことによってファイル名を読み込んでそのファイルを開ける」
をもう少し書き下すと、
(1) 画面には objFai.text の値が表示されている。今仮に objFai.text == 'ベンゼン
環.doc' としましょう。
(2) ウェブ画面からアンカー ベンゼン環.doc をクリックする。
(3) IE のスクリプトエンジンが onClick イベントのアクションを実行する
(4) winOpen() (in winOpen.js) を実行する
(4-1) ベンゼン環.doc から 'c:\ベンゼン環.doc' というパス文字列を生成する
(4-2) WSH Shell>>run() メソッドを使って 'c:\ベンゼン環.doc' を開く。
こんな感じでしょうか。
[ 問題 (にたいするわたしの理解) ]
現状のつくりは onClick イベントのアクションが winOpen() という風に引数がゼロで
あるため、winOpen に 'ベンゼン環' という情報が渡っていない。winOpen() 内部では
どういうファイルかという入力がないためにコマンドラインをおこせない。
[ 方式案 ]
(a) グローバル変数に値を保持して winOpen() 内部で参照する
disp() を実行するときに生成する objFai 変数に代入される
objNod.selectSingleNode("failname") が返すオブジェクトをグローバル変数 X に代入
しておく。winOpen() で X.text という名前で参照できるので、それを使って run() メ
ソッドの引数に与えるパス情報を組み立てる、というやり方。
(b) objFai.text の値を winOpen() の引数に渡して winOpen() 内部で参照する
アンカー要素 (A) のアクションに登録するとき this にアンカー要素 (A) へのリファ
レンスが代入される。
objFai.text の値 (ここでは 'ベンゼン環.doc' という文字列) は、その innerText 属
性として引き出せるのでそれを使う、というやり方。winOpen() は単に引数で与えられ
た文字列データをつかって、パス情報を組み立てる。
[ 実現例 ]
(a) は、前回の投函で差し上げたものですが、ここでは (b) をご紹介します。((a) に
ついてはぜひご自分でお試しになってください。)
変更箇所
writeln("<td><a href=\"\" onClick=\"winOpen()\">" + objFai.text + "</a></td>");
を
writeln("<td><a href=\"\" onClick=\"winOpen(this.innerText)\">" + objFai.text + "</a></td>");
にする。
function winOpen(){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("word.exe C:\\変数(ファイル名)")
}
を
function winOpen(s){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("word.exe C:\\" + s)
}
にする。ただ、ファイル名を指定して実行画面 から
word.exe c:\ベンゼン環.doc
で起動するかどうか分からないのと、ファイル名に空白が入る可能性を踏まえると、
function doubleQuote(s) {
var q = String.fromCharCode(34);
return q + s + q;
}
function winOpen(s) {
var aCommandLine =doubleQuote(s);
new ActiveXObject('WScript.Shell').run(aCommandLine);
}
で置き換えたほうがよいかもしれません。これはファイルの拡張子に連携するアプリケー
ションの起動を Windows Shell に依頼する、という方法で間接的にアプリケーションの
起動を指示する、というやり方です。但しファイル名 (引数 s) に半角のダブルクォー
テーション (") が含まれないことを仮定しています。これだけは気をつけてください。
>いりやさん
何度もすみません。
データが手元に戻ってきたので、詳細を書きます。
//
//result.js
//
function disp(){
var strCat=parent.up.fm.cat.value;
var objDoc=new ActiveXObject("Msxml2.DOMDocument");
objDoc.async=false;
objDoc.load("chemical.xml");
flg=false;
strFlt="/chemical/molecule";
if(strCat!=""){
strFlt+="[(category = '" + strCat + "')";
flg=true;
}
if(flg){strFlt+="]"};
var clnNod=objDoc.selectNodes(strFlt);
with(parent.down.document){
open("text/html");
writeln("<html><head><title>検索結果</title>");
writeln("<script language=\"JavaScript\" src=\"winOpen.js\"></script>");
writeln("<link rel=\"stylesheet\" type=\"text/css\" href=\"chemical.css\" />");
writeln("</head><body>");
writeln("<table border='1'><tr>");
writeln("<tr><th>名称</th><th>分子式</th><th>ファイル名</th>");
writeln("<th>カテゴリ</th><th>その他</th></tr>"); for(i=0;i<clnNod.length;i++){
objNod=clnNod.item(i);
objNam=objNod.selectSingleNode("name");
objDat=objNod.selectSingleNode("date");
objFai=objNod.selectSingleNode("failname");
objCat=objNod.selectSingleNode("category");
objPub=objNod.selectSingleNode("publish");
writeln("<tr>");
writeln("<td>" + objNam.text + "</td>");
writeln("<td>" + objDat.text + "</td>");
writeln("<td><a href=\"\" onClick=\"winOpen()\">" + objFai.text + "</a></td>");
writeln("<td>" + objCat.text + "</td>");
writeln("<td>" + objPub.text + "</td>");
writeln("</tr>");
}
writeln("</table></body></html>");
close();
}
}
//
//winOpen.js
//
function winOpen(){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("word.exe C:\\変数(ファイル名)")
}
function voi()
{}
という形で2つのJSを使っています。
これをresult.jsでchemical.xmlのデータを読み込んで表示はできるのですが、
+objFai+の部分で表示されるファイル名を変数としてwinOpen.jsに読み込み
コマンドを押すことによってファイル名を読み込んでそのファイルを開けるというものにしたいのです。
このデータの場合どのようにしたらよいでしょうか?
お手間とらせてすみませんが、教えていただけないでしょうか?
ハマーさん、
以下のような構成を前提にしてわたしの理解を書いています。
ハマーさんのやりたいことというのは、wsh.js の中で test.html のある SCRIPT タグ
で囲まれたところで使用されている変数 GlobalDictionary を参照できないか? という
風に理解しましたがこちらであっていますか??
であれば、その変数が ECMAScript の仕様でいうところの Global code において var
で宣言されていれば SCRIPT タグをまたいで相互に参照可能です。(添付したスクリプト
で wsh.js 中においてちゃんと GlobalDictionary 変数が参照されていることがご確認
できます)
この Global code の詳細は端折ります。いまは「関数定義の外でぐらいに思ってくださ
い。そこで質問ですが、ハマーさんのスクリプトでたびたび出現する objNam, objDat,
objFai, objCat, objPub 変数はどこで宣言されているのでしょうか?? もし、ある関数
定義中のローカル変数として定義されているようでしたら、関数定義の外で宣言してみ
て動作を切り分けていただけませんか?? それでうまくいけばたぶんそうではないかと思
われます。
実際は SCRIPT タグの置かれる位置によって実行される順番というものを考慮せねばな
らないのですがとりいそぎ要点だけかきました。
//
// test.html
//
<HTML>
<HEAD>
<TITLE>WScript.Shell>>run()の試験</TITLE>
</HEAD>
<SCRIPT SRC='.\wsh.js'>
</SCRIPT>
<SCRIPT LANGUAGE='JavaScript'>
<!--
var GlobalDictionary = new Dictionary();
GlobalDictionary.add('一', 'one');
function Dictionary() {
this.add = function (key, value) { this[key] = value }
}
//-->
</SCRIPT>
<BODY>
<UL>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\0.doc</A></FONT>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\1.doc</A></FONT>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\2.doc</A></FONT>
</UL>
</BODY>
</HTML>
//
//
//
//
// wsh.js
//
function doubleQuote(s) {
var q = String.fromCharCode(34);
return q + s + q;
}
function invokeRunMethod(filePath) {
alert('一 : ' + GlobalDictionary['一']); // GlobalDictionary 変数にアクセスできるか検査
var aCommandLine =doubleQuote(filePath);
new ActiveXObject('WScript.Shell').run(aCommandLine);
}
//
//
//
>いりやさん
function winOpen(){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("word.exe C:\\デスクトップ\\○○.txt")
}
function voi()
{}
といった形で書いたWSHを、読み込むXMLのカテゴリ名に合わせて変わるように「○○.txt」の部分を変数に置き換えたいんです。
XMLのカテゴリ名を読み込むJScriptのオブジェクト名が「objFai.txt」なんですが
このままWSHに入れてもエラーになるんです。。。
ハマーさん、
情報ありがとうございます。
>コマンドプロンプトというよりはWORDを立ち上げて変数をファイルとした方がわかりやすいですか?
一式あるのが一番です (^^; でもだんだんわかってきました。
>いりやさん
HTMLファイルのスクリプトタグに囲まれているのは後半部分のJScript部分のみです。
+objFai+の宣言該当箇所は後半部分のJSにあります。
Runメソッドは前半部分(WSHShell)にありまして、文字列は(変数)以外はそのままです。
コマンドプロンプトというよりはWORDを立ち上げて変数をファイルとした方がわかりやすいですか?
ハマーさん、
両方とも一つの HTML ファイルのスクリプトタグに囲まれたところに記されているのでしょうか。あと「+objFai+という名前でJScript内で宣言しているわけですが」という JScript の該当箇所ぬきだすことは可能でしょうか。
最終的に run() メソッドにどういう文字列が渡っていればありがたいのか、ちょっとずつみえてきたようにおもいます。
>いりやさん
function winOpen(){
WSHShell = new ActiveXObject("WScript.Shell")
WSHShell.Run("CMD.EXE C:\\変数(ファイル名)")
}
function voi()
{}
というJSでWSHを使っているんです。
JScriptファイルは部分的ですが
writeln("<td>" + objNam.text + "</td>");
writeln("<td>" + objDat.text + "</td>");
writeln("<td><a href=\"\" onClick=\"winOpen()\">" + objFai.text + "</a></td>");
writeln("<td>" + objCat.text + "</td>");
writeln("<td>" + objPub.text + "</td>");
writeln("</tr>");
といった感じです。
これより前の部分はXMLファイル読み込みとオブジェクトの作成くらいです。
これでわかりますか?
ハマーさん、
おてすきのときでよいのでよろしければ。
たぶん「JScript内での変数名をそのままWSHでの呼び出し」この記述の意味するところがポイントだと理解はしているのですが、プログラムへのマッピングがうむむ、なので。
>いりやさん
申し訳ありませんが今はお見せできないんです。
データが手元にないもので。。。
WSHについて調べようと思ってWeb閲覧してたらこの掲示板を発見したもので。。。
プログラムを見せていただいて思ったのですが、JScript内でのWSH処理が可能みたいですね?
データベースを介しての使用なので、ややこしいと思ったんですが。
ハマーさん、
.HTM と .JS 両方ともおみせいただくことは可能ですか? 何となくみえてきているのですが・・・。
>いりやさん
ありがとうございます。
今現在行っているのはJavaScriptとWSHのファイルは別にしておりまして、
JavaScriptの中でWSHを呼び出すという形を取っています。
ですのでJScript内での変数名をそのままWSHでの呼び出しは可能なのですか?
+objFai+という名前でJScript内で宣言しているわけですが、WSH内で
呼び出してもエラーになるんです。
わかりにくくてすみません。
あるいはこんなかんじかな?
<HTML>
<HEAD>
<TITLE>WScript.Shell>>run()の試験</TITLE>
</HEAD>
<SCRIPT LANGUAGE='JavaScript'>
<!--
function doubleQuote(s) {
var q = String.fromCharCode(34);
return q + s + q;
}
function invokeRunMethod(filePath) {
var aCommandLine =doubleQuote(filePath);
new ActiveXObject('WScript.Shell').run(aCommandLine);
}
//-->
</SCRIPT>
<BODY>
<UL>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\0.doc</A></FONT>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\1.doc</A></FONT>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\2.doc</A></FONT>
<LI><FONT COLOR=#0000FF><A ONCLICK='invokeRunMethod(this.innerText)'>c:\tmp\3.doc</A></FONT>
</UL>
</BODY>
</HTML>