こんなことコンピュータにやらせろよ。そう思ったことはありませんか?
簡易的な実行環境も含めて普通のOSだったら当たり前に備わっている自動実行。
Windowsの標準に備わっているそれがWSH(Windows Script Host)です。
また、ここではWSHだけに限らずWMI、ADSIなどのネタもOKです。
・煽りや荒らしは無視の方針で。基本的にsage進行です。
・ここでヒントを得て完成したスクリプトは、出来れば皆さんにお披露目してください。
同じことで悩んでいる人のためになります。
・質問する際は、OS及び使用するコンポーネントのバージョンもお忘れなく。
前スレ
お前ら、wsh使ってますか? Part7
http://hibari.2ch.net/test/read.cgi/win/1190548945/
言いたいことも言えないこんな世の中じゃ 乙
テンプレ乙
hosyu
Wscript.Echo("保守");
--------------------------- Windows Script Host --------------------------- スクリプト: C:\Users\10\Desktop\10.js 行: 1 文字: 1 エラー: 'Wscript' は宣言されていません。 コード: 800A1391 ソース: Microsoft JScript 実行時エラー --------------------------- OK ---------------------------
WSHで1番汎用的なのって結局vbsなんですか?
wsfだろ
14 :
12 :2010/12/30(木) 17:02:11 ID:08ofgx/l
>>13 一般的なデフォルトだと使えるのはVBSとJSCRIPTですよね?
wsfが何か解ってての発言ならそう 解ってなくての発言なら「wsfもデフォルト、しかもwsf内でVBSとJS、更に他のActiveScript対応言語が混在できる」と言っておく
日本語でおk
えっ
汎用的なんつー曖昧なことをいうからだ。 どれも何かの処理に特化したもんでもないし*それなりに*汎用的だ。
wsfはvbsより専用的? jsはvbsより専用的? 一般的なデフォルト? 特殊なデフォルト?
vbsはvbscript専用。jsはjscript専用。wsfはvbscript、jscript両用なので汎用
rubyは一般的なデフォルトで使えないから汎用的でないんだよ
>>23 デフォルトだとJSCRIPTとVBSCRIPTは使えるけど、って事?
汎用的なデフォルトは一般的でないんだよ
>>25 うん
質問が悪かった
窓APIとかWMIいじるならrubyよりVBSのがいいって事だよね?
>>28 27ではないけど、書名にあるようにRuby側から見たらあくまで「邪道」
ただRubyやPerlそのものでは無くて
ActiveScriptRubyや、PerlScriptに依存した話なら
ここで良いのではと思う
窓APIとかWMIいじるならrubyよりPowerShellがいいって事だよ
わざわざwshでrubyしていいことあるのか?
HTAでActiveScriptRubyやPerlScriptやりたいならわからんでもないが
Temporary Internet Files に溜まっている容量を食う画像ファイルの削除方 var fs = new ActiveXObject( "Scripting.FileSystemObject" ); function d1(aaa) { if(fs.FileExists(aaa)) fs.DeleteFile( aaa ); } d1( "J:/Documents and Settings/inet2004user.ZISAKUPCAT1.001/Local Settings/Temporary Internet Files/Content.IE5/07HBQI7X/*.jpg" ); d1( "J:/Documents and Settings/inet2004user.ZISAKUPCAT1.001/Local Settings/Temporary Internet Files/Content.IE5/07HBQI7X/*.gif" ); d1( "J:/Documents and Settings/inet2004user.ZISAKUPCAT1.001/Local Settings/Temporary Internet Files/Content.IE5/09CZH168/*.jpg" ); d1( "J:/Documents and Settings/inet2004user.ZISAKUPCAT1.001/Local Settings/Temporary Internet Files/Content.IE5/09CZH168/*.gif" ); たらたら スマートではないな。
環境変数くらい使えw
そんなもんバッチファイルでやれや
バッチファイルとかDOS窓ひらくじゃん
それくらい最小化すればええがな
むしろ俺はWSHもcscriptでやるし、wscriptでもmsgbox表示するぞ 何かしらの表示があったほうが進行状況が分かって個人的に安心できる
いみふ 日本語使え
わかるだろw
color f0 ってやれば気にならねーよ
ついでに title Temporary Internet Files に溜まっている容量を食う画像ファイルを削除中です...
>>38 バッチファイルからCSCRIPT.EXEで.vbsファイルを呼び出す手法は、私も良く使うほうだな。
個人的にはバッチファイルならJSかな @if (0)==(0) @echo off cscript.exe "%~f0" //Nologo //J:JScript %* goto :EOF @end var args = new Enumerator(WScript.Arguments) この辺まで個人的にテンプレ文だわ
>>44 //Jてなんだよ
やっぱバッチもVBSが楽だな
rem; & @cscript.exe "%~f0" //Nologo //E:VBScript %* & @goto :EOF
俺は拡張子でwscript.exeとcscript.exeを使い分けてる .vbs、.js、.wshはwscript.exe、.vbc、.jcs、.cshはcscript.exeってね C Shell等、別な物と被るなら他の拡張子でもいいし エディタが拡張子で言語見分けてるから、.bat拡張子だと 中身がJSやVBSでもバッチファイルの強調表示や入力補完になっちゃうし
>>45 ごめん間違えたw Eで合ってる
VBSだとそういう書き方になるんだな
// jscriptでも1行でいけるね @if (0)==(0) (@cscript.exe "%~f0" //nologo //e:jscript %*) & (@goto :eof) & @end for(var iii=0;iii<WScript.Arguments.length;iii++){ WScript.Echo(iii + '-'+ WScript.Arguments(iii));}; new ActiveXObject('WScript.Shell').popup(WScript.Arguments.length);
それほどの事でもないだろ
>>45 remの後って、セミコロン?
; だと上手く行かなくて、^ に変えたら上手く行ったんだけど…
昔はVBSのほうがドキュメントもそろってたけど、もう立場は逆転した感じ。
コロンだっちゃ
>>52 JavaScriptだとWEB関連でJSだとあやしいのがひっかかり検索しにくい困ったところ
ちょっと教えてください。 時刻の文字列から、合計の秒数を計算して表示しようとしてるのだけれど、数字によって表示がおかしくなります。 何か大事なことを忘れてるんでしょうか? わけがわからないです。 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を足した結果に、文字を付け足しても数字がおかしくならない");
56 :
55 :2011/02/15(火) 02:49:44 ID: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));// この場合は、数字は問題ない。
57 :
55 :2011/02/15(火) 03:13:19 ID: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));// 数字は問題ない。
nが文字列になる瞬間に数字が変わってるね。 「return n;」だと異常ないのに、「return n+"";」だと循環小数になる。 こっちでもっと良い解決方法が無いか15分くらい探してみたけど、見付からなかった……。 あと、returnは関数ではなくて文なので、「return(n);」でなくて「return n;」の方が良いと思う。
「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));
俺はVBSがメインでJSは多少しか使わないんだけど MsgBox関数に相当するようなのはJSでは何? デバッグ用によく使うんだけど、JS使うときいつも困る。
WScript.Echo()
>>59 return "合計"+Math.ceil(n*1000)/1000+"秒です";
// スクリプトコントロールの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);};
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"'));
@set @SHORT_CIRCUIT = true/* & (@title batdm:%~nx0) & (@dm.exe "%~f0" %*) & (@goto :eof) & @end */ // d-monkeyのdmscriptでも一行バッチが動いたわ。jscriptでも起動の部分だけ変えると動くね。
>>60 cscriptからだとダイアログ絡みはオブジェクトの管轄になっちゃう
俺はダイアログ使うようなのはVBS、テキストフィルタみたいなのはJSでやってるかな
>>60 関数作ればいいじゃん。
function msgbox(s,n){new ActiveXObject('WScript.Shell').Popup(s,n);};
msgbox("www");
スクリプトコンポーネント(WSC)内部から 呼び出し元のコンテキスト(グローバルオブジェクト)を取得することってできるかな。 WSC内のグローバルオブジェクトと 呼び出し元(例えばWSH)のグローバルオブジェクトは異なるんだよね。 現状WSH側から明示的にthisを渡しているけど、 できればこれを暗黙的にやりたいんだ。
>>55 小数点の桁合わせには toFixed メソッド使うといいよ。
return "合計 "+ (33.48 + n).toFixed(2) + " 秒です";
>>68 executeglobalつかえばできるんじゃね
>>70 WSC側でexecuteglobalを呼び出す限り
WSCのグローバルコンテキストで実行されるだけなんだよね(eval系は全部同じ)。
ちなみにJScript使っているんだけど
WSC側でevalするとWSCのグローバルコンテキストで評価される。
WSHのグローバルを受け取って(仮に変数wshに入れておくとする)
WSC側でwsh.evalとするとWSH側のグローバルコンテキストで評価される。
これをしたいがためにWSH側のグローバルオブジェクトが必要だった。
WSH側から明示的には渡せるけど、
WSC側から暗黙的に取得することは可能なのかなと思った次第っす。
通りすがりです
>>71 >WSH側から明示的には渡せるけど、
>WSC側から暗黙的に取得することは可能なのかなと思った次第っす。
これいろいろ探したけどダメだったな
>WSC側でwsh.evalとするとWSH側のグローバルコンテキストで評価される。
オレもこれやったな
wsh 側のメソッドを wsc 側で再定義して利用したとき気がついた
classはexecuteglobalできたがwscはだめみたいね
それってWSC側で、たとえばWSHのJscriptを使ってるときには、WSCの関数の中で勝手にWScriptオブジェクトを使い、 HTAから呼び出す場合は、locationを、エディタのマクロからだとEditorオブジェクトを使えるよう出来るって話でもある? それが出来たらシンプルになるなぁ。 でも一回は外からオブジェクトを渡さないと無理なんでしょ?
>>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) って感じに書き換えて動かしていきます。ありがとう。
人間の考える小数とは違うんよ。 「浮動小数点数」ってのを知っとくといいよ。
>>76 いまぐぐってます。ありがとう。
とりあえず計算のあとには、 .toFixed(13)-0 をつけることにします。
>>74 現状、既定のメソッドを定義して
new ActiveXObject('foo.bar')(this)
という一行で済ましているよ。
とりあえず呼び出し側のグローバルさえ渡せば
WSC内である程度自由にできるから。
呼び出し側とWSCの連係で厄介なのは
グローバルオブジェクトの交換はできても
両者のスコープは完全に独立しているってこと
関数をどちらのコンテキストで実行するかで
スコープチェーンが異なってくるんだよね。
arguments.callerとか使うとハマるwww
>>78 WSCへthisで渡すってか。またひとつ勉強になった。ノシ
@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> */
大したことではないけど popup メソッドのディスパッチIDを0にしておけば、 メソッド名も省略して呼び出せるよ。 これはJScriptではなくCOMコンポーネントの規約。
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 がうんたらかんたらと出てきたがワケワカメ・・・
三陸産カットワカメ・・・
おまえはどこのワカメじゃ!
素人の質問ですみません。以下の記述で 〜〜〜 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") FilePATH = "C:\WINDOWS\system32\drivers\etc\hosts" set PNTR_fullPATH = objFSO.GetAbsolutePathName( FilePath ) 〜〜〜 オブジェクトがありません。: '[string: "C:\WINDOWS\system32\"]' とエラーが返ってくるのですが、いまいち原因が分かりません。 すみませんが教えて下さい。
set要らない
あ・・・ありがとうございます!!
@echo off ruby -x "%~0" goto :exit #!ruby puts "hello" で.batとrubyを混在させることができますが 同様に.vbsファイル中にbatのコードを記述するやり方があったら教えてください。
はぁ?逆じゃね?
100レスもないこのスレを読めばいいよ
同様にって言うならrubyの中にbatを混在させてなきゃいけないだろ。
出来るのかどうか知らんが。
bat中にruby書いてる
>>88 の例から言うなら「逆に」等の接続詞が妥当。
中の概念崩壊?
var str = "abc"; typeof str は "string" str instanceof Object は False なのに str.constructor はエラーにならず String と出る constructor プロパティは Object のメンバーのはず。 暗黙的な new String はどこで行われている?
適当な考えだが、 バリアント型なんで評価時にクラスが決定されるんでないのかね。 var x ="123"; // これだと string さらに x++; // こうすると number になる
>>96 ttp://msdn.microsoft.com/ja-jp/library/0y7dd8cx.aspx > JScript の Object は特殊です。
> オブジェクトは Object コンストラクターで作成された場合にだけ
> Object のインスタンスであると見なされます。
つまり、StringはObjectの派生であるからObjectのメソッドが使えるのだが
incetanceofがObjectの直接のインスタンス以外を
Objectのインスタンスとして認めない、という話
JSではObjectを連想配列(ハッシュ、辞書)のように使うことがあるから
そのための配慮だと思われるが、ややこしいな
>>97 ,98
サンクスです。
仕様ということで頭に入れておけばいいのでしょうけれど
typeof や instanceof を使った条件分岐の際、
あいまいな理解だと予期せぬ動作を引き起こしそうですねw。
javascriptのプロトタイプの例としてtrim()コマンドってのがあります。 ぐぐるとよく出てきます。 このようなprototypeをwscに登録して、関数やプロパティのように楽して使いたいのですが よくわからんです。 いまの自分のwscの理解の状態は、関数やプロパティをwscに書いて、 jscriptやhtaのgetobjectから呼ぶことは出来るレベルです。 windows script component に詳しい人がいたらヒントをお願いします。
>>100 wscは既存のオブジェクトを拡張するための機能ではないよ。
新規にオブジェクトを設計してそれをスクリプトから再利用出来るようにするもの。
君の場合、jsやvbsで拡張用のコードを用意しておいて
それをwsfやhtaから利用するほうが楽なんじゃないかな?
scriptタグを使って読み込めるからね。
質問から察するにそちらのほうが正攻法だと思う。
もちろんWSCを使って呼び出し元のオブジェクトを
無理矢理拡張できないこともないけど。
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が出来るか?もうちょっと粘ってみます。
>>102 ひとつ言っておくけど
wscのグローバルコンテキストと呼び出し元のそれとは異なるからね。
つまりwsc内のStringオブジェクトのプロトタイプを拡張しても
呼び出し元のStringオブジェクトには使えないということ。
まあ試せるだけ試して、また来なさいな。
たしかに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>
結論を先に言うと、WSCに書いたprototypeのtrimを、WSC側だけでなく、スクリプト本体からも使えるようですw! スクリプト本体からGetObjectでWSCに送るオブジェクト this にprototypeを付け足せばOKのようです。 で、下記のサンプルのjsファイルと同じフォルダに、別記のthistest.wsc ファイルと wscに読み込むための test1.js ファイルを置いて試して見て下さい。 trimとコマンドラインの引数を表示するサンプルです。 とりあえず動くようなんでこれで問題ないかな?と思ってるんですけど、どうかな?
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);} }; ***/;
<?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>
>>105 そうですね、
>>78 でも書いたけど、現時点においては
呼び出し元のグローバルオブジェクトを渡すというのが唯一の解法だと思う。
少なくとも私は他の方法を知らない。ほとんどの場合、それで事足りると思うけど、
両者のスコープは完全に独立しているという点だけは注意しておいたほうがいいよ。
コードによっては弊害が発生するから。
何か特殊なことをしたいのでなければ
このコードは明らかにwsfのほうが向いていると思うけど、
WSCの調査目的でやっているのなら、そいつはお節介かw。
昨日いろいろ試していて、
>>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 さんをはじめみなさんいろいろ教えてもらってありがとう!
JScriptでcatchブロックの下にあるfinallyブロックを使い、 ソースコードを定期的かつ自動的に実行したいのですが どのように記述しするべきなのでしょうか? ちなみにfinallyブロックはこのように記述されていて、 IEブラウザが勝手に閉じてくれます finally{ ie.Quit(); }
try〜catch〜finally はそういう用途で使うもんじゃないんでないの
WSHでクリップボードを使おうと思って次のようなコードを書きました。 値の取得はできるのですが、値の設定がうまくいかないんです。 xxxは表示されず、それ以前にクリップボードに入れた値が表示されます。 どうすれば値の設定ができるようになりますか? var cb = new ActiveXObject("htmlfile").parentWindow.clipboardData; cb.setData("text", "xxx"); new ActiveXObject("WScript.Shell").popup(cb.getData("text"));
インターネットオプション セキュリティ インターネット 低
ただこんな話もあるようですが・・・
ttp://d.hatena.ne.jp/Fio/20050321 データ実行防止
DynaCallを使って、WSHでクリップボードを直接操作したりすることをテストしているのですが、ほんのわずかのテキストだったらいいのですが、ちょっと数が多くなるとてきめんにデータ実行防止の画面が出てきてWSHを落とされます。
これはXPのSP2以降の機能のようですが、ウィルスでないWSHスクリプトをウィルスといっしょにすなーー
>>113 about:blankを信頼済みに追加して「スクリプトによる貼り付け処理の許可」を有効にしています。
ここを無効にするとクリップボードの読み取りも不可になるのでちゃんと反映されていると思うんですが。
WSHから呼び出したときabout:blankであることは以下のコードで確認しました。
var win = new ActiveXObject("htmlfile").parentWindow;
new ActiveXObject("WScript.Shell").popup(win.location);
IEのバージョン依存とかもあるんですかね。自分の環境はIE8です。
>>113 さんの環境では値の設定もできてますか?
>>114 参照先を見てみました。今の自分にはちょっと難しそうなのでこれから勉強してみます。
GetObjectだとコンピュータゾーンになるらしいけど ただ、どっちにしてもsetDataで設定できないみたいね InternetExplorer.Applicationとかは
about:blank の新規窓作ってスクリプトでコンテンツ作成するサイトもあるよ
>>118 うう、なるほど。
about:blankだからといって安心出来ないわけですね。
alert()はできてもprompt()はできないのと一緒 parentWindowは実際にosのwindowを持ってないからだめ
>>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
割り込みスマン。 出来たわ。そういう手もあるのか。
メルトダウンか・・・
お〜い、おまいら生きてるか?
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ではやっぱ無理?
FSOかADODB.Stream使えばいいんじゃね?
>>126 両方駄目だった
UTF-8のテキストを読み込んでアラート出すと2バイト文字が化ける
それはばけるでなくばかなんだろw
>>127 君がちゃんと使えてないだけだから頑張れ
>>129 マジで出来るのか
もう1度やってみる
ありがとう
wshに渡した引数のダブルクォートが消えないようにするにはどうしたらいいでしょうか。 用途はだいなファイラーの補助スクリプトです。 マクロで変換後スクリプトには"a" "b"...のように渡るのですが、これがa b...になってしまいます。 渡す文字列に半角空白が含まれている場合に不都合です。
個人寄付ランキング 100億 孫正義(ソフトバンク) 10億 柳井正(ユニクロ) 三木谷浩史(楽天) 6億 ブリトニー・スピアーズ(米・歌手) 5億 似鳥昭雄(ニトリ) 2億 久米宏(アナウンサー) 中居正宏(SMAP4億、内2億) 1.2億 レディー・ガガ(米・歌手) 1億 イチロー(マリナーズ) 8000万 サンドラ・ブロック(米・俳優) 7500万 ぺヨンジュン(韓・俳優) 5000万 安室奈美恵(歌手) 3500万 浜崎あゆみ(歌手) 3200万 ジャッキー・チェン ←New 100万 堀江貴文 (ホリエモン) 33万 蛯原友里(タレント) 6万9千 内田裕也(ロック) 体で支払い 江頭2:50(タレント) 折り鶴 アブネスチャン
>>131 マ社に入社してソースを変更しろ
他の文字に変えて全体括って戻す
環境変数で渡す
wmiでコマンドラインを取得する
135 :
131 :2011/04/05(火) 23:27:40.19 ID:bVidqRdy
回答ありがとう。またいろいろ調べて試してくる
ダイアログを表示させずにファイルをごみ箱へ移動するスクリプトが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);
ゴミ箱のプロパティに、確認しないようにするチェック欄あるけど、2000だとそれないの?
Shell.NameSpace("::{645FF040-5081-101B-9F08-00AA002F954E}")
139 :
136 :2011/04/16(土) 22:37:16.64 ID: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 になります
カレントディレクトリ変えるとか
142 :
136 :2011/04/17(日) 00:02:04.93 ID:uhTjQ+VV
>>141 136はvector(Remove.CMD)のソースをテスト用に改変したものです。Remove.CMDも2000では動きません
非同期回避のループ文が有るとファイルが本来と違う場所に移動した後でエラーを吐きます
またD&D操作でなく、スクリプト内で削除するファイルを決め打ちにするとファイルは移動もしなくなります
2000のwshバージョンを5.7に上げても効果ありませんでした
copyhereは?
Shell Automation Service は shell32.dll に実装されているけど 単にこれが古いというオチじゃないかな まあW2K版shell32.dllのバグという見方もできるが。 強引にAPIのSHFileOperationでも使う?w
そうそう、久しぶりにMiTeC覗いたら
OLEViewerのバージョンが上がってたよ
といってもiviewers.dllは提供されていないから
基本的な性能は変わっていないんだけどw
他にも色々と有用なツールがあるから
興味がある人は覗いてみては?
http://www.mitec.cz/
WSHでUSBポートの監視、制御ってできますか? できるのであればAPIの宣言方法を教えて下さい
覚えた当時文字列処理系の関数が多かったからvbsにしたんだけど 世間じゃjsが流行ってんな〜 IEのjsエンジン高速化されまくってるみたいだけど wshでもjsのが高速だったりするの?
>147 接続や切断ってことかい? とりあえずRegisterDeviceNotification あたりから調べてみ。 ただ頭からケツまでAPIでゴリ押しする気なら 言語の選択を考え直したほうがいい。 C++とかで書く以上に面倒になると思うぜ。
>>148 JSは慣れりゃVB以上に色々出来るからなあ
>148 オレは関数型言語がキライという理由かな だからphpも好きじゃない あくまで書き方に限った話だがw
>>149 thx
やりたい事が漠然としてるんでWSHでどこまでできるのか知りたかったんだ
無論Cも考えてる。ありがとうさぎ
>>151 phpのどこが関数型言語の書き方なんだ…
web の cache の property を知りたくて調べて行くうちに ADSI というのにたどりついたんですが、 この方向は、正しいのでしょうか? 何か、2000のころの技術だったりするみたいですが、 これで作ってXPやVista、Win7で動くものが出来上がるのでしょうか?
155 :
154 :2011/04/24(日) 17:22:51.00 ID:dtEm5GAz
すいません。
>>2 も読まずに書き込んでしまいました。
調べていたら、どうも違っているような気がするし、
もう少し調べて出直してきます。
何か原始的なスクリプトですいませんが、これは Vista や Win7 で動くものなのでしょうか? XP や 2000 上では試したつもりです。 Option Explicit const Win2k="5.0",WinXP="5.1",WinVista="6.0",Win7="6.1" dim ver: ver=get_os_version() if ver=Win2k then msgbox "Windows 2000" elseif ver=WinXP then msgbox "XP" elseif ver=WinVista then msgbox "Vista" elseif ver=Win7 then msgbox "Windows7" end if 続く
続き function get_os_version() Dim wshell: Set wshell = CreateObject("WScript.Shell") dim objExec: Set objExec = wshell.Exec("%comspec% /c ver") dim str: str = objExec.StdOut.ReadAll str=right(str,len(str)-6) Dim regEx: Set regEx = New RegExp regEx.IgnoreCase = True: regEx.Global = False: regEx.Pattern = ".*Version *" str = regEx.Replace(str,""): str = left(str,3) get_os_version = str end function
64bitOSを想定しないのならそれでオケ。64bitかサーバーOSを想定するのならダメ。 WMIのWin32_OperatingSystemクラスを使うべきじゃないか?
>>158 使い方調べるの面倒なら単純にシステムのプロパティ-全般タブ見るという手もあるね
>>158 64bit だと。今想定している本体が、動かないだろうから。
それ以外でOKだったら大丈夫です。特殊なサーバーOSで動かす人もいないだろうし
これでOKということですね。ありがとうございました。
>>159 さんの言っていることは、私のスキルでは理解できませんが、情報ありがとうございます
画面の右下に出るリマインダーをWSHで実装できないですか? 流石にVBSからのAPIでは対応してないですかね
APIってのがWin32APIではなく COMなども含めた総合的なAPIのことなら VBSからAPI(COM)使って実現できるよ
>>162 成る程ー
WinAPIでは無理がありますか
ありがとうございましたー
ラジオボタンで選択できるインターフェースをできればvbsから関数的に呼び出して使用したい。なんかいい方法はないですか? 元々のvbsのソースが膨大なのでHTA化は避けたいです
ScriptFormとかのGUI作れるCOM使うとか 外部にラジオボタン選択インターフェイスだけのHTA作ってVBSから呼ぶとか ScriptFormはだいぶ前に公式は死んでたけど、他の所から落とせたから 今でも探せばどっかにあるんじゃないかな?
hta で vbs だけは使うまい、ておもたわ。
HTAを呼び出して選択した結果を受け取るのってどうやるの? なんか参考になるサイトとかあったら教えていただけませんでしょうか
そこまでするならpowershell使うわ
ドライブに挿入された音楽CDの CDシリアル番号を取得することってできる? cdaファイルをパースするのはナシの方向で。 というのもCDがマルチセッションだと cdaファイルにパス名でアクセス出来ないので。
170 :
169 :2011/05/27(金) 21:25:55.55 ID:jtI0zCu/
難しく考えすぎてたorz
>>171 mshtaをwscript.shellのexecで起こしてhtaから標準出力に書き出してやれば?
そこにGetStandardStreamのサンプルがあるから探してみ
>>172 WshShell.Execで窓を表示しない方法も、神ブログに書いてるけど、
お手軽方法で、別に不満なかったから、自分はあまり追求しなかったな。
HTAをオブジェとして使う事が重要なら、ぜひ追求してみるべきだろうね。
>>173 ?
mshtaはコンソールアプリでないからコンソールは出ないが?
>>174 あ゙〜、完全にわし間違ってた。173は撤回する。
勘違いというか、HTA化を避けたいと言ってる奴に IE使えってのはあり得ない話だと思うのだが
そうかvbs(wsh)からIEコンポも使っちゃいけないのか。 それはスマン。 俺はただvbsをhtaに全面書き換えるのがイヤなだけだと思ってた。
vbsをhtaにするのに、全面書き換えなんて必要ないよ 前後をタグで囲んで拡張子変えるだけで、vbs部分の書き換えなんてしなくて良い
あほは放置で
181 :
167 :2011/05/30(月) 22:59:05.05 ID:GG049trQ
>>171-179 皆様ありがとうございます。もう見放されたかと思ってましたw
HTAから標準出力を使いたかったのですが自力ではできなかったので、vb.netで挑戦しようかと考えていました。
これからレスと参考リンクを読んでいろいろやってみます。
182 :
名無し~3.EXE :2011/05/31(火) 16:40:25.93 ID:K7148uoi
ぐぐってたら、javascriptとQTを使えるスクリプトエンジンが出てたよ。Qtjsって奴。WinでもLinuxでもMacでも動くそうだ。
ttp://www.vector.co.jp/vpack/browse/person/an054784.html ttp://qt.loftz.net/ XPで試したら素直に動いたわ。日本語使うならUTF-8で保存。
Titaniumもあるし、Htaboxcoreもあるし、javascriptの世界は広がりますね。
// sample.qtjs
var _window=QWidget();
_window.setWindowTitle("test window");
_window.setGeometry(100,100,220,100);
var _edit=QTextEdit(_window);
_edit.setGeometry(100,30,90,50);
var _b1=QPushButton("button 1",_window);
var _b2=QPushButton("button 2",_window);
_b1.move(10,30);
_b2.move(10,60);
_b1.connect("clicked",_edit,function(){@setText("button 111")});
_b2.connect("clicked",_edit,function(){@setText("button 222")});
var _label=QLabel("button text",_window);
_label.move(10,10);
_window.show();
sys.exec();
>>182 QtはマルチプラットフォームだけどqtjsはMAC対応してないよ
jsの汎用性は凄いよねー
>>182 処理が比較的早く、簡単にGUIツールが作成できるのはいいが、
結局、クライアント(実行するPC)にもQtjs.exeがないとダメって事じゃん
これは微妙かも。あくまで自分のPCでGUI使ってなんかツール作りたい時は便利かもだけど、
オレオレツールって自分が理解してればいいからわざわざGUIにしなくてもって思うわ
あと、ショートカットリンクから実行しても動かない。
これじゃ使えないわ。cmdショートカットなら動くんだろうけど
[Window Title]
X:\Qtjs\qtjs_win_20110529_rev37_qt4_7_2_gcc\qtjs.exe
[Content]
X:\Qtjs\qtjs_win_20110529_rev37_qt4_7_2_gcc\qtjs.exe は有効な Win32 アプリケーションではありません。
185 :
184 :2011/05/31(火) 23:29:37.09 ID:9cCA8ild
悪い、変なエラーが出てて気になって再起動したら Blue Screen Of DEATH食らった Windows7はBlue Screen Of DEATHにならないって聞いてたけど あれは嘘なんだなw (まぁ青画面になっても死なないようにはなってるみたいだけど) 復旧せずに通常起動後に実行したら普通にショートカットからでも起動した QtjsはC++利用だからマウス操作の自動化処理もJavaScriptで書けるって事なのかな? 何か従来のWSHより全然汎用的でビビったわ 慣れれば間違いなくWSHよりQtjsのがいいね
// <job id='qtjs'><resource id='qtjs'><![CDATA[;;; // sample.wsf としてUTF-8で保存。これを起動すると、最初の起動はWSHで実行して、下のパスのQtjs.exeで再実行する形になる。関連付けしてなくても動く。 var label = QLabel("Hello, world!"+"\n\n"+"ポポポポ〜ん!"); label.show(); sys.exec(); // // ]]></resource><script> /* ここからはjscript。関連付け無しでも実行できるようにする処理。var pqtjsexeでQtjs.exeのパスを決め、そのexeでスクリプトを実行する。*/; if(typeof(WScript)=='object'){ //var pqtjsexe="V:\\Script_Qtjs_Win\\Qtjs.exe";/ * パスを決めうちの場合 * /; var oshl=new ActiveXObject("WScript.Shell"); var ofso=new ActiveXObject("Scripting.FileSystemObject"); var pdirscript = ofso.GetFile(WScript.ScriptFullname).ParentFolder; var pqtjsexe=pdirscript + "\\Qtjs.exe";/ * 同じフォルダにqtjs.exeの環境がある場合 * /; oshl.run("\""+pqtjsexe+"\""+ " " + "\""+ WScript.ScriptFullName+"\"",1,false); }; //</script></job>
上の奴は、拡張子Qtjsを関連付けしてる場合は、ファイル名の拡張子を.qtjsで保存すればそのまま動くよ。 スクリプトの最後のほうを変えればWSHから引数も引き継げると思う。 for(var arg=WScript.Arguments,iii=0,sadd='';iii<arg.length;iii++){sadd+=" " + "\""+ arg(iii)+"\"";}; oshl.run("\""+pqtjsexe+"\""+ " " + "\""+ WScript.ScriptFullName+"\""+" "+sadd,1,false);
>>183 ほんとだ。Macは対応してなかったw スマソ
>>187 拡張子設定すりゃいいだけか!thx
最近出だばっかみたいだけど、これからに期待だわ
いい加減スレチだけど、過疎気味だからいいかw
オレオレツールがGUIでサクッと作れて簡単なコーディングで色々出来るのがいい
ActiveXからCODのMessage使ってメール送信してるんですが 受信したメールを転送できなくさせるプロパティや別の方法ありませんか? ご教示を…
もうちっと背景を晒せ なぜメールを送りたいのか 相手は人間なのか 相手はどんなツールで転送するのか 相手が転送したら何がまずいのか
192 :
190 :2011/06/02(木) 22:58:43.37 ID:ls1CRCom
>>191 >なぜメールを送りたいのか
システム上で使用する為
>相手は人間なのか
受信者は人間
>相手はどんなツールで転送するのか
超マイナーなメーラ
>相手が転送したら何がまずいのか
セキュリティ上の問題
本文コピペすりゃ意味ないんだけどねw
簡単に概略を説明を付け足す
VB系言語で使用しており、現に正常に機能している。
VB内でActiveXのCODオブジェクトを使用し、Message関数でメールをSMPT送信している。
この部分に機能を追加すると言う意味です。
欲しい機能は、受信者がそのメールを転送できなくする事。
メール送信時にMessage関数のプロパティとかで付加できないかなぁと淡い期待をいだいている。
そもそもメールが転送できなくなる機能がメールプロトコルに存在した事すら今日知った。
メールのオプションで「重要」とか「受信者がメール開いたら送信者へ受信確認を行う」とかの設定あるでしょ?
あんな感じで「転送不可」にする設定があるらしい。
それをWSHやらのWindows Scriptでちょちょいとハックしてやりたい。
193 :
190 :2011/06/03(金) 21:55:17.68 ID:0Ff8pwrr
解決した Message.Sensitivityでできる ただSMTP送信ではムリだったので諦めてVBのSendで結局やる事になりそうだわ
Sensitivityって、ほとんどOutllookでしかサポートされてないのとちゃう?
195 :
190 :2011/06/04(土) 11:53:30.64 ID:tAuxhA3v
>>194 OL以外でもSensitivityが機能するメーラがあるんだな、これが
まぁ、普通はこんな機能使わないし本文コピペできるから意味ないけどw
basp21のdllでメールの送受信するスクリプト書いてます。 sslの処理は、melonにお願いしてpop3で受信してます。 メールの受信でほかにもっと便利なActiveXのDLLはあるんでしょうか?
いくらでもあるけど、何を以て便利と感じるかは人それぞれ なので、いろいろ使って自分が一番便利だと思うのを使えば良い
IE9を入れるとmshta.exeがバージョンアップし sfcminiのCallBackが利かなくなるんだが 誰が解決策を見つけた人がいたら教えて。 何らかのセキュリティ制限に掛かっていると思うんだが。
wsc
>199 UIはどうするの?
まじかす
>>153 PHPでも関数使えるでしょ(´・ω・`)
関数が使えるから関数型言語ってw そんなアホなこと言う奴まだいたんだw
JScriptを使い始めたんですが 関数の引数に使用できるオブジェクトの一覧みたいなのないですか? ある関数Aでオブジェクト作って、それを引数にして別の関数Bに投げて、 戻り値をAでまた処理する〜みたいなことをやってるんですが オブジェクトによって引数にできるものとできないものがあるみたいで… 試行錯誤してるうちに、ArrayオブジェクトとStringオブジェクトは使えるけど FileSystemObject オブジェクトからGetFolderメソッドで取得したフォルダオブジェクトは使えない〜みたいな経験則は分かってきたんですが 時間がかかりすぎるんで一括で知りたいんです でもういうドキュメントが見つからなくて…… ご存知でしたら教えくてください
どんなオブジェクトでも関数の引数に使用できるが? 使えない〜って〜のがわからん
Default Property のことだな。 そんなモン使うな。
Default Propertyがあるとオブジェクトそのものが渡せんてこと? ならDefault Propertyがあるオブジェクトの一覧がほしいってこと?
210 :
206 :2011/07/06(水) 12:23:31.80 ID:skFqsTsw
サーセン、なんか今日書き直してみたら普通にフォルダオブジェクトも渡せました
別の部分が間違ってたみたいです
>>208 使うとなんかマズイですか?
>>207 ,209
とりあえずどんなオブジェクトでも渡せるってことが分かれば十分です
ありがとうございました
色々弄繰り回してたら、wshで出来ないことを探す方が難しいかもしれないと思い始めている自分がいる...
wshでできることよりできないことのほうが多いが?
バイナリ扱えないし
>>213 何のためにバイナリを扱うの?
用途によっては、バイナリが扱えなくても、操作は出来たりするよ
バイナリくらい扱えないでwsh使ってるような顔するんじゃねーよ
ADO.Streamでバイナリ扱えるが
どちらも正しい WSHでは何も出来ない、バイナリも扱えない 出来るのはちょっとした計算と文字列操作、そしてそれをメッセージボックスやコンソールに表示する程度 でもWSHにはActiveXという強力なAPIがある これを使えばほぼ何でも出来る COMの自作が出来るようになれば、「出来ないことの方が多い」なんてことは無くなる 但し、COMの自作が出来る奴が、WSHに拘る必要は無いと思うけどね
218 :
名無し~3.EXE :2011/08/04(木) 08:08:20.71 ID:yS1szih7
>>217 COM自作するんだったら最初からCだよな
COMも便利だけど
ファイルを開く/保存ダイアログをXP限定じゃなく標準で使えるようにしてほしい
>>217 別に自分でCOMを作らなくても、誰かが作ってるさ...とか思ったりして...
ある意味、非常に正しいオブジェクト指向だが...
>>219 標準のPowerShellで使えるからWSHからRun/Execすれば使える
標準の.NETでdll作ればWSHで使える
officeが入ってればcommon dialog ocxが使えるんじゃなかった?
t
227 :
名無し~3.EXE :2011/08/26(金) 15:20:07.29 ID:LvLtNN8d
Shiftキー押してるかどうかで挙動を変えたいんだけどどうすればいいの?
>>227 Keycode
てかどっからのイベントなんだよ?
htmlなのかアイコン押下時からなのか
htaとかのキーイベント内での判定なら event.shiftKey で取れると思うけど、 コンソールのプログラムでのやり方は分からない
Windows7のタスクバーからワンクリックでごみ箱を削除するために以下
Empty.CMD 1.05 (ごみ箱を空にするバッチファイルとVBScript)
http://www.vector.co.jp/soft/win95/util/se313491.html ※bat版とvbs版それぞれに確認ダイアログの有無違いで2種の計4種、機能は同じ
を試してみたのですが、XP機では問題なく動作するものがWin7では動作しません
削除の確認は必要でbat窓は不要なためvbs版を使いたいのですが
Win7で正常に動作させるためには何か修正が必要なのでしょうか?
「wsh ごみ箱 空」等のキーワードで複数ggってみたのですが原因らしいものが掴めません
ggった中でYahoo知恵遅れでは上記ファイルがWin7で正常に動作したという書き込みも見たのですが
手元のXP機とWin7機の確認ではWin7機だけどうしても動作してくれません
XPと7でのWSH互換性などといった問題は特に無いようなのですが
手ほどきお願いします
環境で書き忘れましたがXPも7も32bitです
そして書ききれなかった上記ファイルの「削除前に確認ダイアログを表示するvbs」のソースです
' EmptyF.VBS V1.05 (C)
[email protected] 2007-12-14
' EmptyF.VBS empties RecylcleBin.
' Usage: EmptyF.VBS
Option Explicit
Const ssfBITBUCKET=10
Dim fso
Dim Shell
Dim Folder
Dim FolderItem
Dim sFolder
Set fso=CreateObject("Scripting.FileSystemObject") Set Shell=CreateObject("Shell.Application") Set Folder=Shell.NameSpace(ssfBITBUCKET) For Each FolderItem In Folder.Items() If fso.FileExists(FolderItem.Path) Then fso.DeleteFile FolderItem.Path,True ElseIf fso.FolderExists(FolderItem.Path) Then fso.DeleteFolder FolderItem.Path,True End If Next If Folder.Items().Count=0 Then Set sFolder=Shell.NameSpace(WScript.ScriptFullName & "\..") Folder.MoveHere sFolder.Items().Item(WScript.ScriptName) Do While Not sFolder.Items().Item(WScript.ScriptName) Is Nothing WScript.Sleep 100 Loop sFolder.MoveHere Folder.Items().Item(0) End If ----------- ここまで
Set sFolder=Shell.NameSpace(WScript.ScriptFullName & "\..") が駄目なんだろ Set sFolder=Shell.NameSpace(fso.getparentfoldername(WScript.ScriptFullName)) にしろ
>>233 ありがとう!
Win7でもvbs実行で正常にごみ箱が空になりました
>>233 せっかく教えてもらったのに確認ダイアログが出るコードはこちらでした orz
-----------------------------------------------------------
Option Explicit
Dim Folder
Set Folder=CreateObject("Shell.Application").NameSpace(10)
If Folder.Items().Count=0 Then
WScript.Echo "ごみ箱は空です。"
Else
Folder.Self.InvokeVerb "ごみ箱を空にする(&B)"
End If
------------------------------------------------------------
申し訳ないですが↑のどこが悪いのか教えてください
>>235 Windows 7 だと、InvokeVerb がうまく動かなくて、DoIt() を使うといいらしい
という情報があって、ちょっと試してみたんだけど、
-----------------------------------------------------------
Dim Folder
Set Folder=CreateObject("Shell.Application").NameSpace(10)
If Folder.Items().Count=0 Then
WScript.Echo "ごみ箱は空です。"
Else
Folder.Self.Verbs().Item(2).DoIt() '2は3番目のメニュー項目(ゴミ箱を空にする)を表す
End If
------------------------------------------------------------
VBScript的には正しいみたいで、Win7でも、インタプリタ上からは動くんだけど、
.vbsファイルにして、cscript/wscript経由で起動すると DoIt() が反応しない
セキュリティ設定とかの問題かもしれんが、これ以上調べられなかった
>>236 ありがとうございます
自身でもわからないながら色々ggってみてはいますが
Folder.Self.InvokeVerb "ごみ箱を空にする(&B)" をとりあえずWScript.Echo "入ってますが何か?"に置き換えて
ここまではOKで、削除でコケてるということまでは理解できました
言われるようにVista以降のUAC絡みの問題なのかもしれませんが
自身でももう少し調べてみます
もし他にわかる方いらっしゃいましたら宜しくお願いします
doitに変えて 最後に msgbox "waiting" と入れれ
invokeverb "empty" に変えてもいいが、待つのは必要だな
>>238-239 変えてみましたが動きませんでした
削除されずに"waithing"が表示されるだけです
>>238 のは
>>236 の
Folder.Self.Verbs().Item(2).DoIt()
↓
Folder.Self.Verbs().Item(2).DoIt
で合ってますよね?
241 :
236 :2011/08/27(土) 13:47:03.43 ID:2AZeqjI/
>>238 非同期の問題だったとは気がつかなかった
いくつかパターンを試してみたけど、以下だと同期で処理されるみたい(Win7 x64 SP1で確認)
同期と非同期の基準が分からん
---------------------------
Dim items
Set items = CreateObject("Shell.Application").NameSpace(10).Items()
If items.Count > 0 Then
For Each verb in items.Verbs
If verb.Name = "削除(&D)" Then
verb.Doit()
End If
Next
End If
---------------------------
ありがとうございます
Win7 x86 SP1での動作もばっちりokでした!
>>236 、
>>238 のお二方に心から感謝します
おかげさまでexe化してタスクバーピン化することもできて快適になりました
"削除(&D)" て"ゴミ箱を空にする" と違うけどええの?
244 :
名無し~3.EXE :2011/08/27(土) 20:59:32.17 ID:Bo3iCK5G
>>243 参照してるオブジェクトが違う
>>241 のはゴミ箱に対するコマンドじゃなくて、ゴミ箱の中のファイル群に対するコマンドなので、
「ゴミ箱を空にする」はない
そいいう手があったんね
根拠は説明できかねますが
Win7だと何故かスクリプトからコンテキストメニューの「ごみ箱を空にする(B)」を叩くことができない
そこで
>>241 さんの手法だと
ごみ箱内のファイルをループで全選択した状態でのコンテキストメニューの「削除(D)」を叩いて空にする
といったやり方をされているようなので間違いではないはずです
できれば
>>241 さんに直接説明いただけると参考になるのですが
書いてる間に
>>244 さんがわかりやすく説明してくれていました
すみません、、、、
なら Dim items Set items = CreateObject("Shell.Application").NameSpace(10).Items() If items.Count > 0 Then items.invokeverbex "delete" End If でもいいな
>>248 うまく動作しました
ところで、パラメタ "empty" や "delete" は、どこを調べれば情報があるのでしょうか
キーワードで検索してもそれらしいものを見つけられないので
たぶん、dllの中を探せばあると思う
>>248 これも問題なく動作しました(Win7 SP1 x86)
仮にごみ箱内に1000とか大量のファイルが存在した場合
>>241 さんのようにループ回すやり方と比べて単純に"delete"とするほうが
コストはかなり低いものでしょうか?
>>250 回答ありがとう
さすがにdllの中では私には難しそうですが
>>251 >>241 のループはメニュー文字列からコンテキストメニューのインデックスを計算してるだけで、シェルに対する削除指示は1アクションのみ
ファイル毎にループして削除してるわけではない
なので、実行コストはどちらも変わらないと思う
ソース記述に関しては "delete" の方がスマートかな、とは思うけど
>>252 丁寧な解説ありがとう
つまりコンテキストメニュー内をループで"削除(D)"のインデックスを探すわけですね
変数Itemsはごみ箱内のオブジェクト数をカウントするためのものと勘違いしてました
とても勉強になりました
BSAP21使用のクリックすればメールを飛ばす.jsスクリプトファイルがあるのですが、 Windows7の64bitで動作させるとbasp21のオブジェクトが作成できないと出ます クリックして動作するようになるにはどうればいいでしょうか おたすけお願いします 環境変数に以下の二行を追加しましたが、クリックしても同エラーが出ました cscript c:\windows\SysWOW64\cscript.exe wscript c:\windows\SysWOW64\wscript.exe
>環境変数に以下の二行を追加しましたが、 この場合、環境変数が何の関係がある? 関連付けを変えろボケ
>256 メールを送るだけならCDO.Messageでいいはずだぜ 他にもたとえば圧縮するならコマンドラインの7zipっていう手もあるはず その用途だけのために関連づけを変えるのは ちょっと他のスクリプトにも影響が出そうで怖いな
HKEY_CLASSESROOT\jsfile\shell\open\command それだけならショートカット作れば?
260 :
254 :2011/09/26(月) 22:39:54.33 ID:ne+0rpvW
いろいろアドバイスありがとうございます デスクトップに置いていた.jsスクリプトファイルのショートカットをクリックしたときに 上記オブジェクトが作成できないのエラーが出ていたのですが、 .jsファイル本体をクリックした場合はエラーが出ませんでした 理由は分からないですが解決はできました。ありがとうございました。
結局64/32bitは無関係?
dosのバッチより利点は?
dosのバッチでないこと
>>262 forなど制御文は充実してる
(というかバッチにはほとんどない)
バッチよりははるかにまともな構文とライブラリ 特に文字列処理、日付処理が充実している COMが使える ただWSHはシェルスクリプト特有の省文字表記が少ないからちょっと面倒だ その意味でバッチの直系はPowerShellだな
266 :
名無し~3.EXE :2011/10/05(水) 00:46:47.20 ID:dNokulIT
msgboxをだしてok押されるまで beep音でも間欠音鳴らすには どう書けばいいのでしょうか?
WSHは便利だけど時間のかかる作業やらせた時にどの辺まで 進んでるかっていうのが見られないのがな… その点バッチは全部出るからバグ取りもやりやすい。
>>266 別プロセスでbeepしてMsgBox解ければプロセス終了
>>267 cscript使えばええだけだろぼけ
>>268 cscript使ったって一々echoしなきゃ何も出ないだろ。
元々全部出るバッチと比べるのは間違ってる。
最近メッセージ表示は nircmd trayballoonか %log%ファイルに書きこんで別窓にtail -f %log% してそっちに表示させるようにしてるな。 ちょっとした進捗はバッチだとtitleで表示させると見やすくかつ邪魔にならない。
>>266 かなり強引でお粗末だけど
Set objShell=CreateObject("Wscript.Shell")
Do While True
objShell.Run "cmd /c @echo " & chr(7), 0, true
If objShell.Popup("やらないか?",3,"確認") = 1 Then Exit Do ' 引数2で間欠時間調整/秒
loop
createobject htmlfile <sound src=hoge.wav> みたいな
>>269 だよね
取捨選択の余地も無く、表示内容の自由度もなく
他人(MS)が決めた表示形式で、不要なものまで全部出るバッチなんかより
任意のもののみ自由な形で表示できるcscriptの方が余程優れてるよね
まあバッチもecho offして任意のもののみechoすれば同じだし
俺は何もかも表示されるのはウザいから、大抵そうしてるけどな
プログラムに置いて、何処かに表示したい内容が有れば表示させる処理を書くなんてのは
当たり前のことで別に煩わしくも無いし
いや、逆なんだが… 全部出したい時にWSHじゃ困るって話。 なんかバグ抱えてる時はいちいちechoさせて調べるより ハラワタ全部さらけ出すバッチの方がわかりやすい時がある。 WSHも良く使うけどね。バッチの方が良いと思う場面もたまにあるってだけさ。
batは想定外の命令文に展開されちゃうことがあるけどwshはいらないだろ〜
くだらん
sfcminiって7の64bitでも動く? なんか特殊なことしないとダメとかある?
>>274 なんかバグ抱えてる時は、普通に実行して単に表示するだけではなく
スクリプトデバッガで実行して、ブレイクポイントやウォッチ式を使うわけだが、、、
>>280 tonks
って結局10年前のプロダクトだしなー。もう WSH は見捨てられたのか?
obsoleteだな
WinXPだって10年前のものだよな 未だに超現役だけど
現役を超えると退役だろ
285 :
名無し~3.EXE :2011/10/08(土) 23:20:26.63 ID:x/W81UVV
>>271 Popupの文字を引数で複数行書くにはどうすれば・・
"a" & vbcrlf & "b"
>>285 '1行目' + \r\n + '2行目'
aaahoga
popup([ 'hoge', 'hoge', 'hoge' ].join('\n'))
定番だけど?
定番だよね 俺はVBSだからJoin(Array(,,,),vbLf)だけど、やってることは全く同じだし
性能的に問題が出るときは.NETのStringBuilderを使うのもいいかもね Set sb=CreateObject("System.Text.StringBuilder") sb.Append_3 "hoge" & vbCrLf sb.Append_3 "hoge" & vbCrLf MsgBox sb.ToString()
負けず嫌いが多いな
負けって・・・勝ち負けだったの? というか、誰が何と勝負してるの?
wshって.netのクラスまで呼び出せるのかよ すげぇ〜
COMのクラスを提供してるものだけだろ すごかねえ
何でwmiスレなくなってしまったん? スクリーン輝度変更するスクリプトくれくれトンカツ
javascriptからきて、WHSにたどりついた自分はJscriptで勉強中なんだけど、 参考資料少なすぎ。なんで、こんなにJscriptしいたげられてるんでしょ。 javascriptを中心にアドビ系のスクリプトもこなせるし、WSHでこまごまとした 雑務もこなせて、おまけにホームページもこなせる。いいと思うんだけどなあ。 ま、ちょっとした便利な部分だけVBScriptで書いて、残りはJscriptで書くとか 抜け道はいろいろあるんだけど。
javascriptで書けばいいんじゃね
>>303 MSから説明書をダウンロードしろよ。Jscript,VBscript,WSHの解説は日本語だから大丈夫だよ。
scd56jp.exe
わざわざ古いのダウンロードせんでも、新しいのがネットで見れるだろ
わざわざレスポンスの遅いネットで見ずとも、ローカルのchmでスムーズに見れるだろ ネットがいくら速くなっても、こういうのに必要なのは速さより早さだし 速さでもメモリ上に読み込まれたchmの読み出し速度と比べたら、光回線ですら千〜万倍遅いし いくらネットの方が新しいって言ったって、WSHに限れば99.9%以上変化無しだし
scd56jp.exeの5.6はほぼWSH最終バージョンだしね
なんか載ってない記事があったけど忘れた
>>277 c:\windows\syswow64\wscript.exe
で動かすのぢゃ
関連付けを変えるのか?
そこは好きにしたらいいんじゃない? 俺はスクリプト先頭で WScript.FullName をチェックして c:\windows\syswow64\wscript.exe じゃなかったら,Run で 起動しなおしてるけど
JScriptでファイルの更新日時の比較をしたくて調べてたんですが
http://msdn.microsoft.com/ja-jp/library/ee722142.aspxに >>ミリ秒ベースの日付比較は、いずれかの Date オブジェクトに
>>午前 0 時以外の時刻が格納されている場合には正しく機能しません。
とありました。ただ実際にスクリプトを組んで動かしてみて
同日のファイル同士やコピーしたファイル同士など色々試してみたんですが
特に不具合は起きませんでした。
上のページにも、「正しく機能しません」とあるだけで具体的な説明がなくて・・・
どういう場合に正しく機能しないのでしょうか?
同じ日の異なる時間で等しいとなるのか?
>>314 多分単純に
var date1 : Date = new Date('11/16/2011 00:00:00');
var date2 : Date = new Date('11/16/2011 12:00:00');
date1.getTime() == date2.getTime(); // false
ってことだと思う。
getTime()は日付比較ではなくて日時比較ですよ、と言いたいのではないかと。
>>314 Dateオブジェクトは日付+時刻を扱うので、
2つのDateオブジェクトで 「(時刻を除いた)日付のみの比較」 を行いたい場合、
比較対象の両者の時刻を 0 にしておく必要がある
というだけでは?
不具合の説明ではなく、プログラミングの初心者に対する単なるアドバイスとしての説明に思える
もうひとつ。ファイルの更新日時を比較するんだろ? ネットワークドライブの場合、保存先のファイルシステムの制限で 1秒ぐらいズレることがあるのはしょうがない。 datediff("s", date1, date2)が2以下なら同じとみなしていくしかないか?
>>315-318 よく読み返してみたら日時じゃなくて「日付比較は〜」ってしっかり書いてありましたね
いつも日付+時間のセットで使っているのでうっかりしました。
ネットワークドライブの方でズレるというのは初めて知りました。
こちらは別に注意してみます
ありがとうございました。
320 :
名無し~3.EXE :2011/11/23(水) 06:34:21.16 ID:nwtiGPYP
電波テロ装置の戦争(始) 魂は幾何学、コピー出来る公安はサリンオウム信者の子供を40歳まで社会から隔離している オウム信者が地方で現在も潜伏している それは新興宗教を配下とする公安(慶應卒T)の仕事だ発案で盗聴器を開発したら霊魂が寄って呼ぶ来た <電波憑依> スピリチャル全否定なら江原三輪氏、高橋佳子大川隆法氏は、幻聴で強制入院矛盾する日本宗教と精神科 <コードレス盗聴> 2004既に国民20%被害250〜700台数中国工作員3〜7000万円2005ソウルコピー2010ソウルイン医者アカギ絡む<盗聴証拠> 今年5月に日本の警視庁防課は被害者SDカード15分を保持した有る国民に出せ!!<創価幹部> キタオカ1962年東北生は二十代で2人の女性をレイプ殺害して入信した創価本尊はこれだけで潰せる<<<韓国工作員鸛<<<創価公明党 <テロ装置>>東芝部品)>>ヤクザ<宗教<同和<<公安<<魂複<<官憲>日本終Googl検索
321 :
名無し~3.EXE :2011/12/01(木) 20:01:00.32 ID:mSpMO4/a BE:108486195-2BP(0)
WindowsXP Pro SP3 + WSH 5.7
test.js に、フルパスが258Byte以上のファイルをD&Dすると、
WScript.Arguments(i) がバラバラになってしまいます。(日本語は2Byteとして計算)
何とかこれを、バラバラにせずに処理する方法はないでしょうか?
よろしくお願いします。
322 :
321 :2011/12/01(木) 21:02:02.93 ID:mSpMO4/a BE:195275399-2BP(0)
WMIService.ExecQueryでwscript.exeを検索して、CommandLineを見てみても、
"が外されてバラバラになっています。
また、Argumentsでも、WMIでもフルパスが長いと後ろの方が切れてしまうようです。
>>321 2byte文字をAsciiにエンコードするとか
それってだれの制限なの?
ファイル名を指定して実行にドロップしたらどうなる? それで駄目ならドラッグ&ドロップできんてことだろ?
ショートパス名使えば?
327 :
321 :2011/12/02(金) 19:28:41.17 ID:2Ca29Y9K
windowsのファイルパス名の最大長は256 Bytes(MAX_PATH=256) でもAPIでのバッファ長は260 Bytesだから、ファイル移動とかで 256-259Bytesになることはある。 ただし、256Bytesを超えるファイルパスは削除とかできなくなるのは有名。 CMD.exeもこの制限を免れることはできない。
329 :
321 :2011/12/03(土) 04:09:16.88 ID:adpHRkP6
>>328 おぉ ありがとうございます。
ついでなので検証結果メモ。(WindowsXP Professional SP3 + NTFS 3.1(5.1))
フルパスに半角スペースを含まない(=D&D時、引数が「"」で囲まれない)場合
・フルパスが259Byte以下ならD&D正常 開く・移動・削除可能
・フルパスが260Byte以上ならD&D異常 開く・移動・削除不能
フルパスに半角スペースを含む(=D&D時、引数が「"」で囲まれる)場合
・フルパスが257Byte以下ならD&D正常 開く・移動・削除可能
・フルパスが258〜259ByteならD&D異常 開く・移動・削除可能
・フルパスが260Byte以上ならD&D異常 開く・移動・削除不能
330 :
321 :2011/12/03(土) 04:25:57.01 ID:adpHRkP6
あれ 日本語を含む場合、開く・移動・削除は300Byte以上でもできた
Bytesじゃなくて文字数だったかもしれん。 あと、WIN32APIのMAX_APTHは260だった。(MAX_FNAMEが256) ただしNTFSの制限は確か32767だったと思うので、64bit Windows(WIN64API)はまた別かも知れん。 まあC++言語とか使う人じゃなかったら意味ないdefine値だが。
あっ、NTFSのMFTはは内部Unicode(UTF-16)だった。(なのでwindowsでの取り扱いも同様) なので260はUnicodeでのカウントであり、Bytesにすると520Bytesだね。 あと、32767はNTFSのパス名の制限であり(とはいえwindowsでは扱えない) ファイル名、フォルダ名は255文字までなのでお間違えなく。
ただMAX_PATHが260だとしても、windowsの内部でどうAPIが使われているのか 不明なので正確な制限はexplorerその他の作りにもよるので 使うものを自分で調べるしかないのかも。
>>321 ちゅーかなぜ258byteものパスを作れてしまったのかを
追求もすべきじゃね? その原因を防がないと再発するだろ。
subst使えば?
OLEのドラッグ&ドロップ用インターフェイスを実装できれば MAX_PATHからは解放されるんだけどね。
>>336 それはパス名取得にWINAPIを使わずに独自にファイルシステムへの
アクセスを構築するってことか?
FSへのアクセスでWINAPIを使わないなんてDISK解析ツール並みだな。
この制限をほぼ 32,000 ワイド文字へ拡張するには
>>336 それって何を作ればいいの?
デスクトップ上でのドラッグドロップってexplorerの機能じゃなかったっけ?
explorer作れってこと?
wshのドロップハンドラはバグってるからな 代わりに使えるまともなドロップハンドラがほしいな
341 :
321 :2011/12/05(月) 18:31:33.54 ID:heCA4j0r
「wscript.exe "〜.js"」へのショートカットファイルに、D&Dすると問題ないようです。 ちなみに、D&Dしたファイルは 「C:\Documents and Settings\root\My Documents\MSDN\DropMyRights\引数の最後で権限を指 定 N=NormalUser(制限付きユーザーアカウント相当), C=ConstrainedUser(アクセストー クンのSIDを制限した更に制限されたアカウント ファイルの入出力もできない), U=Untrus tedUser(殆ど動かない) 省略するとNになる.txt」 です。(改行含まず)
exeなんかのドロップハンドラだな wshの関連付けを変えてみ たしか別の問題であかんかったはず
C:\Documents and Settings\user\Desktop\foo.js をダブルクリックで開こうとするとファイルパスのスペースのせい?で 「"C:\Documents" にファイル拡張子がありません。」 と言われます。 C:\Documents and Settings\user\Desktop上で開きたいのですがどうすればいいですか? foo.jsの中身は WScript.Echo("Hello World!"); です。 初歩的なことだと思いますがよろしくお願いします。
WSHの問題じゃない 関連付けを直せ
345 :
343 :2012/01/04(水) 12:21:16.45 ID:kJQWcUz6
エラーメッセージのダイアログのタイトルは「Windows Script Host」です。 このファイルの種類を開くプログラムは「Microsoft (R) Windows Based Script Host」です。 どのプログラムに関連付ければいいんですか?
意味がわかりました。できました。すみません。ありがとうございます。
>>346 解決策くらい書いてけよ
どうせダブルクォーテーション抜けてただけなんだろうけど
無用
>>348 自己解決しましたはリソースのゴミになる事もしらないのか?
ほら、ゴミだ
最初から一貫して
>>344 のレスを受けてできたと書いてあるだけで
自己解決したなんて一言も書いてないし実際に自己解決でもないよねこれ
回答レスに対してできたとレスがある。それで完結してるわけだし。
ただ煽りたいだけなんだろうけど曲解した上に執拗すぎる
347からここまでリソースのゴミ
神経質なクソムシを放し飼いにしている池沼夫婦が一番のゴミ
ゴミの話はすれ違いなので他所でやってくれ
コントロールパネルの拡張子cplファイルをスクリプトで実行したいのですが、どう記述すればいいのでしょうか? system32上の実体パスを直接Runしてみましたが「アプリケーションに関連付けられていません」と叱られてしまいました windows7 64bitです
自己解決しました control をつけたら動作しました
すれ違い wshと関係ない
すみません。主戦場適当なJavaScriptをWebに埋め込むくらいだから詳細不明で教えてくれくれ。 単純な自分だけのバックアップスクリプト作ろうと思ってるんだけど、可能だよね? ・特定のフォルダを常駐監視 ・特定フォルダにファイル、フォルダが入ってきたらサーバーにコピー ・できればそれをメールで通知 ざっと調べたところではできそうな気がしてるけど、できないことってあるんだろうか。 Javascriptでローカルのファイルの書き換えとかが面倒、みたいな。
全部出来るよ FSOとかCDO.Messageとかの超基礎的なCOM使うだけで簡単に
>>361 だよね。なんかこんなことに何十万か金を払うとか言ってるばかがいるから
自分でやろうかと思ってるけど、やるとまたそのシステムのメンテとかやらされる
んだろうなあ。俺にその金をよこせ、と言いたい。
ありがとうございます。頑張ってみます。
>>362 JScriptね
スクリプト何か書ける人なら1時間あれば余裕で完成するレベル
>>俺にその金をよこせ、と言いたい。 いや、やるんなら言いましょうよ。
JScriptはちょっとできるんだけど、文献少ないんだよね。 今まで作ったもの、練習にVBで作ってみよう!
InternetExplorer.Applicationを利用する際にページの読み込みが完了したかどうかを busyやdocument.readyStateで判断するサンプルを見かけますが、ページの読み込みが 完了した後にJavaScriptを実行しページに変更があっても上記のプロパティには変化が ないのですが、JavaScriptによる変更が反映されたかどうか確認するには どうしたらいいのでしょうか? 現在は特定のidを持ったタグ(Element)が追加されるのをwhileでまっているのですが 他に方法があるのなら知りたいです。よろしくお願いします。
すみません忘れていました IEのバージョンは8.0.6001.18702、cscript.exeのバージョンは5.7です 古いIEでは動かなくても構いません。8で判断する方法をご存知の方がいましたら教えてください。
最小再現コードを示せ
待つようなものじゃないけどな
既に操作は可能になってるわけだしね
Perlで直接取りに行くってのは?
373 :
367 :2012/01/24(火) 15:31:05.50 ID:4k51VPeE
すみませんbusyプロパティは変化していました。setTimeout()で指定した秒数 > WScript.Sleep()で
指定した秒数になっていたので関数が呼び出される前にbusyプロパティを見ていたif文を
抜けていました。ごめんなさい
一応以下が気になっていた処理です。 busyが変化しないならIsScriptRunnigのようなプロパティやメソッドが
存在するのかもと思いお尋ねしました。
[操作するページ]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd ">
<html xmlns="
http://www.w3.org/1999/xhtml " xml:lang="ja" lang="ja">
<head>
<script type="text/javascript">
function insert_element(){
// innerHTMLの書き換えまでのウエイト。このfor文自体に意味はないです。
for (var i = 0; i < 800; i++)
{
for (var j = 0; j < 10000; j++) { }
}
var parent_element = document.getElementById('main');
parent_element.innerHTML = '<p id="new_element">new</p>';
}
</script>
</head>
<body><div id="main"><p> </p></div></body></html>
374 :
367 :2012/01/24(火) 15:32:29.04 ID:4k51VPeE
<?xml version="1.0" encoding="UTF-8"?>
<job>
<script language="jscript">
<![CDATA[
var objIE = WScript.CreateObject("InternetExplorer.Application");
// このURLは私の環境でのもの
objIE.Navigate("
http://localhost/test/wsh_test.html ");
objIE.Visible = true;
while(objIE.busy || objIE.document.readyState != "complete"){ WScript.Sleep(1000); };
// ページの読み込みが完了したのでページ内のJavaScriptの関数を呼び出す
objIE.document.Script.setTimeout("javascript:insert_element();", 100);
// 関数の呼び出しを待つ
WScript.Sleep(100);
WScript.Echo("関数を呼び出しました");
// 関数が呼び出されただけでは下のプロパティには変化がない。
while(objIE.busy || objIE.document.readyState != "complete"){
WScript.Echo("wait...");
WScript.Sleep(1000);
};
// insert_element()の処理内容がページに反映されていないので取得できない
var target = objIE.document.getElementById("new_element");
if (!target)
WScript.Echo('idがnew_elemntのタグは存在しません');
375 :
367 :2012/01/24(火) 15:34:29.39 ID:4k51VPeE
[操作するコード続き] // ----------------------------------------------------------- // ここからが別の方法があるのか知りたかった待機処理 while(true) { WScript.Sleep(1000); var target = objIE.document.getElementById("new_element"); if (target && target.innerText.match(/new/i)) { WScript.Echo('タグが見つかりました'); break; } } // ----------------------------------------------------------- // ここでtargetに対する操作 objIE.Quit(); ]]> </script> </job>
なんかアホみたいな気がする
最適な助言は、アホなことはやめる
なんでsettimeout使うんだ?
// 24時間つけっ放しの電気ポットの消費電力は、冷蔵庫と同等なので // 朝使う直前に加熱するようにタイマーをセットすれば // 節電を実現しつつ、朝熱いコーヒーが飲めれる。
// タイガーのポットには6,9時間タイマーが憑いているが // タイマーの刻時が完了する1時間前に加熱が始まることを考慮して // パソコンを夜に人生だらだらと使っている人が // 6,9時間タイマーをいつセットすればいいかを表示するフログラム。
using System; using System.Text; using System.Drawing; using System.Windows.Forms; public class Test : Form { [STAThread]
static void Main() { DateTime dtNow = DateTime.Now; int hour_min = dtNow.Hour*60 + dtNow.Minute; if ( hour_min < 1*60+40 ) { MessageBox.Show("ポットのタイマーの6時間セット予定"); System.Threading.Thread.Sleep(60000*(100-hour_min)); MessageBox.Show("ポットのタイマーの6時間セット"); }
dtNow = DateTime.Now; hour_min = dtNow.Hour*60 + dtNow.Minute; if ( hour_min < 22*60+40 ) { MessageBox.Show("ポットのタイマーの9時間セット予定"); System.Threading.Thread.Sleep(60000*(22*60+40-hour_min)); MessageBox.Show("ポットのタイマーの9時間セット"); }
dtNow = DateTime.Now; hour_min = dtNow.Hour*60 + dtNow.Minute; if ( hour_min > 22*60+40-1 ) { MessageBox.Show("ポットのタイマーの6時間セット予定"); System.Threading.Thread.Sleep(60000*(24*60-hour_min+1*60+40)); MessageBox.Show("ポットのタイマーの6時間セット"); } } }
// C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:winexe PM1040AM0140pot.cs // レベルが低いと2ちゃん人生つらいよ。
なにこのスレチガイ
お兄さん”キ”が抜けてますよ
settimeoutを使わずに読み込んだページのjavascrptの関数を呼ぶ方法ってあるんですか? アホなことはやめます。それ知りたいです。
何故呼び出した関数を待つ必要があるのか伝わらなかったようなので敢えて書きましたが 読み出す方のページも編集できるならこんなことしてませんよ
やっぱりあほだったw なぜできないと思うんだ?やってみれば?
今までは、xmlの処理の仕方は、url に適当な物が入っているとして Set objxml = CreateObject("MSXML2.XMLHTTP") 'Set objxml = CreateObject("Microsoft.XMLHTTP") objxml.Open "GET", url, False objxml.Send として、objxml.responseText を実際には正規表現で処理していました これを以下のようにして 'Set xDoc = CreateObject("MSXML.DOMDocument") Set xDoc = CreateObject("MSXML2.DOMDocument") xDoc.async = False If xDoc.Load(url) Then Else 'エラー処理 end if にして後は、標準的なxml処理を勉強して書き換えようと思っています。 この方法が標準的な物かどうか良く分かりませんが、MSや他のサイトで実際の例が多いので しかし、今までは処理の過程で変なことになったとき(例えば日付のデータが半年以上前) そういう風な情報と共に objxm.responseText をmsgboxで出力していました。 新しいやり方で.responseText に対応する物はどうやって得られるのでしょうか? 自分なりに検索して見ましたが、よく分かりません
既出だったら申し訳ない Windows 8って(特にDPインスコした方)VBScript動く?
>>392 互換性命のMSがそんなに早く切るとでも?
WSHはメジャー更新が無くなって10年以上経つんだよ そろそろ切っても、全然「早い」うちに入らないし、 今までも10年未満で切ってきたものは腐るほどあるし
すみません。どなたか叡智をご披露ください。
Win7でWSH使ってますが、cscript.exeで使っているスクリプトをちょっと改変して
ファイルをドラッグアンドドロップして作動する作りにしようといろいろ苦闘してみましたが、
どうもできず、ならばいっそドラッグアンドドロップでcscript.exeから作動するように
設定したいのですが、どうやらバグで自分でレジストリを書き換えろ、とGoogle様は
おっしゃいます。
http://support.microsoft.com/kb/981847/ja いじるのはやぶさかではありませんが、見るといろいろいじるみたいで、若干
不安。なにか特徴的にほかに重大な影響与えたりするんですかね、、、。
テストマシンではないので、不安定なのは避けたいかなあと思っておりまして、、、、、、。
batでも書けばいいんじゃない?
>>396 素人仕事でbatも書いてはいるんですが、すでにWSHで完成してるものを
わざわざまた1からというのもどうかと思い、、、、。目の前にあるこのVBS
をそのまま流用できないかと思っているわけでして。
しかも、batはbatで例の全角スペース問題があるのでまたいろいろ面倒で
もうVBSでいかせてくれ、という気分なのです。
なんでこうどれも中途半端なんですかね? M$さん。
つvbs2cmd
399 :
名無し~3.EXE :2012/02/08(水) 22:51:52.84 ID:fq1ZqKmm
>>395 何をどう苦闘してどんな結果になったから「どうもできず」という判断に至ったのかサッパリわからんわけだが……
if WScript.FullName <> "cscript.exe" then
Run "cscript.exe //nologo " & WScript.ScriptFullName & 引数
end if
みたいなことをすればいいんじゃね?
CScript.exe強制実行でぐぐれだな
いろいろありがとうございます。ちょっとアタマが痛いので、本日は失礼します。 書いてあることを参考にまたいろいろいじってみます。 ありがとうございます。あー頭が痛い。もう仕事やだorz
>>395 > いじるのはやぶさかではありませんが、見るといろいろいじるみたいで
色々って…お前全然文章読んでないだろ。
2か所を一文字変えるだけだろが。
403 :
395 :2012/03/03(土) 09:39:45.03 ID:+PGrtVhN
>>402 久しぶりに来たら止まってるので激遅レスしますが、そのちょっとした変更が
重大な破滅を及ぼしませんですか、ってことですよ。
だってたった3文字の言葉で世界が滅びちゃうんですよ。ムスカさんだって
「目が目があぁぁぁ」とかなっちゃうんですよ。慎重にやらないと。この1ヶ月
まるでプライベートの記憶がないですが、ちょっといじってみましょうかな。ははは。
負け惜しみバカ、現るw
バカ、現るw
406 :
名無し~3.EXE :2012/03/06(火) 01:05:47.20 ID:lps1eYvQ
MTP(Media Transfer Protocol)/PTPデバイスのフォルダやファイルにアクセスするには どうやればいいの?
バカ、現るw
お前こそバカw
「馬鹿」って言うと「馬鹿」って言う...
こだまでしょうか、いいえWScript.Echoです
411 :
上殿 :2012/03/14(水) 21:53:48.17 ID:9hRXbLfc
問題解決授業進行
いろいろ使ってるよ、継続。
sfcmini入れとくと暇な時にJScriptで色々なことができる。 開発環境はどこにでも入れられるわけじゃないからな。
そういうとこでは逆にexcel.applicationが使えるだろ
JavaScriptでブラウザの自動操作した後に、完了画面を取りたいのですが、 スクリーンショットは調べたら無理そうとのこと。(VBA使えば可) どのようにするのが1番いいでしょうか? 名前をつけて保存とか?
WebBrowser.DrawToBitmap
WSH(・∀・)スレッド! Part 4 なくなった?
Win8ってJSでしょ JSからならWSH使うんじゃんあいの?
Win8ってPSでしょ PSからならWSH使わないんじぁあいの?
>>418 1000いってそのまま立ってないっぽいね
>1 久しぶりに、 アドミ権限がなくMS-WORDが導入されている環境で rtfファイルをMS-WORD以外のソフトでオープンさせるのに wshを使いますた。
425 :
名無し~3.EXE :2012/06/26(火) 16:06:57.77 ID:TSwv9Fho
外部コマンドの標準出力を処理したい。 以下のようにやってみたが、ファイルができる前に開こうとしてエラーになる。 WshShell.Run "%comspec% /c aaa.exe > " & outFileName Set FSO = CreateObject("Scripting.FileSystemObject") Set outFile = FSO.OpenTextFile(outFileName,1)
426 :
425 :2012/06/26(火) 16:09:58.26 ID:TSwv9Fho
コマンド実行が同期でできていないのが問題に思えるが、 調べた限りではWshShell.Runは同期実行のはず。 リダイレクトでファイル作成の部分だけ、非同期で行われているのでしょうか。 コマンドの実行時間は時によって変わるので、一定時間待つ、 という対応もできないのですが、 ファイル出力が完了してから次の処理を行うには どうすればよいのでしょうか。
うそこけ ちゃんとしらべろ ばーか
shell.applicationの
助けてください。
FTPサーバからパソコンにファイルをダウンロードするスクリプトを書いたのですが
Set Sh = CreateObject("shell.application")
Set savedir = Sh.namespace("c:\test")
savedir.CopyHere "
ftp://ftpserver/hoge.pdf "
WinXPで動作するけどWinVista以降で動作しません。
WinVista以降で動作させるにはどうしたらよいでしょうか。
c:\testを作ってないとか管理者モードじゃないとか?
>WinXPで動作するけどWinVista以降で動作しません。 こういうときはまず最初にUACを疑うべき
そういうときは msgbox "waiting..."
A.exeからプロセスの環境変数でB.vbsにパスワードなどの文字列を渡すときに、 ツールなどを使って、その値を途中で抜くことは出来るもんなんでしょうか? B.vbs自体は改変できないものとして。
B.vbsをC.vbsにリネーム。 B.vbsをゼロから作り、「環境変数を抜いてWScript.Shell.RunでC.vbsを呼ぶ」処理を作る。 しかしそもそもがあまり安定した設計じゃないなこれ。 B.vbsでダミーの環境変数をセットすることもできちゃう。
ありがとうございます。 最悪、そのPCが盗まれた場合か、そのスクリプトや連動するアプリだけが盗まれて別のPCで動かした場合に、 IDとパスワードが抽出出来ることだけは避ける仕様にしといたほうがいいかなと考えてます。
スクリプト使ってる限り無理だろ
環境変数は他のプロセスから見えるだろ
440 :
435 :2012/08/05(日) 14:15:36.76 ID:DJAkb7Zf
>>439 A.exeで設定したプロセスの環境変数の値は、別のexeやスクリプトから見えるんですか?
A.exeから起動したB.vbsからなら、継承されたプロセスの環境変数の値が見えるのは理解できるんだけど。
他のexeやスクリプトから、どうやったら覗けるんでしょうか?
不正行為にも流用できる方法なので 知りたければ他人を不正幇助のリスクに巻込まずに自分で調べましょう
すみません、お尋ねしたいのですが eventquery.vbsでタスクスケジューラのログ(microsoft-windows-taskscheduler/operational)の内容を 表示させることって出来るのでしょうか? 家のPCがWinXP-Homeなので試すことが出来ず、ググってもよくわかりませんでした・・・
間違えました。 × eventquery ⇒ ○ eventquery.vbs
あれ?拡張子「.vbs」を付けたのになぜか消えますね。 2chの仕様なのかな? もう1度書きます。 × eventquery ⇒ ○ eventquery.vbs
VBScriptは昔のノートン先生が結構誤反応をすることが多かったの。 Loveletterウィルスと間違えてDATを消してしまうし それを逆手にとった荒らしも多かった。 ファイル名やソースを張るときには「対策」されて変換されてしまう。
443,444ともに拡張子までちゃんと見えてるけど?
自分でreplacestr設定したの忘れてるだけじゃね?
449 :
445 :2012/08/11(土) 13:52:06.92 ID:TBiUViGB
おっしゃる通りギコナビのオプションで「セキュリティ対策ソフトの誤反応対策」というチェックを外したら 拡張子まで表示されるようになりました。 お騒がせしました・・・
450 :
名無し~3.EXE :2012/08/27(月) 15:12:23.47 ID:h8v7q1oD
innerHTMLに書いてinnerTextを読めばよかんべ
ありがとうございます。以下参考にしてできました。
http://blog.tojiru.net/article/211339637.html a = "キタ━━━(゚∀゚)━━━!!
";
var IE = WScript.CreateObject("InternetExplorer.Application");
IE.Visible = false
IE.Navigate("");
WScript.Sleep(1000);
WScript.echo(unescapeHTML(a));
IE.Quit();
function unescapeHTML(str) {
var div = IE.Document.createElement("div");
div.innerHTML = str.replace(/</g,"<")
.replace(/>/g,">")
.replace(/ /g, " ")
.replace(/\r/g, "
")
.replace(/\n/g, "
");
return div.textContent || div.innerText;
}
戻っちゃってますけどaには数値文字参照が入っているということで・・・
質問があるのですがどなたかお願いします。 ノートパッドにごにょごにょしようと、下記コードにて子ウィンドウのハンドル取得しようとしてるんですが、 2つ目のハンドルがNULLで返ってきます。子ウィンドウ「Edit」のハンドルはどのようにすれば取得できますでしょうか。 hWND(0) = CreateObject("Excel.Application").ExecuteExcel4Macro("CALL(""user32"",""FindWindowA"",""JCJ"",""Notepad"",0)") hWND(1) = CreateObject("Excel.Application").ExecuteExcel4Macro("CALL(""user32"",""FindWindowExA"",""JJJCJ"",hWND(0),0,""Edit"",0)")
Win32APIスレ逝け
結局wsh使ってない? 既存のスクリプトは使ってるだろうけど、 新規で書いてるのか?って意味ね。 個人的には特に不満がないので新規には書いてない ってか今となってはよくスクリプト書いてたなって思う powershellスレも勢いあるわけでもないし、そこまで使われてなさげだし
>>457 基本的にWindowsはスクリプト書く習慣あんまりないしなー
スレ違い
WinXPで、職場の業務用アプリの操作を自動化しようと、WSHのAppActivateとSnedKeysで、自動キー入力を行いました。 キー入力は、Caps Lockはあらかじめオン状態で、↓キーとスペースを数回叩く程度なのですが、 そうするとどう言う訳か、スクリプト実行後にCaps Lockが勝手にオフになってしまいます。 キーボードのCapsLockランプは光ったまま、タスクバーのCAPS表示はOFFになってしまいます。 この状態の時キーボードのCapsLockをオフにすると、タスクバーのCAPS表示はオンになります(つまり逆に認識されてしまう)。 どうしたら、このような挙動を起きないようにできるでしょうか。 AppActivateの後、Sleepを入れても改善しません。
バグ 修正
SendKeysに任せること自体がそもそも PCが受け付けずにしくじるリスクがある つまりCapsLockがなぜONでなければならないのか 業務用アプリの方をなぜ変えられないのかを考えるべき
windows側、wsh側のバグでしょうね。一個人にはどうしようもありません。 確かにその業務用アプリの出来が悪いけど、それを直すとかは様々な事情により不可能。
自動化は普通、SendKeysではなくSendMessageでやるものだよな 戻り値でキーなり何かを送った結果を確認せずに次のキーを送るとか もう馬かと、鹿かと winやwshのバグより、不適切なもので不適切なことをしようとする 使用者の頭のバグが一番大きいと思う
>460 Win7(x64) で試してみただけだけど、regsvr32 からの DLL登録が 許されてる環境なら、とりあえず AutoItX の ControlSendメソッドを 使うと、回避出来るかも知れないですよ。
>>465 ありがとうございます。 外部の物をインストールするとかは一切できません。
おかしくなる原因は WScript.Sleepにあるのは分かりました。Sleepを排除したら、正常動作しました。
もう、これ以上のことはしないので、では。
wsfのscript要素は、charset属性に対応していない? MSDNのリファレンスには載ってなかった 外部スクリプトをUTF-8にしたいんだけど、できないってことですかね?
>467 ファイル形式を UTF-8 から Shift JIS とかへ変換するだけなら、 「Adodb.Stream」を CreateObject し、文字コードを指定したり すれば出来るけど (「Adodb.Stream Open Type Charset」 あたりで検索すれば判る筈)、それを「Scripting.Encoder」 オブジェクトに渡して (または少々荒っぽいけど、文字列を ごっそり eval させるとかして) スクリプトの実行が成功するか どうかは、やった事ないんで不明。やる気と時間があったら 結果報告ヨロです。
469 :
468 :2013/01/30(水) 13:51:49.53 ID:QZYr9xY1
ありゃ間違えてた、恥ずかしい(/ω\;) ×「Scripting.Encoder」 ○「ScriptControl」
<?xml version="1.0" encoding="utf-8" ?>
471 :
467 :2013/01/31(木) 00:50:43.73 ID:CH8AQPWd
回答ありがとうございます。
>>468 ADODB.StreamでUTF-8のjsを読み込み、ScriptControlに渡して実行できました。
今後、自分用のスクリプトを、どの文字コードで記述するかを検討してました。
あまり凝ったことはしたくないので、標準で使えるShift_JISとUTF-16で悩んでみます。
>>470 script要素のsrc属性に指定する、別ファイルのjs/vbsをUTF-8にしたいです。
ご指摘の記述で、wsf自体はUTF-8にできることを確認済みです。
分かりづらくてすみません。
>>470 の通りだろバカが。やって見てから文句言え。
473 :
467 :2013/02/01(金) 00:29:58.22 ID:8pnxd3pB
>>472 BOM付きだといけました
UTF-8のBOM無しにしたかったので、BOM付きは試してませんでした
できる事は分かったので、あとは自分的にBOMを許容するか考えてみます
みなさん、ありがとうございました
475 :
467 :2013/02/02(土) 01:03:00.84 ID:JfUKJu1L
UTF-8のwsfからUTF-8のjsをインクルードし、
XML宣言のencoding指定の有無と、BOMの有無で、
正常に動作する組み合わせを確認してみました。
長くなったので、コードと結果は分けて投稿します。
結論としては、外部のjsはBOM無しでは動作しませんでした。
>>474 インクルードする外部のjsもBOM無しでいけました?
476 :
467 :2013/02/02(土) 01:08:39.00 ID:JfUKJu1L
使用したコードは以下の通りで、encoding無しのケースでは、 XML宣言とCDATAの記述を削除しています。 ■ wsf <?xml version="1.0" encoding="utf-8" ?> <job> <script language="JScript" src="bom.js"></script> <script language="JScript"> <![CDATA[ WScript.Echo('wsf UTF-8 BOM有 マルチバイト文字'); ]]> </script> </job> ■ js WScript.Echo('js UTF-8 BOM有 マルチバイト文字');
477 :
467 :2013/02/02(土) 01:12:15.00 ID:JfUKJu1L
結果は以下のようになりました。 encoding:○ wsfBOM:○ jsBOM:○ → ○ encoding:○ wsfBOM:○ jsBOM:× → × encoding:○ wsfBOM:× jsBOM:○ → ○ encoding:○ wsfBOM:× jsBOM:× → × encoding:× wsfBOM:○ jsBOM:○ → ○ encoding:× wsfBOM:○ jsBOM:× → × encoding:× wsfBOM:× jsBOM:○ → × encoding:× wsfBOM:× jsBOM:× → ×
vbsだけどいけた os wshのver違いか
jsでもいけた osは7
480 :
名無し~3.EXE :2013/02/04(月) 23:56:39.97 ID:a/0/56o4
「Alt+F4」で強制終了みたいな動作をVBScriptやJScriptで実現可能ですか? 実現可能ならばどの関数やオブジェクトからできるのかどうか教えてくれませんか
createobject("wscript.shell").sendkeys "%{f4}"
WMIのWin32_Processで特定のプロセスをTerminateProcess()ってのは?
483 :
名無し~3.EXE :2013/02/18(月) 21:18:36.99 ID:JujOUcYl
Windows XPです User権限でフォントをインストールするには コントロールパネルのフォントから 「フォントの追加」で「フォント フォルダにフォントをコピーする」のチェックをはずして追加する またはコントロールパネルのフォントにフォントファイルを右クリックでドラッグ&ドロップして 「ショートカットをここに作成」をする等といった方法じゃないとインストールできません (コントロールパネルのフォントのアイコンにはショートカットのマークが付く) しかしこれだとWindowsを再起動するとインストールされていない状態に戻ってしまいます
484 :
続き :2013/02/18(月) 21:27:57.37 ID:JujOUcYl
そこでWindows起動時に上記の処理を自動でさせようと思い検索してみたところ //gallery.technet.microsoft.com/scriptcenter/b5acfc13-3c7b-4168-b9c9-792e005304e6 に手順が書いてありました がうまくいきません コピーしようとしているからうまくいかないんだ、ショートカットを渡せばいいんだ と思い
485 :
続き :2013/02/18(月) 22:45:48.17 ID:JujOUcYl
var item = WScript.Arguments(0); var itemName = item.slice(item.lastIndexOf("\\")); var WshShell = WScript.CreateObject("WScript.Shell"); var strFonts = WshShell.SpecialFolders("Fonts"); var oShellLink = WshShell.CreateShortcut(strFonts + itemName + ".lnk"); oShellLink.TargetPath = item; oShellLink.Save(); みたいなことをしてみましたがこれもうまくいきませんでした
486 :
続き :2013/02/18(月) 22:56:44.13 ID:JujOUcYl
上記のページによるとNamespaceメソッド経由でフォントフォルダを取得しないといけないっぽいです でもそうするとCopyHereかMoveHereしかなくShortcutHereのようなものありません (そもそもショートカットを渡せばうまくいくのかどうかも定かではありませんが) 別のアプローチはないかと思ってフォントをインストールする際にレジストリやファイルに変化がないか確認してみましたが Administrator権限での通常のインストールとは違ってレジストリにもファイルにも何も変化が起きていないようで(そんなことあるの?) 違う方法を探すこともできませんでした
487 :
続き :2013/02/18(月) 23:00:45.28 ID:JujOUcYl
User権限でフォントのインストールを自動化させる方法があれば教えてください 外部コンポーネント等なしで自動化できればwshでもcmdでもinfでも構いません 連投すみませんでした
ちゅーかそんなことができたら怖くね? メイリオをUsersで上書きできたらまずいだろ よく知らないけどフォントのインストールは 基本はAdministratorなんじゃないの?
>>483 のような一時的なフォントのインストールはUser権限でもできます
それをWindows起動時に自動的に処理させたいと思っています
コマンドラインスレ落ちたのか……。 ジャンクション機能を使ってマウントしたボリュームの 空き容量を知る手がかりを探しに来たのに,ないとはなあ
>>490 ついでに言うと普通にフォルダ内でdirすると表示される
空き容量はリンク先ドライブのものだが。
ポップアップダイアログがどうにも最前面に出せないのは不具合なのか仕樣なのか 回避がメンドいな それともVista以降なら問題ないのだろうか
そいつはもうHTAを使った方が早いんじゃないか?
ポップアップダイアログってmsgboxのことかい? 最前面指定があるだろ?
メッセージボックスならポップアップダイアログとは呼ばんだろ
それは君個人のルールだろ いや俺も呼ばないけどさ
wscript.shellのpopupのことじゃろ
必要な機能はCOMで賄えってのはVBSというかWSHのスタイルだからな マウントしたボリュームどころか、普通のドライブの空き容量を取得する手段すら VBSそのものにはからは提供されていない WSHのパッケージと同梱なので当たり前に使っているが、FSOだってVBSの機能ではなく あくまで外部の汎用COMの一つ
COMって簡単に作られる?
プリンターがオンラインかorオフラインか調べる方法を あとに学ぶ人のためにカキコした方がいいと思う。 わしゃ知らん。
>>501 俺は簡単だと思うけど、君が簡単と感じるか否かは
君の能力次第だな
>>502 Google様に聞けばいつでもすぐ答えてくれる内容だから
わざわざここに書いておく必要は無いね
因みにネットワークに繋がってるか否かやIPアドレスなどを
調べる方法とやり方は一緒だ
そういえばMS公式ドキュメントにWSHでCOM作る(not使う)方法を書いてあるセクションがあったな
スクリプト コンポーネント(WSC)だろ wshのヘルプにも載ってるぞ 確かにスクリプト コンポーネントはCOMだけど、今回のようにwshやVBSなどに無い機能を COMで補うって用途には全く役に立たない まあ外部ライブラリ的な物を作るにあたって、普通にvbsやjs作ってwsfのscriptタグのsrc要素で インクルードするのに対して、いくつか利点も欠点もあるから、俺も適材適所で使ってるけど 別にそんな大層なものじゃないよ
506 :
名無し~3.EXE :2013/03/17(日) 10:57:39.04 ID:ud5w/Y1w
若干スレ違い気味ですが、質問させてください。
http://ja.wikipedia.org/wiki/NT_File_System >Win32サブシステムではファイル名の大文字小文字は区別されず、
>ファイル名の大文字小文字が異なるファイルを上書きした場合は、最後に使われたファイル名のファイルが保存される。
>POSIX・Interixサブシステムではファイル名の大文字小文字は区別され、
>ファイル名の大文字小文字が異なるファイルは上書きされず別のファイルとして保存される。
とのことですが、NTFSは同じフォルダに a.txt と A.txt や、フォルダa と フォルダA を共存出来るのでしょうか?
もし可能であるならば、上記ファイル・フォルダを作成可能なアプリを知りたいです。
また、WSHでNTFSの大文字小文字を区別する方法はありますでしょうか?
よろしくお願いします。
>>506 NTFS自体の機能では大文字小文字混在可能だが、通常のWindows用アプリを使っている限りそれを識別/操作できない、だからWSHでもできない
大文字小文字混在を操作可能なアプリはUNIX ベース アプリケーション用サブシステム配下で動作するUNIX互換アプリのみ
wikipediaに書いてある通り
>>507 ありがとうございます。
Subsystem for UNIX-based Applications で a.txt と A.txt を作り、
wsh.Exec("%windir%\posix /u /c /bin/cd $HOME; /bin/ls -a *.txt").StdOut.ReadAll()
的な感じで一応 a.txt と A.txt が取得できましたが、SUAインストールしてないと使えないので微妙ですね…
無意味だろ
そういう試み自体は理解できる dos仕様のほうが異様
>>510 今はそうだけど
DOSが最初にできた時代にはむしろ多数派の仕様だったような
途中で変更するタイミングはいくつもあったのにしなかったのが(ry
そもそも大文字小文字があるほうが異様
ひらがな、かたかな、みたいなもんかな
514 :
名無し~3.EXE :2013/05/28(火) 22:37:08.99 ID:5jK+KVue
Windows7にて入力文字をマスクする CreateObject("ScriptPW.Password") が使用できなくなってしまったのですが、 他に入力文字のマスクを実現できる手段はありますでしょうか?
515 :
名無し~3.EXE :2013/05/30(木) 21:27:21.96 ID:TL0FuuX3
教えてください set shell = WScript.CreateObject("WScript.Shell") do until shell.AppActivate("hoge") WScript.Sleep(100) loop このあと shell.SendKeys で hoge ウィンドウを操作したいのですが AppActivate しているにも関わらず hoge ウィンドウが前面に来ないことがあってランダムに失敗してしまいます この時タスクバーの hoge ウィンドウアイコンはオレンジに点滅しています OS は Windows7 で、コンポーネントというのはよく分かりませんが .vbs をバッチファイルから実行しています よろしくお願いします
517 :
名無し~3.EXE :2013/06/20(木) 11:45:40.80 ID:wI6LNwCX
age
職場のパソコンでアドミ権限がなく、autoItxが入れられないので、 マウスのカーソル位置を設定する実行ファイルと、 マウスをクリックした座標位置をクリップボードに格納する実行ファイルと 左クリックを自動でおこなう実行プログラムを作って jscript 内から呼び出してみたら、ちきんと動いた。 しばらくは、wshで遊べそう。 あわよくば、仕事の一部を自動化できればありがたい。
>>516 Windows7で動いてたWSHが暫く同じ症状、AppActivate異常になっていた。
原因を調べても判らなかったが、今日のWindows7更新で正常動作に戻った。
きっと同じだと思う。
523 :
520 :2013/07/10(水) NY:AN:NY.AN ID:TYMFvckH
>522 そんなのがあるんやね。サンクス。 職場の情報課で、今度職場に新しいPCを入れるようだが 自動記録、自動実行するソフトも標準で導入してくれればいいなぁ。 サポートを必要とするソフトは極力導入したくないだろうが。 また、間違っても、wshを削除しないことを希望する。
正しく使えれば便利なんだが、皆が皆、正しく使えるとは限らないからね また、普段は正しく使える人も、100%バグのない完璧なコートを書ける訳じゃないし 場合によっては1つのバグで億単位の損失を出すこともあり得る そういうこと考えると、ミスっても故意犯で無い限り全額の損害賠償を請求できない 自社員にはそういうものを使わせず、必要が有れば、バグが有れば損害賠償を請求できる外部に そういったソフトやシステムを委託した方が良いという考えになる wshなどを使える者としては、COMや自動化ツールなどの導入も自由開放して 存分に活用できればいいのになぁと思うところだろうが、最悪の事態などのリスクまで考えて 決定されている会社の方針には従うのが会社員の義務であり、社会人のマナーだ まあ中小企業だと、リスクを考えてではなく、良く解らないけど危なそうだからと禁止してる場合もあるだろうけどね
自動化は便利なんだけど、手作業では絶対しないようなバグを作りこんでて それに気付くのが遅れたりすると悲惨だからなぁ…
人事異動のとき、 各人の力量の差のあるレベルだと 残業時間が違ってくるレベル程度なら 作成したものを一切引き継がないって手段しか残されていないつうか 実際、そうした。 2chにも、無料サポートいい加減にしろ!みたいなスレが昔はあったが 今もあるのかなぁ?
新しく作り替えるならまだしも・・・引き継ぎ拒否って単なる怠惰よな
手作業業務の自動化スクリプトだぞ?引き継がなくても、効率低下を除けば業務に支障は出ない スクリプトの運用技術は業務範囲を逸脱してるだろうし、運用技術無しで使うのは只の自殺行為 精々使ってたスクリプトを資料として残しておいて、運用技術を持つ人間だけが引き継ぐ程度で良い。 手作業に戻した時に業務に支障が出るレベルの自動化だった場合は…… 事情を説明して自動化を正式に(手製または外注で)実装させるか、後任を増員させるかあたりだろう。 どのみちスクリプトの"運用技術"を引き継ぐ必要はないと思うけどな。
視野が狭いなぁ
とりあえず、日本語は若干改善されたようだ
いや俺(529)は526じゃ無いぞ? 「業務効率が落ちるだけで支障がないなら自動化は引き継がなくても良い」 って所に賛同してるだけだ。
TEST
>>533 659 : 名無し~3.EXE[sage] 投稿日:2005/05/12(木) 19:05:23 ID:xGQFP/QE [1/3回]
こんなレス引っ張ってくるならもっと有用な話題あるだろ・・・
いやこのセンスじゃ無理か
作成日を変えたいときどうしてる?
作成日を変えるコードを書いてる まあ取得するだけみたいに簡単にはいかないけど
powershellで簡単
JScriptでActiveXオブジェクトのプロパティ列挙って不可能ですかね? forin使っても何も出てこないし
>>539 無理だと思う
どうしても必要なら ActiveScriputRuby を経由したりすれば取り出すことはできる
>>540 やっぱ無理っすか…orz
jsonも使えないんだよなぁ、あくちぶえっ糞
Rubyはホストアプリが対応してないので諦めます
>>541 JSONはjson2.jsをちょい弄って埋め込めば普通に動くぞ。
>>542 ActiveXオブジェクトをシリアライズできるなら、そのちょい弄ってを詳しくおながいします
WScript.echo(GetObject("winmgmts:root\\cimv2").execquery("select * from win32_process where name='svchost.exe'").count); 上だと正しく数字が表示されるのに、下だと表示されないのはどこがおかしいのですか var func = function(){GetObject("winmgmts:root\\cimv2").execquery("select * from win32_process where name='svchost.exe'").count;} WScript.echo(func());
>>545 var func = function(){return GetObject〜
コンソールの環境変数を書き換えたいのですがどうしたらいいのでしょうか? 環境はWinXP SP3です あくまで現在の環境変数を書き換えたいのでSYSTEMやUSERは不可です >type test.js var ws, env; ws = WScript.CreateObject("WScript.Shell"); env = ws.Environment('VOLATILE'); WScript.echo("1:" + env.Item("foo")); env.Item("foo") = "ABC"; WScript.echo("2:" + env.Item("foo")); >set foo 環境変数 foo が定義されていません >cscript /nologo test.js 1: 2:ABC >set foo 環境変数 foo が定義されていません >cscript /nologo test.js 1:ABC 2:ABC cscriptからfooは見えるのに、コンソールからfooは見えません・・・ よろしくお願いします
>>548 環境変数はプロセスごとに保持されていて、継承は子プロセスへの一方通行です。
CScriptから環境変数を引き継いで新たにコマンドプロンプトを起動するか、
コマンドプロンプト側で環境変数を設定しなおす必要があります。
方法としては、
・ファイルに環境変数をファイルとして書き出して、親プロセス側からfor /Fやcallで読む
・標準出力に環境変数をテキストとして書き出して、親プロセス側からパイプで読む
等があります。書き出す形式はsetコマンドの形でも構いませんし、for /Fで読みやすい形式でも構いません。
あとはデバッガ的な方法で外側から環境変数を書き換える事も出来る気がしますが全くオススメできません。
550 :
548 :2013/11/12(火) 00:48:54.08 ID:wio6Fajt
即レスthx。あぁ・・・なるほど・・・ >type test.js var ws, env; ws = WScript.CreateObject("WScript.Shell"); env = ws.Environment('VOLATILE'); WScript.echo("1:" + env.Item("foo")); env.Item("foo") = "ABC"; WScript.echo("2:" + env.Item("foo")); ws.run("cmd.exe", 1, true); >cscript /nologo test.js 1: 2:ABC ※新コンソール >set foo 環境変数 foo が定義されていません >cscript test.js 1:ABC 2:ABC あれ?cscriptには引き継がれるけどコンソールに引き継がれません どうなっているんだ・・・ 美しくないけどバッチファイルに書き出して後で実行するしかないのか?(´・ω・`)
Volatileがcmd.exeでは見えなくてプロセスツリー内のcscriptでは見えるってのはよく分らんけど、 この場合env = ws.Environment('PROCESS');でいいんじゃない? パイプ例…ファイル作るよりはちょっとマシだが美しくはない。 @if(0)==(0) ECHO OFF for /f "delims== tokens=1,*" %%j in ('CScript.exe //NoLogo //E:JScript "%~f0"') do set %%j=%%k echo %foo% pause goto :EOF @end WScript.Echo('foo=ABC=ABC');
552 :
548 :2013/11/17(日) 03:16:29.80 ID:/2CP9OZ4
レス遅れてすみません 結局バッチファイル渡しとしました 実運用時(WinPEのシェルの初期化)の起動はcmd.exeからではないので その場でパイプ渡しは難しいためです 試したこと 1.PROCESSに書き込んで新コンソールを起動する 環境変数は期待通りに繁栄されるけどコンソールが常に2枚以上開くので見た目が 美しくないし誤操作の元。WSHインタプリタがシェルになってしまうのも好ましくない 2.USERに書き込む 普通のWinだとcmd.exeが開いたときに繁栄されるけど、WinPEでは繁栄されない。ボツ 3.バッチファイルを生成しcmd.exe /kで起動 何故かオプションがcmd.exeに渡されない。ボツ 4.バッチファイルを生成しAutoRunで起動 ひとまずこれで期待した結果が得られた。美しくないけど背に腹はかえられない VOLATILEが期待した動作をしてくれればこんな事をする必要は無いんだけどなぁ・・・
>>552 試して動かんのもアレだし動く実装が正義だから完全に蛇足だろうけど
> その場でパイプ渡しは難しいためです
WSHではなくパイプ処理を書いたbatファイルを起動して、そっちからWSHを起動すればよい気がするんだけど駄目なんだろうか?
> コンソールが常に2枚以上開く
起動した後はWSH終了してそっちのコンソール閉じれば……
他にも、cscriptじゃなくてwscriptで起動するって手もあるような。
> WSHインタプリタがシェルになってしまう
コンソールが2枚って事はコンソールは分離してるし親プロセスがWSHなだけでシェルはcmd.exeでは?
とか気になった。
554 :
548 :2013/11/17(日) 19:54:04.19 ID:TU2KoTQO
>>553 レスthx
>WSHではなくパイプ処理を書いたbatファイルを起動して、そっちからWSHを起動すればよい気がするんだけど駄目なんだろうか?
その後、追加でcmd.exeが起動する前の初期化をさせたくなりまして
スクリプトを分けると管理が面倒になるので
>>552 の4みたいな仕様になりました
>起動した後はWSH終了してそっちのコンソール閉じれば……
>他にも、cscriptじゃなくてwscriptで起動するって手もあるような。
>コンソールが2枚って事はコンソールは分離してるし親プロセスがWSHなだけでシェルはcmd.exeでは?
WinPEの場合、シェルに指定されたプロセスが終了するとWinPEがシャットダウンしてしまいます
例えばWSHインタプリタ→cmd.exeと起動してWSHインタプリタを終了するとcmd.exeが残っていても
OSがシャットダウンします
>>554 >cmd.exeが起動する前の初期化
cmdからcmdを起動するって手が使えない初期化(?)ならしゃあないね。
>シェル
あー、GUI的な意味のシェルなのか。
つ setx コマンド
JScriptでWMI周りをコーディングするのに参考になりそうなWebサイトとかってないですかね? ググっても出てくるのはVBSばっかり さらにDB系の経験が全く無い自分にはSQLっぽいクエリ文とか書かれても何をしているのか 全く理解できない・・・orz(そう言うコーディング例が多い) WMIのクラス?リファレンスもMSのWebサイトのどこにあるのか判らないし・・・
>>557 Scriptomatic Version 2.0 by The Microsoft Scripting Guys
あとWindowsSDKの中にもサンプル転がってるっぽい。
SDK入れた後のC:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\SysMgmt\WMI\Scripting\WSH\JScriptとか
>>557 わかる。自分も苦労したなあ。仕方ないからVBSのソース頑張って読んだわ…
561 :
557 :2013/12/06(金) 07:18:40.26 ID:4tTY+9MF
レスありがとう 英語はダメだけどがんばってみますorz
news.mynavi.jp/articles/2012/11/20/FD/images/001.jpg こういう感じのインターフェイスって標準機能だけで作れますか? 一覧を表示してキーボードの十字キーとかで項目を選択 みたいなことをしたいです 外部アプリケーションが必要になったりIEでhtmlベースになったりですか?
>>32 ログの再構築をやってもうまくいくかも知れない
(が俺のLOgsでは最早検証できないので誰か試して)
誤爆スマソ
>>563 > news.mynavi.jp/articles/2012/11/20/FD/images/001.jpg
> こういう感じのインターフェイスって標準機能だけで作れますか?
標準はDialog程度で、Yes/Noやメッセージ表示ぐらいしかない
> 一覧を表示してキーボードの十字キーとかで項目を選択
> みたいなことをしたいです
> 外部アプリケーションが必要になったりIEでhtmlベースになったりですか?
Yes
>>566 どうもありがとう
wsh以外を検討したいと思います
PowerShellならカーソル移動できるからイケルと思うぜ
職場のPCがwindows7に更新されたが、 sendkeyにはさむ sleepを長めにしないとキー入力をとりこぼすようで まんどくさ。
最初からappactivate判定で待ち合わせろ
http://okwave.jp/qa/q6809341.html の辺りでしょうか? ありがとさん。
職場のPCは、節電のためか10分経つと、コントロールパネル以外のソフトの機能で
画面が消えて、再び使うには再認証が必要でめんどくさいので、
8分間マウスを動かしていなかったら(マウスの位置読み出しはwsh以外だが)
sendkeys でHOMEキーを送出するようにしたら、再認証不要になって快適になった。
(副作用が全く無いわけではないけど、分かった上で使う分にはおk)
>>571 マウスを擬似的に動かすのが一番副作用が少ないとは思うけど、
キー使うにしてもOEMキーとかShiftとかで副作用減らせると思う。
>マウスを擬似的に動かすのが一番副作用が少ないとは思うけど、 言われてみれば、そんな気もします。 wshの出番がなくなりますが、最終的にはその方向ですね。 別のsendkeys を使うwshスクリプトが 想定したタイミングでのsendkeys に失敗した場合に 現状、タスクマネージャーで強制終了してますが HOMEキー送出と合わせて2つのWscript.exe のタスクが出現することになり どちらを強制終了すべきなのが分からなくなるので 想定したタイミングでのsendkeys に失敗した場合には そのwshスクリプトの実行を打ち切るかなんとかする方法を考えなければいけない ということもあるので 10分以上席を外しておいても再認証不要にするほうは wsh無しでいくようにするかなあ。
wscript.timeout=10 とかで打ち切る
>>571 上手いことやったつもりになってるのかも知れないけど、それを会社の許可取らずに勝手にやってるとしたら
それは社会人として、大人として、最低の行為だよ。話通してるなら、そんな回りくどいことせずに
10分を30分とか60分にする方向で対応するだろうから、おそらく勝手にやってるんだと思うけどね。
うちも昔、ExcelとかのVBAが使えなかったんだけど、こっそりセキュリティーレベルを下げて
勝手にVBA使っちゃうという
>>571 みたいなことも出来たけど、俺はちゃんと筋を通し
VBA活用した業務システムのサンプルを作ってプレゼンし、正式にVBAの使用を許可されて使ってる。
VBAのことを解っていて意図的に禁止にしているのではなく、解ってないからデフォのマクロ無効にままに
しているだけだろうと思っても、組織の中では筋を通すのが大人のやり方だ。
自宅PCなら、電気代払うのも、セキュリティーが下がったツケを払うのも自分だが
職場ではそれを払わされるのは会社だからね。それで増える電気代なんて些細なものだし
外部の人間が出入りしないから、そこまでのセキュリティーも必要ないってなら
それを主張して改善を求めれば良いだけのこと。それをした上で断られたなら
きちんと理由があって断られたにせよ、相手の理解力が乏しいから解って貰えなかっただけにしろ
会社の方針には従うのが雇われ従業員の義務で、それが嫌なら転職か独立するしかない。
なんて正論言っても、2chでは正論に対して斜に構えて反発する方がカッコイイ的な風潮があるから
逆にこっちがウザいだの長文だのと難癖付けて叩かれたりしそうだけどねw
ウチの職場ではWSHどころかVBAですら「他の人がメンテする際に面倒な事になる」って理由で推奨されてない。 確かにその通りだが、以前どうしても業務にWSHやVBAに頼らざるをえない部分があって、上司を説得するのに苦労したよ。 同じ会社の別の部署では事前に上司に一報入れとけば即OKだったが、そこは仕方ない。
>>575 ,576
正論ではある。が、管理が適当な会社で下の方だと、そう言う
IT関係の部署の許可を得る事自体が難しかったりする
当然現場のリソースの管理も出来ていないから万年人不足
上は「効率化、効率化」と吠えるが、効率化をするためのリソースは
まともに出ない。そうなると現場はずるをしないと業務が回らない
今の職場だけどね・・・そんなのを長く続けているとそのうち火傷しそう
なので辞めるつもりだけど
これは極端にしても、本社が求めるセキュリティ管理と現場の環境が
完全に一致している職場は今のところ見たことがないな
程度の差はあれ適当にお茶を濁さないと(現場の都合のいいように
解釈して運用する)業務の遂行に支障をきたす場合が多かった
大企業でも孫請けや客先作業だと綱渡りをしていたりするし
そもそもその機能は絶対節電のためじゃないから もし席を外してる隙に誰かにかってに弄られたりしたら責任取れるの?ってことだし
>>578 本来必要なのは本当に離席した時にロックする機能と、手間なく再認証する機能だな。
IE11にしたらIE.Busyの挙動がおかしくなったわ・・・ 自分用だからいいけど仕事で使ってる人はたまらんだろうな
いないよ
誰がいないの?
580の言う「仕事で(IE.Busyを)使ってる人(で、IE11にした人)」だろう
8.1搭載PC導入すれば自動的にIE11
objIE.navigateでオートメーションしてる。 IE9/10の脆弱性、MSがIE11なら安心できるぞとか言ってるけど、 上げたらやっぱスクリプトが壊滅するんだろうな。
powershellが出てるというのに、いまさらバッチ⇒wsh書き換えを始めました バッチでいうところの"%*"=「起動時の全パラメータを表示」をvbscriptでは簡単にかけないでしょうか? ggったのですが…やっぱり、For eachとかで表示しなきゃだめですか?
はじめまして WSHを利用したオーディオプレーヤーの表示変更で躓いています
https://dl.dropboxusercontent.com/u/10447545/%E7%84%A1%E9%A1%8C.png 現在「曲タイトル ・タイトルアーティスト名」 とあるのを赤文字の様に
曲時間の前に右詰で表示したいのですが方法がわかりません
W = w - lengthWidth - playCountWidth - ratingW;
var gic = groupItemCounter++;
var itemNr = (((gic) < 10) ? ("0" + (gic)) : (gic));
var title = $("$if(%tracknumber%,%tracknumber%," + itemNr + ".) %title%", metadb);
var titleArtist = $("[ \u25AA $if($greater($len(%album artist%),1),$if($greater($len(%track artist%),1),%track artist%))]", metadb);
if (titleArtist) {
var titleLength = gr.MeasureString(title, titleFont, 0, 0, 0, 0, StringFormat(0, 1, 3, 0x00000800 | 0x1000)).Width;
//var titleArtistLength = gr.MeasureString(track artist, titleArtistFont, 0, 0, 0, 0, StringFormat(0, 1, 3, 0x00000800 | 0x1000)).Width;
var titleArtistFont = gdi.font("Meiryo UI", 11, 0);
gr.DrawString(titleArtist + queue, titleArtistFont, titleArtistColor, x + 10 + titleLength, y, W - 10 - titleLength, h, StringFormat(0, 1, 3, 0x1000));
}
gr.DrawString(title + (titleArtist ? "" : queue), titleFont, titleColor, x + 10, y, W - 10, h, StringFormat(0, 1, 3, 0x1000));
の x + 10 + titleLength を変えればタイトルアーティスト名が移動するのがわかりました
x + 10 + titleLength を W に変更するとちょうどタイトルアーティスト名と曲時間がかぶって表示されますのでそこから
タイトルアーティスト名Lengthを引けば 結果右詰のようになるのかと思うのですがタイトルアーティスト名Lengthの取得法も分からずで行き詰っています
詳しい方アドバイスいただけないでしょうか? よろしくお願いいたします
WSH/JScriptで画像?と思ったけど、foobarにWSH Panel Modってのがあるのか…
>>587 grとかgidとかのオブジェクトはWSH自体の機能じゃなくて、
そのオーディオプレイヤー及びプラグインの提供する機能。
周辺の使われ方とJScriptの知識から推測は出来るけど、
素直に環境も提示してから質問した方がいいよ、これは。
例えば、foo_uie_wsh_panel_mod-*/docs/Interfaces.htmlとかあったでしょ?
まぁ取り敢えずはgr.DrawString(titleArtist〜);のところをこうする
var titleArtistLength=gr.MeasureString(titleArtist+queue,titleArtistFont,0,0,0,0,StringFormat(0,1,3,0x00000800|0x1000)).Width;
gr.DrawString(titleArtist+queue,titleArtistFont,titleArtistColor,x+W-titleArtistLength,y,titleArtistLength,h,StringFormat(0,1,3,0x1000));
ただこれだと横幅足りない時に多分文字が被る(未確認)のでこれの二行目をこうする
gr.DrawString(titleArtist+queue,titleArtistFont,titleArtistColor,
(W-titleArtistLength-10-titleLength<0)?(x+10+titleLength):(x+W-titleArtistLength),y,
(W-titleArtistLength-10-titleLength<0)?(W-10-titleLength):(titleArtistLength),h,StringFormat(0,1,3,0x1000));
タイトルの時点で横幅足りない時は元の通り(多分はみ出す)のはず…だけど未確認なんで動くかは知らん
>>589 早速のレスありがとうございます 眠ってしまっていましたすみません
おっしゃる通りfoobarを弄っておりました
これから仕事に出ますので戻り次第、動作報告させていただきます
詳しい内容のれすありがとうございます
取り急ぎのお礼となりますが多くのアドバイスに感謝いたします m(_ _)m
オプションを指定したショートカットファイルへ適当なファイルをドラッグアンドドロップしたときに named と unnamed プロパティが表示されません。 下のスクリプトを WSF にして、それのショートカットをつくって"リンク先"にオプションを追加しました。 ショートカットを実行すると named が表示されて期待通りなのですが、 ショーカットにファイルをドラッグアンドドロップすると unnamed しか表示されません。 コマンドプロンプトで「このショートカットファイル 適当なファイル」を実行すると 期待通りに named と unnamed が表示されます。 ショートカットファイルを「cscript //nologo file.wsf /aaa」にして、 それにファイルをドラッグアンドドロップすると期待通りに動きます。(wscriptも同様です) スクリプトへのショートカットで動かしたいのですがどうにかならないでしょうか。 やはり cscript から指定するしかないのでしょうか。 <?XML version="1.0" standalone="yes" encoding="Shift_JIS" ?> <job> <script language="VBScript"><![CDATA[ Set Args=WScript.Arguments if args.named.count>0 then for each f in args.named Wscript.Echo "named="&f next end if if args.unnamed.count>0 then for each f in args.unnamed Wscript.Echo "unnamed="&f next end if ]]></script> </job>
>>592 です。
よくよく考えたら、後処理で標準出力を使うのでコマンドプロンプトから起動させないといけないことに気付きました。
ですのでこの質問は無視してください。申し訳ございません。
JScriptで実行しているコンソール画面の消去やカーソルの移動を行う方法が あったら教えてください。ANSIエスケープシーケンスが使えないので代替手段を 探しています。tailもどきみたいなツールを作りたいです
>586 join ではダメなん?
596 :
586 :2014/03/09(日) 20:57:07.19 ID:fvfMSQ5P
>>595 低レベルな相談にアドバイスをありがとうございます
joinを以下のように使ってみたのですが、エラーになってしまいました
set objArgs = Wscript.Arguments
Wscript.Echo Join(objArgs, " ")
実行
>cscript test.vbs aaa bbb ccc ddd
test.vbs(2, 1) Microsoft VBScript 実行時エラー: 引数の数が
一致していません。または不正なプロパティを指定しています。
Join関数の中のobjArgsをobjArgs.Itemにしても同じエラーでした
オブジェクト型?だとダメなんですかね
しかしよく考えたら、どうせパラメータ解析を行うときにFor Eachするので
そこでついでにつなぎ合わせて表示すれば良いことが判りました。ハズカシイ///
失礼しました
wsh はハードウェアを直接たたけないので高レベルだが、何か?
Win7です 特定のフォルダ1つの中に、沢山のサブフォルダが100個単位であります そことは違う場所に複数のファイルがあり、こいつらをさっきのサブフォルダにコピーや移動して整理したい 選択された個々のファイル名から、どのサブフォルダにコピー・移動すべきかはほぼ自動で決まります ただ、沢山のサブフォルダ群から目的のサブフォルダを探し出すのが面倒なので、それを自動化したい しかし、Win7のエクスプローラの操作感(上書き確認や別名でコピーなどの選択肢がサムネイルと日時付きで選べる)は そのまま生かしたい こういう場合にWSHは使えるでしょうか? FileSystemObject の CopyFile を使うとデフォルトで上書きされてしまうようで、不都合です 他のオブジェクトのメソッドで、エクスプローラのあのダイアログを使えるようなものはないでしょうか?
>>599 おお!ありがとうございます!
さっそく試してみます
>>599 フォルダまるごと、あるいは1個のファイルのコピーならば CopyHere が使えました
ありがとうございました
ただ、たとえばSendToにvbsファイルを登録して複数個のファイルのコピーをしようとすると
CopyHereの引数に複数ファイルを指定するやり方がググってみてもよく分からないため、
ループを回して1個ずつ個別にコピーしなければならず、
エクスプローラの「同じ処理を○個の競合に適用」が使えません
CopyHere に複数のファイルを渡すにはどうしたらよいのでしょうか?
エクスプローラの「同じ処理を○個の競合に適用」が使えなくても とりあえず使えればいいかな、と(テスト環境でなく)実際の環境で実践してみた結果・・・ 「実行できません。引数一覧が長すぎます。」 Oh・・・こんな仕様があったとは・・・orz
604 :
名無し~3.EXE :2014/03/19(水) 20:36:52.43 ID:WSz9wMSM
プログラム初心者です。 しょうもない質問で申し訳ないのですが、ご教授願います。 定時にアラートを鳴らす下記のスクリプト、二回目のポップアップ以降 タスクバーに隠れてしまいます。 OKが押されるまでポップアップを出し続けるにはどうすればよいでしょうか? OSはWindows7です。 よろしくお願いします。 strSoundFile="C:\Windows\Media\alert.wav" Set objShell = CreateObject("Wscript.Shell") Do While True objShell.Run strSoundFile,0,True If objShell.Popup("早く!", 3, "時間だよ", vbOKOnly) = 1 Then Exit Do Loop
逆に考えるんだ .popupって時間制限で消えるようにできるだろ? 戻り値が0にならない限り何度でも現れ直すようにすればいいだろ
ってすまん そういう風にしてるのか だとすればサウンドを鳴らすだけのスクリプトを別に作っていちいち起動するようにするとかか?
>>606 ありがとうございます。
それしか方法はないのでしょうか・・・
XPでは全く同じスクリプトで繰り返しポップアップが出てたのに、7に移植すると
2回目以降が隠れてしまって困り果ててます。。
If objShell.Popup("早く!", 3, "時間だよ", vbOKOnly+4096) = 1 Then Exit Do
609 :
604 :2014/03/23(日) 03:13:39.34 ID:Vw+/thwy
>>608 ありがとうございます!
うまくいきました!
こちらに質問してよかったです。
お手数おかけしました。
>>608 PopupってMB_SYSTEMMODAL(4096)とかのメッセージボックス用フラグも効くのか!
てことは
MB_DEFBUTTON1(0)、MB_DEFBUTTON2(256)、
MB_DEFBUTTON3(512)、MB_DEFBUTTON4(768)、
MB_SYSTEMMODAL(4096)、MB_SETFOREGROUND(65536)、MB_TOPMOST(262144)、
MB_RIGHT(524288)、MB_RTLREADING(1048576)
このへんも使えるんだな。知らんかった
>>610 MessageBox関数のパラメータは大体使えるよ
4 + 32 + 256とかでもちゃんと機能する
>>611 64以下のはMSDNとかにも記載があるけど他は…と思ったら
> natType の意味は、Microsoft Win32R アプリケーション プログラミング インターフェイスの MessageBox 関数で指定するものと同じです。
ちゃんとscript56.chmにも記載があったのね…見落としてたわ
ScriptFormをダウンロードできるサイト知りませんか? 誰かアプロダにでも上げてもらえないでしょうか
616 :
名無し~3.EXE :2014/03/31(月) 23:24:43.55 ID:cttL3XFr
IE11でbusyとReadyStateがサポートされなくなったらしいですけどうすればいいですか? よく使われてる以下のようなWaitLoad関数が駄目になって困ってます 環境はWin8.1、IE11です
//グーグルとこのスレ繰り返し開くだけのJSスクリプトです。
//1回目のループは上手く行くのに2回目のグーグルを開いた時に止まってしまいます。
var IE = WScript.CreateObject("InternetExplorer.Application");
IE.Visible = true;
for(;;){//終了処理なしです
IE.Navigate("
https://www.google.co.jp/ ");
WaitLoad();//2回目のここで止まる
IE.Navigate("
http://toro.2ch.net/test/read.cgi/win/1292764835/ ");
WaitLoad();
}
function WaitLoad() {
var stat, dstart;
stat = 0;
while(true)
if(stat == 0) {
if(!IE.Busy)
if(IE.Document.readyState == "complete") {
dstart = (new Date()).getTime();
stat = 1;
}
}
else {
if(!IE.Busy &&
IE.Document.readyState == "complete") {
if((new Date()).getTime() >= dstart + 1000)//止まった時にブラウザを落とすとこの行でエラーになってる
break;
}
else
stat = 0;
}
}
デバッグしろと?
下のはWin8.1、IE11の32/64bit両方で動いたよ
var IE = WScript.CreateObject('InternetExplorer.Application');
IE.Visible = true;
for (;;) {
IE.Navigate('
https://www.google.co.jp/ ');
wait(IE);
IE.Navigate('
http://toro.2ch.net/test/read.cgi/win/1292764835/ ');
wait(IE);
}
function wait(IE) {
WScript.Sleep(100);
while (IE.busy) WScript.Sleep(100);
while (IE.document.readyState !== 'complete') WScript.Sleep(100);
}
もう一つ、上記サイトに言及のある拡張保護モードか、保護モードを無効にしても同じ所で止まります
>>620 >IE11でbusyとReadyStateがサポートされてない件は他の方も困ってるみたいです
だって誰得?だもん
使ってる奴が居る以上誰得って言い方で切り捨ては出来ねぇと思うけどなぁ…
windows7に移行したら、XPで動いてたvbsがうまく動かない 具体的には ・msgboxが最前に出てこなくなった ・Appactivateの効きが悪い気がする なんか対策ありませんでしょうか
ありがとうございます。なんかいろいろできるんですね もう少し研究してみます win7もIE9もキライ
まぁwsh窓際だからね・・・
wsh/jscript/win7SP1-64bit で、普通の機動、または休止状態からの機動、またはスリープからの機動を判別するサンプルプログラムはありますか? やりたいことは、PCの上記の機動時に、ブルーデーディスクの残りHDD容量の推定値を表示できればいいかなぁと。 各曜日のディスク使用推定量は自分で入力するとして。
ブルーデーでググってみてごらん
普通の機動、または休止状態からの機動、またはスリープからの機動 にクスっときた
WSH全然関係ないけどタスクスケジューラで USBデバイスからの復帰をトリガーとして起動するタスクなんてものもあるけどな
DOSバッチまたはWSHでメインフレームのSYSINデータセットみたいなことできませんか? SYSINにVBScriptのソースを書いて、cscriptでそれを実行するとか、 SYSINにFTPのコマンドを書いて、FTP.exeに読ませるとか、 SYSINに適当な入力データを書いて、SYSINをtextファイルとして読み込むようなことをしたい。 SYSIN部分を別ファイルにすれば可能ですが、1個のファイルにしたくて。 ファイルのイメージ ---------- test.bat or test.vbs ------------- //SYSIN DD * 適当な入力データ // DOS/VBScriptのコマンドを書いてSYSINをtextファイルとして読み込む ---------- test.bat or test.vbs -------------
>633 WSHなら WScript.StdIn を使えばいいと思う
>>633 意識しないでデータを読みこむのは無理だと思うので、データ部分はコメント扱いされて実行されないようにしといて、
データを読み込むプロシージャを作成すれば良いんじゃないかな
【例】 batの場合はデータ部分を読み飛ばして、for文でデータを読み込む
@goto :proc
//SYSIN DD *
適当な入力データ
//
:proc
@echo off
for /f "skip=2 tokens=*" %%i in (%~f0) do (
set data=%%i
if "%%i" equ "//" goto :eof
call :output
)
goto :eof
:output
echo %data%
goto :eof
【例2】 jscriptの場合
if (0)
//SYSIN DD *
適当な入力データ
//
@end
処理スクリプト
【例3】 vbscriptの場合
jscriptの@if、@endの替わりにif false then、end ifを使う
>>633 何が欲しいのか今ひとつ分からんのだけど、
複数行に渡るような大きな文字列データを埋め込んどきたいってこと?
それならWSFでresource使う方法なんかもあるけど
>>634-636 Thanksです。
バッチとかスクリプトのファイルの中に、入力データを書きたかったのです。
数文字程度なら、バッチの環境変数で渡すて出来そうですが、
複数行の文章だとどうしても出来なくて。
昔仕事でやってたM/FのJCL文はそういうことができててよかったなあと。
resourceが一番自分の思ってるに近そうです。
JScriptだと(function(){/*〜〜〜〜*/}).toString();で楽にヒアドキュメントモドキができるんだけどね。
//SYSIN DD *
WSHで画面のバックライトを消す方法ってありますか? その手のツールやWin32APIを叩ける処理系使えば できるのですがWin標準機能で出来る方法があれば・・・
>641 ↓この1行でWindows標準のブランクスクリーンセーバーを起動できるけど、これじゃダメかな? CreateObject("WScript.Shell").Run "C:\Windows\System32\scrnsave.scr"
スクリーンセイバーでは、画面は暗く出来てもバックライトは消えないでしょ つまり、消費電力低下もバックライト寿命延長も望めない 「画面を暗く」とかではなく、わざわざ「バックライトを」と言ってるって事は、そういうのが目的だと思われ
wsh cscript ってみんな使っているの? どうもとっつきにくい 原因の一つは、予約語の長ったらしさと別ワールド感にあるような気がする。 バッチでだめならrubyでやってしまうもんな
WSHは事実上のWindows標準機能になって十数年経つし、 昔のWin95やWinNT4.0でも修正せず正常に実行できるものを手軽に作れる。 (それに対してバッチファイルはWin9x系とWinNT系での違いが特に大きいから、環境変数%OS%の値が "NT"か空欄かで処理を分岐させなければならない場合が少なくない) そういう点で他のスクリプト言語より随分とっつきやすいと思うが
どのWinでも動くメリットは大きい。会社のPCでも気軽に使えるし でもバイナリファイルの扱いに難があるのはしばしば困る あとこれはWSHに限ったことではないけどRubyと比べるとコードが 冗長化しやすい
バイナリファイルだって扱えないってわけじゃないし、それほど面倒lくさいってほどでもないと思う
ADODB.Streamはアンチウィルスソフトが騒ぐから使いにくい
それは環境依存の問題だろw 環境依存の問題を、WSHの問題であるかのように言う奴はアフォ 全てのアンチウィルスソフトがADODB.Streamに反応するわけじゃないし 後から反応しないように設定できる場合も多いので 言ってしまえば「どのWinでも起きる問題じゃない」って話だ
AviraがADODB.Streamの実行を阻止するらしいが、他にもある?
自分にはアンチウィルスソフトに駆除される可能性があると判っているものを 配布することは出来ない。バイナリファイルを扱うコードに限ればどのWinでも 動くというメリットは存在しない
WSH以外でインストール不要、テキスト配布可能、バイナリ操作可能、x86/x64環境対応、を満たすのは .NET Frameworkに含まれるC#やJScript.NETコンパイラ使うバッチファイル位しか実用的な選択肢がない。 ADODB.Streamの利用だけでウィルス扱いするクソアンチウィルスなんて所詮その程度のゴミ。 ADODB.Streamを難読化してアンチウィルスの検出回避してるコードとか見たことあるけど、 適当に回避仕込んで後は「アンチウィルスに排除されたらそのゴミを恨め」とでも言っとけばいい。 バイナリ配布使用が何しようが、どーせ巻き込まれるときは巻き込まれて機能不全起こすんだし。 一々ソース生成してコンパイルしたりインタプリタのインストールを要求するよりはWSH使ったほうが楽。 //つか配布して使わせるって前提ではRubyはnode.jsにすら劣る気が…
ウィルス対策ソフトでは大抵除外指定できるもんなんだがAviraはそういう機能ないのか? もしあるならreadmeで除外指定の説明しとけば十分なんだけどね
Rubyコードを配布するならインタプリタを同梱すれば良いだけでは インタプリタをインストールする必要はない。exerbみたいにPEに パックするツールもあることだし。難点を挙げるとすればでかいこと くらいか。PythonやJavaなんかでも似たような手法があるな WSHは社内利用でアプリの持ち込みが難しいく、誤爆しないことが 確認できている場合なんかには使うな
インタプリタの同梱はライセンス的に面倒くさいが、 Rubyとか単体インタプリタが公式から落とせないんだよなぁ… node.jsでさえ公式が配布してるnode.exeがあれば最低限は動くってのに。 PE化ツールはスクリプト言語としての利点が大きく減るので論外かな。 主観も入ってるがWindowsでツール作って配布したりするのにRubyは向いてなさすぎ。 つかなんでRuby押しな人がWSHスレに来てんだよ…スレチだろそんなん。
AviraでADODB.Streamの実験をしてみた 結論として var strm = new ActiveXObject("ADODB.Stream"); var adTypeBinary = 1; var adSaveCreateOverWrite = 2; この3行が全部存在したら弾かれる 実際に使うかどうかは関係なく、ADODB.Stream、adTypeBinary、adSaveCreateOverWriteの文字列が存在してたらアウト (adTypeText、adSaveCreateNotExistは問題ない) このうちどれか1つでも無くせば通る strm.Type = 1; と書けば通るなんて意味ない こんなん何のプロテクトにもなってなくてちゃんと書こうとしている正常なスクリプトだけが被害を被るだけじゃん あと、scanの除外の指定は簡単にできるのでそっちでファイルやフォルダを指定しとく手もある
strm[unescape(〜〜)]()でも通るのだろうし(専ブラ用のGetLog.wsfとかがコレ)、evalに詰めても多分通るだろうからな… 誤検出上等で作られた既存マルウェアとマッチするパターン定義なのだとしてもゴミすぎる。 まぁアンチウィルスが一般人を害するのなんて珍しい話じゃないけどな。 ノートンがリファラ削ってCSRF攻撃がより発生しやすくなった件もそうだけど、 アンチウィルスに対するフールプルーフも考慮しないと駄目になってしまったと……
(`_')
保守
ExcelVBAスレからこちらに誘導されました。 Sub test() Dim WSH, cmd, path, output As String Set WSH = CreateObject("WScript.Shell") path = """C:\Program Files\7-Zip\7z.exe""" output = """C:\Program Files\7-Zip\output.txt""" cmd = path & " > " & output WSH.Run "%ComSpec% /c " & cmd End Sub プログラムをshell.runで実行して、結果をプログラムと同じ場所にをテキスト出力したいんですが 上記のプログラムですと、テキストすら作成されずエラーも出ません。 試しにcmdの中をコマンドプロンプトで実行すると上手くテキスト出力できました。 環境変数の中も問題ない事確認しました。 一体何が原因でどうすれば意図通りに出力できるでしょうか?
execは出力が長いと切れてしまうのと チカチカするのでなるべくRunで動作させたいです・・・。
まさかとは思うけど、定義だけでtestをcallしてないってオチじゃないだろうな
Sub test() Dim WSH, exec, cmd, path, output, Result, Errorcatch As String Set WSH = CreateObject("WScript.Shell") path = """C:\Program Files\7-Zip\7z.exe""" output = """C:\Program Files\7-Zip\output.txt""" cmd = path & " > " & output Set exec = WSH.exec("%ComSpec% /c " & cmd) Do While exec.Status = 0 DoEvents Loop Result = exec.StdOut.ReadAll Errorcatch = exec.StdErr.ReadAll End Sub 試しにexecに書き換えてこれでエラーメッセージを拾うと "'C:\Program' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。" ある筈の引用符が認識されなくなってるようだけど wshって引用符を2つ以上受け入れられない仕様なんでしょうかね? 何にしろexecを使って出力しか無いようですね。
runで””が展開されて、cmd.exeが””無し文字列渡されてるだけ VBS以前の問題すな ---- path = """""C:\Program Files\7-Zip\7z.exe""" output = """C:\Users\hoge\Desktop\output.txt"""""
WSH(JScript)からUACの権限の昇格無しにvhdファイルを任意のドライブレターでマウント、アンマウントする方法ってあります? diskpartを使うと起動時にUACの権限昇格のプロンプトが出てしまうので出来ればそれを避けたいです さらにdiskpartだと任意のドライブレターにするのもちょっとめんどくさい・・・ マイコンピュータの管理からマウントするときは権限昇格のプロンプトが出ないのでマウント操作自体は権限昇格無しにできるはず・・・
>>667 WSH的な方法もあるとは思うけど、面倒くさいからWScript.ShellのSendKeysで。
自身をrunasで実行するコードを書いてネットワークドライブにコピーして実行したら WScript.exe「ファイルが見つかりません」 管理者で実行するとネットワークドライブにあるスクリプトを実行できないっぽい。なんつートラップ・・・orz でもUNCパスなら実行できるっぽい。変換するのマンドクセ・・・
>>669 ユーザが違うからファイル共有のログイン状態が引き継がれないんだろう。
WSHの問題じゃなくて純粋にそのファイルが管理者権限側から見えてない。
ネットワークドライブの割り当ても引き継がれないってのは知らなかったが…考えて見れば当然だな。
runas notepadからファイルを開くでマイコンピュータ見に行けば確認できる。
ネットワークドライブ上から実行せず、UNCパスの方から実行すれば普通に動くんじゃないかな。
ただ、ログインの必要なファイル共有の場合はどっちみちダメ。
自身をテンポラリに複製するしか無いのかなぁ…管理者以外での実行も想定するならAll Users。
おそらく今更な話だと思うけど調べてもよく分からないので教えて下さい var document = new ActiveXObject("htmlfile")でquerySelectorが使えないのは何故なんでしょう 互換モードで動いてるのが悪いのかと思ってmetaタグでIE=edgeを食わせたりしましたがやっぱり動きません 実用的にはjQueryでいいんですが、動かない理由が気になって仕方ありません
new ActiveXObject("htmlfile")で得られるTridentエンジンそれ自体がMSIE7系統のものなんじゃないの? アプリケーションとしてインストールされているIEと、コンポーネントとして動くIEは別だったりもする。 document.parentWindow.navigator.userAgentを見ればIE7の互換モードらしいことが分かる。 IE7ないしその互換状態のIEコンポーネントではquerySelectorは実装されて無いはず。 metaタグでIE=edgeを食わせるのに成功しててもその場合取得したdocumentとwindowは別物になるんじゃないかと。 そのうえwindow.location.hrefを書き換えてもdocumentはそのまま参照できる状態が続いてしまう。 オブジェクト作る時点で互換モードじゃないオブジェクト作る方法があれば出来そうな気がするけどよく分からん。
ありがとうございます何となく分かりました htmlfileというオブジェクトの実体は25336920-03F9-11CF-8FD0-00AA00686F13ですが その下位キーにMicrosoft.mshtml, Version=7.0.3300.0というのがありますね IE9のmshtml.dllのversionは9.xのようですからIE7相当の物を叩いてるという認識で間違いないようです 原因がはっきりしてスカッとしました
674 :
669 :2014/12/02(火) 20:38:48.68 ID:zhlSz+62
>>670 遅くなってスマン。レスありがとう
ドライブレターをUNCパスに変換するコードを書いて・・・っとやっていたんだけど
ふと管理者でもネットワークドライブをマウントしてしまえばいいんじゃね?と気が付いた
やってみたらいけそうな感じ
ネットワークドライブマウント用のスクリプトを改変するのが一番楽かも
ie9以降のJavascriptエンジン(chakra)を使う方法 tp://subtech.g.hatena.ne.jp/mayuki/20111216/1324015296
スクリプトのダブルクリックで起動させたいなら>44の方法で
>>675 wsh 5以降のバージョンアップ履歴がわからんので
だれもが興味ないと思われ。
便利な機能があったら使いたいが。
678 :
HDI ◆hbVYHgubO6hK :2015/02/01(日) 05:00:21.01 ID:m75TbliY
MS IMEのプロパティ(ローマ字入力か仮名入力か、キーアサインはMS式か ATOK式かVJE式か、オートコレクトの対象は…、etc.)をログオン直後に スクリプトで変更したいのですが、何かいい方法はありますか? ネットカフェとか公共図書館のPCコーナーとかに入ったときにいちいち 初期状態から変更するのが面倒なので、ワンクリックで処理したいのです。 WSHで無理ならExcel VBAとかC++とかでも構いません。 適用したい対象としては、Windows XP以降・Office 2007以降のすべての バージョンのMS製IMEが操作できればベストです。 逆に、MS以外の他社のIME、たとえばATOKとかGoogleとかは無視して可です。 デフォルトでMS以外のIMEだけが入っているということはまずないので。 var ime=new ActiveXObject("xxxx.xxxx"); から書き始めるんだろうなあ…とは 思うものの、マシンの中にどういうActiveXが入っているのか調べる方法を 知らない有様ですので、その点についても教えていただければ幸いです。 データがHKEY_CURRENT_USERにあることは確認していますが、これを読み込むのは 起動時のみのようで(起動後にレジストリエディタで書き換えても反映されない)、 起動のたびに設定がまっさらになるマシンでは、レジストリの書き換えでは 無理なように思います。 よろしくお願いします。
MS-IME
ATOK
33歳
682 :
【豚】 :2015/02/01(日) 06:43:40.20 ID:8yntfalp
(´・ω・`)
webとwshを覚え始めたころ、 両方とも、Jscript/Javascript が使えるので スクリプトはそれだけ覚えればいいじゃん ということにしたら、 wshのサンプルプログラムは、VBscriptが大半で、 もういいや、と思って、はや9年。
WSHはオワコンそれは間違いない、じゃあ何を使えば良いのかPowerShellかつーとこれはちょっと方向性が違う MSもいい加減何か考えろよ、それとも後継は.netということなのか
>>684 気軽に書けるインタプリタ言語、という縛りをかけると、
WSHを機能拡張するしか道はないように思う。
UNIX屋さんがいまだに/bin/shとかMakefileとかで作業してるみたいに。
ちとおたずねしたい事があるでレスします。 ファイル名のリネームのひな型を作ってるのですが Option Explicit dim objFL,objFLD,rename Set objFL = CreateObject("Scripting.FileSystemObject") Set objFL = objFL.GetFolder("C:\temp") Set objFLD = objFL.Files rename = "150202.jpg" objFLD.Item(rename).Name = "001.jpg" 上記で実行すると 「プロシージャの呼び出し、または引数が不正です。」 というエラーが出てしまいます。 下の部分を objFLD.Item("150202.jpg").Name = "001.jpg" に書換え rename = "150202.jpg" を削除すると ファイル名が変更されました。 Itemプロパティの引数に変数は使えないのでしょうか?
>>686 VBSは使わないのでItemプロパティで変数が使えない理由は知らないが
なぜGetFileを使わないの?
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFILE = objFSO.GetFile("c:\temp" & "\" & rename)
objFILE.Name = "001.jpg"
でいいと思うけど
>>687 知らなかったから……(恥)
まあ複数のファイルを扱いたかったのでFilesコレクションが
使えればと、ここでできなければ他の方法を探す予定でした。
近い形ができたので
Option Explicit
dim objFL,objFLD,objItem,i,l,objFiles(),objFSO,objFILE
Set objFL = CreateObject("Scripting.FileSystemObject")
Set objFL = objFL.GetFolder("C:\temp")
Set objFLD = objFL.Files
ReDim objFiles(objFLD.Count)
i = 1
For Each objItem In objFLD
Set objFiles(i) = objItem
i = i + 1
Next
l = i
i = 1
For i = 1 To l
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFILE = objFSO.GetFile(objFiles(i))
objFILE.Name = InputBox(objFiles(i)&"の名前を変更してください")
Next
これもエラーが出てますが土日は来れないと思いますのでひとまず。
>>687 それとお礼を忘れてました(汗)
有難うございます。
WSH
>>686 もう解決しているようだけど…ちょっとみてみた
CStr()するとか文字列演算するとかするとエラーにならないね
JScriptで似たようなコードだと、そんな変換必要ないし不思議だね
VBS使わないなあ
>>688 回りくどいことしてるけど、単純に以下のようにしちゃダメなの?
Option Explicit
dim objFSO,objFLD,objFC,objFILE
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFLD= objFSO.GetFolder("c:\temp")
Set objFC = objFLD.Files
For Each objFILE In objFC
objFILE.Name = InputBox(objFILE.Path & "の名前を変更してください")
Next
基本的な部分はもっと単純に出来る Dim objFSO,objFILE Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objFILE In objFSO.GetFolder("c:\temp").Files objFILE.Name = InputBox(objFILE.Path & "の名前を変更してください") Next 使い回さないなら、フォルダオブジェクトもファイルコレクションも変数に取る必要はない でも逆に複雑にというか例外処理を入れた方が良い部分があり InputBoxの戻り値は、直接ファイルオブジェクトのNameプロパティに代入しないで 一度変数に取り、空の場合、元のファイル名と同じ場合、重複がある場合などの対策を取った方が良い とにかく、「フォルダ内の全ファイル」って対象のリネーム作業は 途中でエラー出して強制終了すると、リネーム終ってるものも含めて最初からやり直しで しかもリネーム終ってるものはそのままのファイル名にしたくても NameプロパティにInputBoxの戻り値を直接代入している状態では、未入力でOKやEnter押せばエラーになり キャンセルボタンを押してもエラーになり、同じ名前を入力してもエラーになりで収集が付かなくなる 別の回避策としては、リネームが終ったファイルはc:\tempからc:\temp\#renameに ファイル名変更と同時に移動を行い、処理の最後でc:\temp\#rename内の全ファイルを c:\tempに移動してc:\temp\#renameを削除するって手もある これなら途中のエラーで強制終了しても、次に実行した時にエラーになったファイルから始められるし 途中で強制終了せずに最後まで正常実行されれば、移動したファイルも元に戻るし 作った一時待避用フォルダも残らないので、結果は全く変わらない 説明が長くなったが、ファイル名変更って取っ掛かりは簡単だけど、まともなものを作るのはそれだけ難しいってこった 他には、使用不可文字とか、ファイルがロックされてるとかもあり得るしね 因みに知ってるかもしれないが、MsgBoxのボタン指定でvbYesNoCancelを使うと、三択の処理分けが出来るので 戻り値がEmptyだったら「はい→スキップ」「いいえ→再入力」「キャンセル→処理全体を終了」とか 重複がある場合は「はい→自動連番化」「いいえ→再入力」「キャンセル→スキップ」とかの対策が出来る
ファイルの取り扱いで多摩にあるのがフルパス長すぎでエラーが返るとかもあるな
遅くなりまして済みませんようやく返事します。
>>691 CStr()はダメだった、文字列演算はやってない
JScriptは知識不足でできなかった申し訳ない。
>>693 思いつかなかっただけです(汗)
>>694 >NameプロパティにInputBoxの戻り値を直接代入している状態では、
>未入力でOKやEnter押せばエラーになり
>キャンセルボタンを押してもエラーになり、
>同じ名前を入力してもエラーになりで収集が付かなくなる
なんか例外処理を入れた方が良さそうだが、自分1人でファイル数も
2〜3個を毎週処理する形なので単純な方を選びます。
>MsgBoxのボタン指定でvbYesNoCancelを使うと、
>三択の処理分けが出来るので
知っておりません……(再汗)
リネームに追加部分をつけるので
>>694 がシンプルでいいが使い回しの点で
>>693 のコードにするかもしれない、WSHを使おうと思ったのは省力化と
WHSの勉強を兼ねてなのだが省力化からはもう逸脱しているようだ(笑)
皆さんレスありがとうございました。
個人で使うにしても せめて、入力のスキップと途中での中断とリネーム後のエラーチェックとそのリトライかキャンセル ぐらいは組み込んだらいいと思う
>>696 うちの環境では
objFLD.Item(rename).Name = "001.jpg"
を
objFLD.Item(CStr(rename)).Name = "001.jpg"
もしくは
objFLD.Item(rename & "").Name = "001.jpg"
でエラーが出なくなったよ
(そもそも最初のがなぜエラーになるかわかんないけど)
>>698 どもありがとうございました。
これで動作しました。
>>696 で試した時は
rename = "150202.jpg"
objFLD.Item(rename).Name = "001.jpg"
の間に
rename = CStr(rename)
を入れてました。
これを含めて改めて自分のコードを
見るとくどいな。
>>699 ちょっとエラーチェックを入れたのを作ったので参考にどうぞ
Option Explicit
Const cFolder = "c:\temp"
Dim MyName
Dim FSO, folder, file, r, name, tmpname
Call renameAll()
Set FSO = Nothing
Sub renameAll()
Set FSO = CreateObject("Scripting.FileSystemObject")
MyName = cFolder & "の全ファイルリネーム"
If FSO.FolderExists(cFolder) Then
Set folder = FSO.GetFolder(cFolder)
For Each file In folder.Files
tmpname = ""
Do
Do
name = InputBox(file.Path & "の名前を変更してください", MyName, tmpname)
If name="" Then
r = MsgBox("終了していいですか",vbYesNo+vbQuestion, MyName) '=6:vbYes =7:vbNo
If r = vbYes Then
Exit For
End If
End If
Loop While name=""
r = rename(file, name) If r = vbAbort Then Exit For End If tmpname = name Loop While r = vbRetry Next End If End Sub Function rename(file, name) '=0:finished =3:中止 =4:再試行 =5:無視 rename = 0 On Error Resume Next Err.Clear file.Name = name If Err.Number <> 0 Then rename = MsgBox("リネームできませんでした" & vbCrLf & Err.Description, _ vbAbortRetryIgnore+vbDefaultButton2+vbExclamation, _ file.Path & "のリネーム") End If End Function
お前らpastebin使えよcodeを直接貼るんじゃない
>>700 どうもありがとうございます
参考にさせていただきます。
>>703 ついでにソートもどうぞ(
>>700 でfolder.Files→sortFiles(folder.Files)に変更)
Function sortFiles(files)
Dim rs, files2, f, i, newfiles
ReDim filesArray(files.Count-1)
Set rs = CreateObject("ADODB.Recordset")
Call rs.Fields.Append("index", 3, 255) '=3:adInteger
Call rs.Fields.Append("name", 200, 255) '=200:adVarChar
Call rs.Fields.Append("dateLastModified", 7) '=7:adDate
Call rs.Open()
i = 0
For Each f In files
Call rs.AddNew()
rs.Fields("index").Value = i
rs.Fields("name").Value = f.Name
rs.Fields("dateLastModified").Value = f.DateLastModified
Set filesArray(i) = f
i = i + 1
Next
Call rs.Update()
rs.Sort = "dateLastModified DESC" 'ASC:昇順 DESC:降順
files2 = rs.GetRows()
Call rs.Close()
Set rs = Nothing
Set newfiles = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(files2, 2)
newfiles.Add filesArray(files2(0,i)), filesArray(files2(0,i))
Next
Set sortFiles = newfiles
Set newfiles = Nothing
End Function
ちょっと修正
>>700 Set FSO = CreateObject("Scripting.FileSystemObject")
をSubの外へ出す
Set FSO = CreateObject("Scripting.FileSystemObject")
Call renameAll()
Set FSO = Nothing
>>704 Call rs.Fields.Append("index", 3, 255) '=3:adInteger
↓
Call rs.Fields.Append("index", 3) '=3:adInteger
ちょっとVBSを勉強して扱ってみたけどなんかやっぱり俺には合わん気がした
言語的にではなく、アルゴリズム的にこういう幼稚なコード書く奴は どの言語使ったってどうせろくなものは作れないだろうから VBSが合わないというより、プログラミングが合わないんだろうね それなりに知識はありそうだけど、頭でっかちで柔軟性が無く 本質的に何が必要で何が無駄かを正しく判断できないタイプ
美しいスクリプトを書くコンテストじゃないんだから 幼稚な表現だろうが 何も書けない、デバックできないよりはよっぽどマシ。 書けることによって、人生やPC生活を楽しんだものの勝ち。
向上心が欠片も感じられないレスですな
コードが美しくないってのは別にどうでもいいけど 物事の考え方が美しくないってのは、 プログラムだけではなく日常生活にも滲み出てるだろうからな 彼の場合、パソコンを使って、プログラムを使って、何を成すかではなく パソコンに詳しい俺、プログラミング出来る俺、を顕示するための道具が パソコンやプログラムなだけなんだよね シャコタンにしたり、スモーク貼りまくったり、ステッカー貼りまくったり 無駄にデカいホイール履いたり、無駄に音が大きいマフラー付けたりして 周りから見たら、アニメ絵とかを貼ってるイタ車とは違っても別な意味で痛いだけの車を、 自己顕示の道具として扱ってるDQNと大差ない
それをマニアとかヲタクとか言う
美しいcodeってのは効率的なcodeだ ブサイクだろうと動いてるcodeは良いcodeってのは現場の実用論に過ぎない
ここはwindows板だ コードを貼るなとか汚いコードとか無駄なコードは向上心のないDQNとか そういうことで文句言うのはプログラマのいる板でやってくれ 過去そういうことで文句言ったやつはいないだろ
> ここは稚拙な俺のコードにも、誰も文句を付けないスレであり続けて欲しい まで読んだ
うんまあ要するにだね、pastebin使えって言われたのに無視して貼り続けたから半分荒らし扱いされてんだよ
モニタを切るのにメッセージを投げようとSFC mini使ったんだけど上手くいかないorz Option Explicit Const HWND_BROADCAST = &HFFFF Const WM_SYSCOMMAND = &H0112 Const SC_MONITORPOWER = &HF170 Const MONITOR_OFF = 2 Dim PostMessage Set PostMessage = CreateObject("SfcMini.DynaCall") PostMessage.Declare "user32", "PostMessage" PostMessage HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF WScript.Quit 0 (つづく)
(つづき) で、PowerShellでそれらしいの実行したら上手くいく・・・んだけど PowerShellでヒアドキュメントや型追加なんかかったるいし読みづらい $HWND_BROADCAST = 0xFFFF $WM_SYSCOMMAND = 0x0112 $SC_MONITORPOWER = 0xF170 $MONITOR_OFF = 2 $signature = @' [DllImport("user32.dll")] public static extern bool PostMessage( IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); '@ $monoff = Add-Type ` -MemberDefinition $signature -Name "Win32PostMessage" ` -Namespace "Win32Functions" -PassThru $monoff::PostMessage($HWND_BROADCAST, $WM_SYSCOMMAND, $SC_MONITORPOWER, $MONITOR_OFF) $null なぜにWSHだとダメなんでしょ? SFC miniの使い方間違ってるんでしょうか? 環境はXP、Win7 Pro、Win7 HomePro(いづれもx86)です
718 :
717 :2015/02/21(土) 16:07:02.66 ID:VnpKOASo
> Win7 HomePro Win7 Home Premiumの間違いorz
PostMessage.Declare "user32", "PostMessageA" にしてみれば?
>>719 やってみたんだけどダメでした
で、SC_MONITORPOWERだけじゃなく他の値も無反応だったので、ググってうちに
VB/VBA等で書かれてるページが幾つか見つかって眺めててたんだけど・・・
APIのI/FはwParam型(INT32)なんでSC_MONITORPOWERはlong型で渡さなきゃ
ダメだと気づきました(つまらない凡ミスorz
>>716 を
Const SC_MONITORPOWER = &HF170& 'long型を明示
で上手く動きました!(cscript.exeでダケだけど)
すごく初歩的な質問なのですが False,0,Null,Empty,"False","0"以外は真になるとのことなので 'この二つが真になるのはわかるんですが if 1 then MsgBox "真" End If if 9 and 10 then MsgBox "真" End If '↓これが真にならないのはなぜですか? if 2 and 9 then MsgBox "真にならない" End If 'これだと問題ありません if 2 then if 9 then MsgBox "真" End If End If 二つの関数からの戻り値が両方とも0以外なら真にしたかったのですが それ自体はちゃんと指定すれば解決したのですがなんかすごい気になってしまって
>>721 2 = 0010
9 = 1001
だからでそ
723 :
名無し~3.EXE :2015/02/26(木) 00:46:02.74 ID:oLPusGvh
ファイルサーバ上にあるフォルダを共有フォルダにしたくて次のスクリプトをメモ帳にコピべしてvbs拡張子にして保存して、ダブルクリックしたのですが、何も表示されず、共有フォルダも表示されません。なにがダメなのでしょうか? Const FILE_SHARE = 0 Const MAXIMUM_CONNECTIONS = "" strComputer = "atl-ws-01" Set objWMIService = GetObject _ ("winmgmts:\\" & strComputer & "\root\cimv2") Set objNewShare = objWMIService.Get("Win32_Share") errReturn = objNewShare.Create _ ("C:\Public", "PublicShare", FILE_SHARE, _ MAXIMUM_CONNECTIONS, "Public share for Fabrikam employees.") パラメータ 説明 "C:\Public" ファイルサーバ内の共有するフォルダのローカル パス "PublicShare" 共有フォルダの共有名 FILE_SHARE 作成する共有の種類 MAXIMUM_CONNECTIONS 共有に同時に接続できるユーザーの最大数 "Fabrikam 社員用のパブリック共有" 共有フォルダの説明
>>721 VBのAndは「AND演算」を行う
そのまま渡すのはTrue,Falseだけにして、それ以外は比較演算子や判定関数に渡したほうが良いよ
725 :
名無し~3.EXE :
2015/03/02(月) 21:57:26.73 ID:4eCMeSu6 >>721 偽のときの戻り値がゼロと決めてあるのなら、
if function1()<>0 and function2()<>0 then
と書ける。
0の場合もあるけどFalseとか""とかの場合もある、ということになると
(VBというよりExcelのワークシート関数とかでよくある罠だが)、
一つ一つの関数の結果を変数にとるなりしなきゃいけない。
VBのAndにはもう一つ罠がある。単純な例だがこんなのはダメ。
if x<>0 and f(1.0/x)=2 then