X



お前ら、wsh使ってますか? Part8

■ このスレッドは過去ログ倉庫に格納されています
2010/12/19(日) 22:20:35ID:SZFqF39w
こんなことコンピュータにやらせろよ。そう思ったことはありませんか?
簡易的な実行環境も含めて普通のOSだったら当たり前に備わっている自動実行。
Windowsの標準に備わっているそれがWSH(Windows Script Host)です。
また、ここではWSHだけに限らずWMI、ADSIなどのネタもOKです。

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

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

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

前スレ
お前ら、wsh使ってますか? Part7
http://hibari.2ch.net/test/read.cgi/win/1190548945/
2011/02/14(月) 17:13:42ID:MBnaCfqF
コロンだっちゃ
2011/02/14(月) 19:39:06ID:IB1nvu1Z
>>52
JavaScriptだとWEB関連でJSだとあやしいのがひっかかり検索しにくい困ったところ
2011/02/15(火) 02:33:03ID:5kt/fSLl
ちょっと教えてください。
時刻の文字列から、合計の秒数を計算して表示しようとしてるのだけれど、数字によって表示がおかしくなります。
何か大事なことを忘れてるんでしょうか?
わけがわからないです。

oshl=new ActiveXObject('WScript.Shell');
var nsec=33.48 ;
nsec=nsec + 60;
oshl.popup(nsec);/ * なにも文字を付け足さないと表示は問題ない * /;
oshl.popup(nsec +''+ " 60を足した結果に、文字を付け足すと数字がおかしくなる");

var nsec=33.48 ;
nsec=nsec + 100;
oshl.popup(nsec);/ * なにも文字を付け足さないと表示は問題ない * /;
oshl.popup(nsec +''+ " 100を足した結果に、文字を付け足しても数字がおかしくならない");
5655
垢版 |
2011/02/15(火) 02:49:44ID:5kt/fSLl
わかりにくいかもしれないんで、書き直します。たとえば、関数の戻り値がおかしくなっちゃうのです。

test=function(n){
return( "合計 "+ (33.48 + n)+ "" + " 秒です");
};

oshl=new ActiveXObject('WScript.Shell');

n=60;
oshl.popup( test(n));// この場合は、数字がおかしい。

n=100;
oshl.popup( test(n));// この場合は、数字は問題ない。
5755
垢版 |
2011/02/15(火) 03:13:19ID:5kt/fSLl
ぐぐったら、これがjavascriptの仕様なんだとw そ、そんな馬鹿なと思ったけど。
少数を含む数値を1000倍にしといて整数にしてから計算して、1000で割ることにしました。まんどくせえw

test=function(n){
return( "合計 "+ (33.48 + n)+ "" + " 秒です");
};

test2=function(n){
return( "合計 "+ (((33.48)*1000 + (n*1000))/1000)+ "" + " 秒です");
};

oshl=new ActiveXObject('WScript.Shell');

n=60;
oshl.popup( test(n));// 数字がおかしい。

n=60;
oshl.popup( test2(n));// 数字は問題ない。
2011/02/15(火) 11:21:20ID:KQK8NgNf
nが文字列になる瞬間に数字が変わってるね。
「return n;」だと異常ないのに、「return n+"";」だと循環小数になる。
こっちでもっと良い解決方法が無いか15分くらい探してみたけど、見付からなかった……。

あと、returnは関数ではなくて文なので、「return(n);」でなくて「return n;」の方が良いと思う。
2011/02/15(火) 11:26:34ID:KQK8NgNf
「return n;」の前に「n+=33.48;」って書いて説明するの忘れてた……。

function test(n){
n+=33.48;
//return n;/*93.48*/
//return n+"";/*93.47999999999999*/
return "合計"+n+"秒です";
};
var oshl=new ActiveXObject('WScript.Shell');
oshl.Popup(test(60));
2011/02/15(火) 17:27:27ID:63WoE9G3
俺はVBSがメインでJSは多少しか使わないんだけど
MsgBox関数に相当するようなのはJSでは何?

デバッグ用によく使うんだけど、JS使うときいつも困る。
2011/02/15(火) 18:31:31ID:Sw9YlaCV
WScript.Echo()
2011/02/15(火) 18:33:56ID:S4MkxuXz
>>59
return "合計"+Math.ceil(n*1000)/1000+"秒です";
2011/02/15(火) 18:45:58ID:ohiLAigb
// スクリプトコントロールのVbscriptで逃げられるかと思ったら、引き算がアウトだった。
// nilscriptもjscriptと同じく駄目。dmscriptで試すと、引き算を除いて、問題なしだった。
oshl=new ActiveXObject('WScript.Shell');
ovbscript=new ActiveXObject('ScriptControl');
ovbscript.Language = 'VBScript';
ovbscript.AddCode("Function vbscriptexecute(scommand):dim sret:Execute scommand:vbscriptexecute=sret:End Function");

sreteval=function(scommand){return ovbscript.Run('vbscriptexecute',scommand);};
2011/02/15(火) 18:47:51ID:ohiLAigb
n=33.48; nplus=60;
oshl.popup( (n + nplus)); oshl.popup( (n + nplus) + "どうですかjs");
oshl.popup( sreteval('n=33.48:nplus=60:sret=(n + nplus) & "どうですかvbs"'));
oshl.popup( sreteval('sret= (33.48 + 60) & "どうですかvbs"'));

n=1.01; nplus=1.1;
oshl.popup( (n + nplus)); oshl.popup( (n + nplus) + "どうですかjs");
oshl.popup( sreteval('n=1.01:nplus=1.1:sret=(n + nplus) & "どうですかvbs"'));
oshl.popup( sreteval('sret= (1.01 + 1.1) & "どうですかvbs"'));

n=1.01; nplus=-1.1;
oshl.popup( (n + nplus)); oshl.popup( (n + nplus) + "どうですかjs");
oshl.popup( sreteval('n=1.01:nplus=-1.1:sret=(n + nplus) & "どうですかvbs"'));
oshl.popup( sreteval('sret= ((1.01 - 1.1)+0.01) & "どうですかvbs"'));
2011/02/15(火) 19:02:44ID:ohiLAigb
@set @SHORT_CIRCUIT = true/* & (@title batdm:%~nx0) & (@dm.exe "%~f0" %*) & (@goto :eof) & @end */
// d-monkeyのdmscriptでも一行バッチが動いたわ。jscriptでも起動の部分だけ変えると動くね。
2011/02/15(火) 22:18:48ID:qdYN7Y8/
>>60
cscriptからだとダイアログ絡みはオブジェクトの管轄になっちゃう
俺はダイアログ使うようなのはVBS、テキストフィルタみたいなのはJSでやってるかな
2011/02/16(水) 14:03:18ID:9iSQ4aMo
>>60
関数作ればいいじゃん。
function msgbox(s,n){new ActiveXObject('WScript.Shell').Popup(s,n);};

msgbox("www");
2011/02/19(土) 10:10:15ID:QTF/dNrf
スクリプトコンポーネント(WSC)内部から
呼び出し元のコンテキスト(グローバルオブジェクト)を取得することってできるかな。
WSC内のグローバルオブジェクトと
呼び出し元(例えばWSH)のグローバルオブジェクトは異なるんだよね。
現状WSH側から明示的にthisを渡しているけど、
できればこれを暗黙的にやりたいんだ。
2011/02/19(土) 10:28:51ID:QTF/dNrf
>>55
小数点の桁合わせには toFixed メソッド使うといいよ。
return "合計 "+ (33.48 + n).toFixed(2) + " 秒です";
2011/02/19(土) 20:38:09.30ID:3yL0phsS
>>68
executeglobalつかえばできるんじゃね
2011/02/19(土) 23:30:19.14ID:QTF/dNrf
>>70
WSC側でexecuteglobalを呼び出す限り
WSCのグローバルコンテキストで実行されるだけなんだよね(eval系は全部同じ)。

ちなみにJScript使っているんだけど
WSC側でevalするとWSCのグローバルコンテキストで評価される。
WSHのグローバルを受け取って(仮に変数wshに入れておくとする)
WSC側でwsh.evalとするとWSH側のグローバルコンテキストで評価される。
これをしたいがためにWSH側のグローバルオブジェクトが必要だった。
WSH側から明示的には渡せるけど、
WSC側から暗黙的に取得することは可能なのかなと思った次第っす。
2011/02/20(日) 00:27:41.73ID:yeS7euVC
通りすがりです

>>71
>WSH側から明示的には渡せるけど、
>WSC側から暗黙的に取得することは可能なのかなと思った次第っす。
これいろいろ探したけどダメだったな

>WSC側でwsh.evalとするとWSH側のグローバルコンテキストで評価される。
オレもこれやったな
wsh 側のメソッドを wsc 側で再定義して利用したとき気がついた
2011/02/20(日) 22:06:10.54ID:w/qV1CAR
classはexecuteglobalできたがwscはだめみたいね
2011/02/20(日) 22:20:30.93ID:+TcATz3w
それってWSC側で、たとえばWSHのJscriptを使ってるときには、WSCの関数の中で勝手にWScriptオブジェクトを使い、
HTAから呼び出す場合は、locationを、エディタのマクロからだとEditorオブジェクトを使えるよう出来るって話でもある?
それが出来たらシンプルになるなぁ。
でも一回は外からオブジェクトを渡さないと無理なんでしょ?
2011/02/20(日) 22:59:44.10ID:W5fSZz0V
>>69
もうちょっと教えてくれない? こういう処理でも問題ないのかな?

oshl=new ActiveXObject('WScript.Shell');

n=60;
s = "合計 "+ ((33.48 + n)-0) + " 秒です。 小数がだらだら続く・・・orz";
oshl.popup(s);

s = "合計 "+ ((33.48 + n).toFixed(13) -0) + " 秒です。.toFixed(13);トレビア〜ン!";
oshl.popup(s);

s = "合計 "+ ((33.48 + n).toFixed(14) -0) + " 秒です。.toFixed(14);・・・orz";
oshl.popup(s);

13桁にしとくと問題ないみたいだが。14桁だとまた出てくる。この境目に重大な謎が潜んでるですかね?
とりあえず((33.48 + n).toFixed(13) -0) って感じに書き換えて動かしていきます。ありがとう。
2011/02/20(日) 23:27:24.33ID:e7HEvFyX
人間の考える小数とは違うんよ。
「浮動小数点数」ってのを知っとくといいよ。
2011/02/21(月) 00:12:12.32ID:Tq0Q360t
>>76 いまぐぐってます。ありがとう。
とりあえず計算のあとには、 .toFixed(13)-0 をつけることにします。
2011/02/21(月) 01:39:52.68ID:We8Hkeyt
>>74
現状、既定のメソッドを定義して
new ActiveXObject('foo.bar')(this)
という一行で済ましているよ。
とりあえず呼び出し側のグローバルさえ渡せば
WSC内である程度自由にできるから。

呼び出し側とWSCの連係で厄介なのは
グローバルオブジェクトの交換はできても
両者のスコープは完全に独立しているってこと
関数をどちらのコンテキストで実行するかで
スコープチェーンが異なってくるんだよね。
arguments.callerとか使うとハマるwww
2011/02/21(月) 23:19:21.24ID:rbGY7ZiC
>>78
WSCへthisで渡すってか。またひとつ勉強になった。ノシ
2011/02/23(水) 01:28:34.67ID:YNUK4o1U
@set @s=1;/* & (@title batjs:%~nx0) & (@"cscript.exe" //nologo //e:jscript "%~f0" %*) & (@goto :eof) & @end */;g=GetObject("script:"+"C:\\g.wsc").init(this);

g.popup("cscriptでwscを使うバッチを1行でまとめてみた。");

/* g.wscの中身
<?xml version="1.0" encoding="shift_jis" ?>
<component><?component error="true" debug="true"?><public>
<method name="popup"/>
<method name="init"/>
</public><implements type="Behavior" id="Behavior"/>
<script language="JScript"><![CDATA[
var oshl=new ActiveXObject('WScript.Shell');
function popup(smes,nsec){return oshl.popup(smes,nsec);};
function init(othis){
if(typeof(othis.WScript)=='object'){WScript=othis.WScript;
}else if(typeof(othis.location)=='object'){location=othis.location;
};return this;
};
]]></script></component>
*/
2011/02/23(水) 01:48:39.04ID:8LTNmD8F
大したことではないけど
popup メソッドのディスパッチIDを0にしておけば、
メソッド名も省略して呼び出せるよ。
これはJScriptではなくCOMコンポーネントの規約。
2011/02/23(水) 02:42:23.12ID:uWPO9giD
wscのほうで、 <method name="init" dispid="0"/>
にしておけば、スクリプトのほうで
g=GetObject("script:"+"C:\\g.wsc")(this);
でいいってことなんだ。
それが >>78
new ActiveXObject('foo.bar')(this)
の話なわけだ。
やっと理解できたw
やっぱり晒して添削を受けてみるもんだね。ありがとう。
さっきぐぐったら英語の記事で、dispid=0 in .WSC does not work in Vista がうんたらかんたらと出てきたがワケワカメ・・・
2011/03/03(木) 17:58:00.79ID:yGt/TIu+
三陸産カットワカメ・・・
2011/03/03(木) 22:08:51.13ID:EjH1JmdG
おまえはどこのワカメじゃ!
2011/03/03(木) 22:56:09.53ID:3EDIrNbf
素人の質問ですみません。以下の記述で

〜〜〜
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

FilePATH = "C:\WINDOWS\system32\drivers\etc\hosts"
set PNTR_fullPATH = objFSO.GetAbsolutePathName( FilePath )
〜〜〜

オブジェクトがありません。: '[string: "C:\WINDOWS\system32\"]'
とエラーが返ってくるのですが、いまいち原因が分かりません。

すみませんが教えて下さい。
2011/03/03(木) 23:07:48.07ID:1OyzSADG
set要らない
2011/03/04(金) 03:21:31.70ID:wiEZLKWL
あ・・・ありがとうございます!!
2011/03/04(金) 19:46:37.57ID:tFN5KqE3
@echo off
ruby -x "%~0"
goto :exit

#!ruby
puts "hello"

で.batとrubyを混在させることができますが
同様に.vbsファイル中にbatのコードを記述するやり方があったら教えてください。
2011/03/04(金) 19:50:14.75ID:dFFRxivQ
はぁ?逆じゃね?
2011/03/04(金) 20:16:18.74ID:gkErHLUc
>>89
そうだよな

>>88
batファイルの中に vbs のコードを記述するんだろ?
>>45 とかじゃね
2011/03/04(金) 20:17:01.88ID:bG2qjjj3
100レスもないこのスレを読めばいいよ
2011/03/04(金) 20:23:04.12ID:tFN5KqE3
逆ではないです。>>88の質問の通りです。
2011/03/04(金) 20:30:56.41ID:3PGgX7eE
同様にって言うならrubyの中にbatを混在させてなきゃいけないだろ。
出来るのかどうか知らんが。

bat中にruby書いてる>>88の例から言うなら「逆に」等の接続詞が妥当。
2011/03/04(金) 21:44:20.76ID:dFFRxivQ
どっちでも>>45でええんじゃね
2011/03/04(金) 22:16:57.68ID:dFFRxivQ
中の概念崩壊?
2011/03/05(土) 00:32:27.66ID:AVPrJyfw
var str = "abc";
typeof str は "string"
str instanceof Object は False
なのに str.constructor はエラーにならず String と出る
constructor プロパティは Object のメンバーのはず。
暗黙的な new String はどこで行われている?
2011/03/05(土) 00:57:31.81ID:w8aZ0SFU
適当な考えだが、
バリアント型なんで評価時にクラスが決定されるんでないのかね。

var x ="123"; // これだと string

さらに

x++; // こうすると number になる
2011/03/05(土) 07:18:20.64ID:XA/P3Nuj
>>96
ttp://msdn.microsoft.com/ja-jp/library/0y7dd8cx.aspx

> JScript の Object は特殊です。
> オブジェクトは Object コンストラクターで作成された場合にだけ
> Object のインスタンスであると見なされます。

つまり、StringはObjectの派生であるからObjectのメソッドが使えるのだが
incetanceofがObjectの直接のインスタンス以外を
Objectのインスタンスとして認めない、という話

JSではObjectを連想配列(ハッシュ、辞書)のように使うことがあるから
そのための配慮だと思われるが、ややこしいな
2011/03/05(土) 12:00:42.65ID:AVPrJyfw
>>97,98
サンクスです。
仕様ということで頭に入れておけばいいのでしょうけれど
typeof や instanceof を使った条件分岐の際、
あいまいな理解だと予期せぬ動作を引き起こしそうですねw。
2011/03/06(日) 16:57:59.80ID:rO7bjyyi
javascriptのプロトタイプの例としてtrim()コマンドってのがあります。
ぐぐるとよく出てきます。
このようなprototypeをwscに登録して、関数やプロパティのように楽して使いたいのですが
よくわからんです。
いまの自分のwscの理解の状態は、関数やプロパティをwscに書いて、
jscriptやhtaのgetobjectから呼ぶことは出来るレベルです。
windows script component に詳しい人がいたらヒントをお願いします。
2011/03/06(日) 20:15:06.19ID:OTYUKE1n
>>100
wscは既存のオブジェクトを拡張するための機能ではないよ。
新規にオブジェクトを設計してそれをスクリプトから再利用出来るようにするもの。

君の場合、jsやvbsで拡張用のコードを用意しておいて
それをwsfやhtaから利用するほうが楽なんじゃないかな?
scriptタグを使って読み込めるからね。
質問から察するにそちらのほうが正攻法だと思う。

もちろんWSCを使って呼び出し元のオブジェクトを
無理矢理拡張できないこともないけど。
2011/03/06(日) 22:39:37.78ID:0PSkRQeX
WSC prototypeでぐぐって見たら、
ttp://moz-addon.g.hatena.ne.jp/ZIGOROu/?word=*[WSC]
が引っかかりました。wsc経由でも、prototypeが使えるらしい。  やった!w
・・・が細かい記述はなし。
あと、スクリプト内部の外部ファイル化も出来るらしい。試したら・・・出来た!w
<property name="test0"/>
<script language="JScript" src='./test0.js'/>
これ便利だわw

prototypeが出来るか?もうちょっと粘ってみます。
2011/03/06(日) 23:21:41.58ID:OTYUKE1n
>>102
ひとつ言っておくけど
wscのグローバルコンテキストと呼び出し元のそれとは異なるからね。
つまりwsc内のStringオブジェクトのプロトタイプを拡張しても
呼び出し元のStringオブジェクトには使えないということ。
まあ試せるだけ試して、また来なさいな。
2011/03/07(月) 00:34:09.18ID:cQcCMBvw
たしかにw WSFかHTAでやったほうがいいね。WSFなら<job>と<script src=....>タグで包めばいいだけだものね。
<job><script src=./test0.js /><script src=./prototype0.js /><script>

s=" Trim WSH ";
oshl=new ActiveXObject('WScript.Shell');
test0.alert3("WSFから読み込んで実行" + "\n" + s +"\n" + s.trim());
test0.表示する2("---"+ s +"---\n" +"---"+ s.をトリム()+"---");

/*
// test0.jsの中身
test0={
alert3 : function(s){oshl.popup(s,3);},
表示する2 : function(s){oshl.popup(s+"\n\n"+s);}
};
// prototype0.jsの中身
trim = function(){return this.replace(/^[ \t ]+/,'').replace(/[ \t ]*$/,'');};
String.prototype.trim = trim; String.prototype.をトリム = trim;
*/
</script></job>
2011/03/07(月) 03:50:20.20ID:cQcCMBvw
結論を先に言うと、WSCに書いたprototypeのtrimを、WSC側だけでなく、スクリプト本体からも使えるようですw!
スクリプト本体からGetObjectでWSCに送るオブジェクト this にprototypeを付け足せばOKのようです。
 
で、下記のサンプルのjsファイルと同じフォルダに、別記のthistest.wsc ファイルと
wscに読み込むための test1.js ファイルを置いて試して見て下さい。
trimとコマンドラインの引数を表示するサンプルです。
とりあえず動くようなんでこれで問題ないかな?と思ってるんですけど、どうかな?
2011/03/07(月) 03:52:33.62ID:cQcCMBvw
main=function(){
s=" test ";
sTrim= "TrimBefore==="+s +"==="+"\n";
sTrim+="TrimAfter ==="+s.trim()+"==="+"\n";
sTrim+="TrimAfter ==="+s.をトリム()+"==="+"\n";
sTrim+="TrimAfter ==="+funsub(s)+"==="+"\n";
oshl.popup("trim()のテスト\n\n"+ s + "\n\n"+ sTrim);
test1.alert3(" --- コマンドラインの引数argcl=\n" + argcl.join("\n"));
test1.表示2( 3333 );
n = ( 999 + 1000 ).を表示(); sss=(" 終了です " + n ).を表示();
oshl.popup("---"+sss+"---");
};

pWscのパス=WScript.Scriptfullname.replace(/^(.+)[\\]([^\\]+)$/,'$1')+"\\thistest.wsc";
GetObject("script:" + pWscのパス)(this);

funsub=function(s){return s.trim();};

main();

/*** thistest.wsc から読み込む test1.js ファイルの中身。 thistest.wscは別記する。
test1={ alert3 : function(s){oshl.popup("==="+ s.trim()+"===",3);},
表示2 : function(s){oshl.popup(s+"\n\n"+s);}
};
***/;
2011/03/07(月) 03:56:57.64ID:cQcCMBvw
<?xml version="1.0" encoding="shift_jis" ?><component><?component error="true" debug="true"?><public>
<method name="init" dispid="0"/> <property name="test1"/>
</public><implements type="Behavior" id="Behavior"/>
<script language="JScript" src='./test1.js'/>
<script language="JScript"><![CDATA[
var oshl=new ActiveXObject('WScript.Shell');
var ofso=new ActiveXObject('Scripting.FileSystemObject');
trim = function(){return this.replace(/^[ \t ]+/,'').replace(/[ \t ]*$/,'');};
String.prototype.trim = trim; String.prototype.をトリム = trim;
を表示= function(){oshl.popup(this);return this;};
String.prototype.を表示 = を表示; bWScript=false; blocation=false;

function init(ooo,sopt){
if(typeof(ooo.WScript)=='object'){
bWScript=true; WScript=ooo.WScript; ppScriptfullname=WScript.ScriptFullname;
getArgcl=function(){var aaa=[];for(var iii=0;iii<WScript.Arguments.length;iii++){aaa.push(WScript.Arguments(iii));};return aaa;};
}else if(typeof(ooo.location)=='object'){
blocation=true;location=ooo.location;ppScriptfullname=location.pathname;getArgcl=function(){var aaa=[];return aaa;};
};
ooo.test1=test1; ooo.ppScriptfullname=ppScriptfullname; ooo.argcl=getArgcl(); ooo.oshl=oshl; ooo.ofso=ofso;
ooo.String.prototype.trim = trim; ooo.String.prototype.をトリム = trim;
ooo.String.prototype.を表示 = を表示; ooo.Number.prototype.を表示 = を表示;
return this;
}; ]]></script></component>
2011/03/07(月) 19:34:50.38ID:o0m549Gn
>>105
そうですね、>>78 でも書いたけど、現時点においては
呼び出し元のグローバルオブジェクトを渡すというのが唯一の解法だと思う。
少なくとも私は他の方法を知らない。ほとんどの場合、それで事足りると思うけど、
両者のスコープは完全に独立しているという点だけは注意しておいたほうがいいよ。
コードによっては弊害が発生するから。

何か特殊なことをしたいのでなければ
このコードは明らかにwsfのほうが向いていると思うけど、
WSCの調査目的でやっているのなら、そいつはお節介かw。

2011/03/08(火) 00:08:48.35ID:hefFAWy/
昨日いろいろ試していて、>>78 new ActiveXObject('foo.bar')(this)
g=new ... というような戻り値を取らない意味がやっと理解出来ましたw
呼び出し元がWSHの場合は、thisに返すことも出来るってことですね。
>>102 のURLの中の人の解説も、今になると少しは理解できましたw

WSCを掘ってみようと思ったのは、WSHとは役目の違うAutohotkeyなどのスクリプト言語からもJscriptで作った関数を楽に使いたかったからです。
関数を一つ一つScriptControlするかという手もあるけど、ScriptControlからGetObjectで一括で取り込んでしまおう!というわけです。
WSCを経由することのスピードのロスは、自作のツールだから割り切れますんでね。
これで、Bat偽装のJscriptで作ったツールを、prototypeを除いてAutohotkeyやhtaboxコアからもほぼ同じように再利用出来ることがわかってよかったです。
このスレには、WSHやjavascript関係でググると出てくる方たちが何人か常駐してるんだろうねw
>>108 さんをはじめみなさんいろいろ教えてもらってありがとう!
2011/03/09(水) 05:55:35.07ID:Mqnv57Gr
JScriptでcatchブロックの下にあるfinallyブロックを使い、
ソースコードを定期的かつ自動的に実行したいのですが
どのように記述しするべきなのでしょうか?

ちなみにfinallyブロックはこのように記述されていて、
IEブラウザが勝手に閉じてくれます

finally{
ie.Quit();
}
2011/03/09(水) 09:22:51.55ID:yiJYnNja
try〜catch〜finally はそういう用途で使うもんじゃないんでないの
2011/03/09(水) 22:12:50.52ID:LlSweAWG
WSHでクリップボードを使おうと思って次のようなコードを書きました。
値の取得はできるのですが、値の設定がうまくいかないんです。
xxxは表示されず、それ以前にクリップボードに入れた値が表示されます。
どうすれば値の設定ができるようになりますか?

var cb = new ActiveXObject("htmlfile").parentWindow.clipboardData;
cb.setData("text", "xxx");
new ActiveXObject("WScript.Shell").popup(cb.getData("text"));
2011/03/10(木) 01:52:14.41ID:cSFmRFjD
インターネットオプション セキュリティ インターネット 低
2011/03/10(木) 05:07:35.87ID:OzXGAxB6
>>112
SFCminiのDLLをインストールしてやる方法もあるよ。

CopyPathToClipBoard.vbs

ttp://d.hatena.ne.jp/Shinez/20100730/p1
2011/03/10(木) 05:14:36.60ID:OzXGAxB6
ただこんな話もあるようですが・・・
ttp://d.hatena.ne.jp/Fio/20050321
データ実行防止
 DynaCallを使って、WSHでクリップボードを直接操作したりすることをテストしているのですが、ほんのわずかのテキストだったらいいのですが、ちょっと数が多くなるとてきめんにデータ実行防止の画面が出てきてWSHを落とされます。

 これはXPのSP2以降の機能のようですが、ウィルスでないWSHスクリプトをウィルスといっしょにすなーー
2011/03/10(木) 05:29:08.75ID:hGam45QR
>>113
about:blankを信頼済みに追加して「スクリプトによる貼り付け処理の許可」を有効にしています。
ここを無効にするとクリップボードの読み取りも不可になるのでちゃんと反映されていると思うんですが。
WSHから呼び出したときabout:blankであることは以下のコードで確認しました。
var win = new ActiveXObject("htmlfile").parentWindow;
new ActiveXObject("WScript.Shell").popup(win.location);
IEのバージョン依存とかもあるんですかね。自分の環境はIE8です。
>>113 さんの環境では値の設定もできてますか?

>>114
参照先を見てみました。今の自分にはちょっと難しそうなのでこれから勉強してみます。
2011/03/10(木) 05:55:38.56ID:/U/Q8ZHj
GetObjectだとコンピュータゾーンになるらしいけど
ただ、どっちにしてもsetDataで設定できないみたいね
InternetExplorer.Applicationとかは
2011/03/10(木) 07:37:59.38ID:TVU14U2L
about:blank の新規窓作ってスクリプトでコンテンツ作成するサイトもあるよ
2011/03/10(木) 19:31:42.80ID:hGam45QR
>>118
うう、なるほど。
about:blankだからといって安心出来ないわけですね。
2011/03/10(木) 21:23:25.37ID:cSFmRFjD
alert()はできてもprompt()はできないのと一緒
parentWindowは実際にosのwindowを持ってないからだめ
2011/03/11(金) 00:20:10.33ID:V8ey7rJ7
>>112
WSH は元々クリップボードを扱うことを想定していないから、
OLE の初期化という処理をアプリケーション側で行っていないんだよね。
だからクリップボードに値を設定することができない。
HTA のように OLE の初期化を行っているスクリプトホストであれば
>>112 のコードは正しく実行される。

じゃあ WSH では不可能なのかというと、API を直接呼び出して
WSH 上で OLE の初期化をさせてしまうという強引な方法もある。
コードの理解には DynaCall や Win32API の知識が必要になるけど、
DynaCall を登録後、以下の三行をオマジナイとして
>>112 のコードの前に追加してみてください。
WSH でもクリップボードに値を設定できるはずだよ。

var dynwrap = new ActiveXObject('DynamicWrapper');
dynwrap.register('ole32','OleInitialize','f=s','i=l','r=l');
dynwrap.OleInitialize(0);

>>114
SfcMini だとこんな感じかな。
var API = new ActiveXObject('SfcMini.DynaCall');
API.LoadLibrariesW('ole32');
API.OleInitialize(0);

ちなみに OleInitialize の戻り値は WSH では 0 だけど HTA だと 1 になる。
これは HTA が既に OLE 初期化済みですよというエラーコード。
つまり 1 が返るスクリプトホストであれば OleInitialize は不要ってこと。
OleInitialize が何をしているかについてはかなり専門的な話になるので省略。
ネットで詳細な解説を見つけるのは難しいかも。興味がある人は以下の本を読むとよろし。
http://www.amazon.co.jp/dp/4756102379
2011/03/11(金) 01:28:02.40ID:u15/Db+W
割り込みスマン。

出来たわ。そういう手もあるのか。
2011/03/12(土) 15:38:51.55ID:r5dmqnIa
メルトダウンか・・・
2011/03/12(土) 17:51:36.66ID:r5dmqnIa
お〜い、おまいら生きてるか?
2011/03/29(火) 15:01:07.19ID:LTJJZQ9e
UTF-8のtarget.csv、Shift-JISのmaster.txtがある
master.txtにはtarget.csvで置換したい文字列が入っている

target.csv
1,2,3,fuga,5
1,piyo,4,5,5
...

master.csv
hoge
fuga
piyo
...

概要
master.csvの1レコード目の値を取得(変数keyとする)
keyでtarget.csvの1行目を検索する。
HITするならnullに置換。(要は削除したい)
HITしないなら2行目。
target.csv内でループ
master.csv内でループ

問題点
文字コードが違う為、print、write、ODAの使用ができない。
(ODAは文字コード関係ないって聞いた事があったのに…)
これではソースコード内で置換できても、出力ができない上に
文字列を取得する際も文字化けしてしまっている為、処理ができない。

JAVAなんかだと文字コード変換する関数があるけど
JSCRIPTではやっぱ無理?
2011/03/29(火) 15:16:03.05ID:C2y6smjb
FSOかADODB.Stream使えばいいんじゃね?
2011/03/29(火) 17:03:21.21ID:LTJJZQ9e
>>126
両方駄目だった
UTF-8のテキストを読み込んでアラート出すと2バイト文字が化ける
2011/03/29(火) 17:11:32.48ID:C4uw/B/3
それはばけるでなくばかなんだろw
2011/03/29(火) 17:31:23.95ID:C2y6smjb
>>127
君がちゃんと使えてないだけだから頑張れ
2011/03/29(火) 17:50:11.87ID:aPraUPt/
>>129
マジで出来るのか
もう1度やってみる
ありがとう
2011/04/04(月) 21:15:15.89ID:yLz3Zj6h
wshに渡した引数のダブルクォートが消えないようにするにはどうしたらいいでしょうか。

用途はだいなファイラーの補助スクリプトです。
マクロで変換後スクリプトには"a" "b"...のように渡るのですが、これがa b...になってしまいます。
渡す文字列に半角空白が含まれている場合に不都合です。
2011/04/05(火) 10:02:01.81ID:vdfNDaB1
>>131
ダブルクォーテーションで括れば?
2011/04/05(火) 10:02:45.94ID:Pf/rrN9p
個人寄付ランキング

100億 孫正義(ソフトバンク)
10億 柳井正(ユニクロ) 三木谷浩史(楽天)
6億 ブリトニー・スピアーズ(米・歌手)
5億 似鳥昭雄(ニトリ)
2億 久米宏(アナウンサー) 中居正宏(SMAP4億、内2億)
1.2億 レディー・ガガ(米・歌手)
1億 イチロー(マリナーズ)
8000万 サンドラ・ブロック(米・俳優)
7500万 ぺヨンジュン(韓・俳優)
5000万 安室奈美恵(歌手)
3500万 浜崎あゆみ(歌手)
3200万 ジャッキー・チェン ←New
100万 堀江貴文 (ホリエモン)
33万 蛯原友里(タレント)
6万9千 内田裕也(ロック)
体で支払い 江頭2:50(タレント)
折り鶴  アブネスチャン
2011/04/05(火) 17:59:30.38ID:fuIR9JzL
>>131
マ社に入社してソースを変更しろ
他の文字に変えて全体括って戻す
環境変数で渡す
wmiでコマンドラインを取得する
135131
垢版 |
2011/04/05(火) 23:27:40.19ID:bVidqRdy
回答ありがとう。またいろいろ調べて試してくる
2011/04/16(土) 11:27:42.13ID:MufQ4JVW
ダイアログを表示させずにファイルをごみ箱へ移動するスクリプトがw2kで正常に動きません(XPだと動く)
エクスプローラでこのスクリプトにファイルをD&Dすると、ファイルの移動先が"C:\Documents and Settings\ユーザー"へ
他のファイラ(X-Finder)だと、そのファイラの実行ファイルの有るフォルダに移動します
2000で動かす方法は無いですか

var fso=new ActiveXObject("Scripting.FileSystemObject");
var args = WScript.Arguments;
var Shell=new ActiveXObject('Shell.Application');
var Folder=Shell.NameSpace(fso.GetAbsolutePathName(fso.GetParentFolderName(args(0))));
var FolderItem=Folder.Items().Item(fso.GetFileName(args(0)));
Shell.NameSpace(10).MoveHere(FolderItem);
2011/04/16(土) 15:09:10.47ID:i6zoZumo
ゴミ箱のプロパティに、確認しないようにするチェック欄あるけど、2000だとそれないの?
2011/04/16(土) 19:39:45.68ID:0UUwM/iL
Shell.NameSpace("::{645FF040-5081-101B-9F08-00AA002F954E}")
139136
垢版 |
2011/04/16(土) 22:37:16.64ID:MufQ4JVW
>>137
チェック欄を変更してみたけれど効果有りません

>>138
書き換えてみたけれど変化ありませんでした

var Shell=new ActiveXObject('Shell.Application');
WScript.echo(Shell.NameSpace("::{645FF040-5081-101B-9F08-00AA002F954E}"));
WScript.echo(Shell.NameSpace(0xa));
WScript.echo(Shell.NameSpace(10));

三つとも「ごみ箱」と出るけど、移動先が>>136になります
2011/04/16(土) 23:14:45.38ID:CtNIy87X
カレントディレクトリ変えるとか
2011/04/16(土) 23:21:20.32ID:0UUwM/iL
非同期だから待ち合わせしないとあかんみたいよ

参考ソース
ttp://www.vector.co.jp/soft/winnt/util/se427319.html
142136
垢版 |
2011/04/17(日) 00:02:04.93ID:uhTjQ+VV
>>141
136はvector(Remove.CMD)のソースをテスト用に改変したものです。Remove.CMDも2000では動きません
非同期回避のループ文が有るとファイルが本来と違う場所に移動した後でエラーを吐きます

またD&D操作でなく、スクリプト内で削除するファイルを決め打ちにするとファイルは移動もしなくなります
2000のwshバージョンを5.7に上げても効果ありませんでした
2011/04/17(日) 00:35:04.26ID:4japXLT8
copyhereは?
2011/04/17(日) 01:54:12.61ID:4japXLT8
ttp://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list39.shtml

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 22日 22時 45分 04秒
に既出やね
2011/04/17(日) 09:13:00.95ID:hP33oYWG
Shell Automation Service は
shell32.dll に実装されているけど
単にこれが古いというオチじゃないかな
まあW2K版shell32.dllのバグという見方もできるが。
強引にAPIのSHFileOperationでも使う?w
2011/04/17(日) 09:19:07.96ID:hP33oYWG
そうそう、久しぶりにMiTeC覗いたら
OLEViewerのバージョンが上がってたよ
といってもiviewers.dllは提供されていないから
基本的な性能は変わっていないんだけどw

他にも色々と有用なツールがあるから
興味がある人は覗いてみては?

http://www.mitec.cz/
2011/04/23(土) 02:18:54.08ID:4NAn1xc8
WSHでUSBポートの監視、制御ってできますか?
できるのであればAPIの宣言方法を教えて下さい
2011/04/23(土) 08:31:31.29ID:i7wvdnoN
覚えた当時文字列処理系の関数が多かったからvbsにしたんだけど
世間じゃjsが流行ってんな〜

IEのjsエンジン高速化されまくってるみたいだけど
wshでもjsのが高速だったりするの?
2011/04/23(土) 09:26:59.69ID:PDrnfeB9
>147
接続や切断ってことかい?
とりあえずRegisterDeviceNotification あたりから調べてみ。
ただ頭からケツまでAPIでゴリ押しする気なら
言語の選択を考え直したほうがいい。
C++とかで書く以上に面倒になると思うぜ。
2011/04/23(土) 10:34:29.25ID:+bpxYnWG
>>148
JSは慣れりゃVB以上に色々出来るからなあ
2011/04/23(土) 10:58:21.98ID:PDrnfeB9
>148
オレは関数型言語がキライという理由かな
だからphpも好きじゃない
あくまで書き方に限った話だがw
2011/04/23(土) 11:36:59.05ID:4NAn1xc8
>>149
thx
やりたい事が漠然としてるんでWSHでどこまでできるのか知りたかったんだ
無論Cも考えてる。ありがとうさぎ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況