お前ら、wsh使ってますか? Part8
レス数が900を超えています。1000を超えると表示できなくなるよ。
こんなことコンピュータにやらせろよ。そう思ったことはありませんか?
簡易的な実行環境も含めて普通のOSだったら当たり前に備わっている自動実行。
Windowsの標準に備わっているそれがWSH(Windows Script Host)です。
また、ここではWSHだけに限らずWMI、ADSIなどのネタもOKです。
・煽りや荒らしは無視の方針で。基本的にsage進行です。
・ここでヒントを得て完成したスクリプトは、出来れば皆さんにお披露目してください。
同じことで悩んでいる人のためになります。
・質問する際は、OS及び使用するコンポーネントのバージョンもお忘れなく。
前スレ
お前ら、wsh使ってますか? Part7
http://hibari.2ch.net/test/read.cgi/win/1190548945/ 2 名前:名無し~3.EXE[sage] 投稿日:2007/09/23(日) 21:03:13 ID:2RosR0QK
●便利なリンク
Windows Script
http://www.microsoft.com/japan/msdn/scripting/default.asp
MSDN Library (オンラインドキュメント)
http://msdn.microsoft.com/library/ja/
Windows Script 5.6 ドキュメント ダウンロード (exe 形式; 1.67 MB)
http://download.microsoft.com/download/winscript56/Install/5.6/W98NT42KMe/JA/scd56jp.exe
OLE/COM Object Viewer ダウンロード (exe 形式; 656 KB)
http://download.microsoft.com/download/win2000platform/oleview/1.00.0.1/NT5/EN-US/oleview_setup.exe
Sesame Script (スクリプト作成初心者向けコラム)
http://www.microsoft.com/japan/technet/scriptcenter/resources/begin/default.mspx
Hey, Scripting Guy! (スクリプトのQ&A・ハウトゥ集)
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/default.mspx
Windows管理者のためのWindows Script Host入門 (@IT内記事)
http://www.atmarkit.co.jp/fwin2k/operation/wsh01/wsh01_01.html
Windows XP に含まれるコマンドラインツールの紹介 (@IT内記事)
http://www.atmarkit.co.jp/fwin2k/xp_feature/013commandtool/commandtool.html
ADSI (Active Directory Service Interfaces) の特集記事全文
http://web.archive.org/web/20050309045811/http://www.galliver.co.jp/writing/nikkei_tokushu/wad002/index.html
●個人サイト
Windows Script Wiki
ttp://winscript.s41.xrea.com/wiki/index.php
趣味のJavaScriptなページ
ttp://homepage3.nifty.com/aya_js/
Windows Scripting Host Laboratory
ttp://www.roy.hi-ho.ne.jp/mutaguchi/wsh/
Tips - (小技にも満たない)微ワザ集
ttp://www1.u-netsurf.ne.jp/~tomo_c/tips/Scr002.html ●WSH(COM)参考書籍
「はじめてのWindows Scripting Host」 (株)アンク著 技術評論社
http://www.amazon.co.jp/gp/product/477410650X/
「[改訂版] VBScriptポケットリファレンス」
http://www.amazon.co.jp/gp/product/4774127930/
「使いながら覚えるWindows Scripting Hostプログラミング入門」 竹田英雄著 エーアイ出版
http://www.amazon.co.jp/gp/product/4871936678/
「Windows Scripting Host入門 with VBScript」 毎日コミュニケーションズ
http://www.amazon.co.jp/gp/product/4839900906/
「WSHで楽しむWindows95/98/NT4.0版 ウィンドウズ・スクリプティング入門 VBScript編」 メディアテック出版
http://www.amazon.co.jp/gp/product/4896270207/
「WSHクイックリファレンス」 羽山博著 オライリー・ジャパン
http://www.amazon.co.jp/gp/product/4873110068/
「Rubyを256倍使う本 邪道編」 arton著 ASCII
http://www.amazon.co.jp/gp/product/4756136036/
「ADSIスクリプトによるWindows2000システム管理 Windows2000管理者ガイドブック」ピアソン・エデュケーション トーマス・エック 著
http://www.amazon.co.jp/gp/product/4894712881/ (どちらかというとVBによる操作本?)
「標準ASPテクニカルリファレンス」山田祥寛著 SOFTBANK
http://www.amazon.co.jp/gp/product/4797314001/ ---------------------------
Windows Script Host
---------------------------
スクリプト: C:\Users\10\Desktop\10.js
行: 1
文字: 1
エラー: 'Wscript' は宣言されていません。
コード: 800A1391
ソース: Microsoft JScript 実行時エラー
---------------------------
OK
---------------------------
>>13
一般的なデフォルトだと使えるのはVBSとJSCRIPTですよね? wsfが何か解ってての発言ならそう
解ってなくての発言なら「wsfもデフォルト、しかもwsf内でVBSとJS、更に他のActiveScript対応言語が混在できる」と言っておく 汎用的なんつー曖昧なことをいうからだ。
どれも何かの処理に特化したもんでもないし*それなりに*汎用的だ。 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がいいって事だよ
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" );
たらたら
スマートではないな。 むしろ俺はWSHもcscriptでやるし、wscriptでもmsgbox表示するぞ
何かしらの表示があったほうが進行状況が分かって個人的に安心できる ついでに
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を足した結果に、文字を付け足しても数字がおかしくならない"); わかりにくいかもしれないんで、書き直します。たとえば、関数の戻り値がおかしくなっちゃうのです。
test=function(n){
return( "合計 "+ (33.48 + n)+ "" + " 秒です");
};
oshl=new ActiveXObject('WScript.Shell');
n=60;
oshl.popup( test(n));// この場合は、数字がおかしい。
n=100;
oshl.popup( test(n));// この場合は、数字は問題ない。
ぐぐったら、これが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使うときいつも困る。 >>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\"]'
とエラーが返ってくるのですが、いまいち原因が分かりません。
すみませんが教えて下さい。 @echo off
ruby -x "%~0"
goto :exit
#!ruby
puts "hello"
で.batとrubyを混在させることができますが
同様に.vbsファイル中にbatのコードを記述するやり方があったら教えてください。 >>89
そうだよな
>>88
batファイルの中に vbs のコードを記述するんだろ?
>>45 とかじゃね 同様にって言うなら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"));
インターネットオプション セキュリティ インターネット 低 >>112
SFCminiのDLLをインストールしてやる方法もあるよ。
CopyPathToClipBoard.vbs
ttp://d.hatena.ne.jp/Shinez/20100730/p1 ただこんな話もあるようですが・・・
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バイト文字が化ける >>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でコマンドラインを取得する ダイアログを表示させずにファイルをごみ箱へ移動するスクリプトが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}") >>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になります 非同期だから待ち合わせしないとあかんみたいよ
参考ソース
ttp://www.vector.co.jp/soft/winnt/util/se427319.html >>141
136はvector(Remove.CMD)のソースをテスト用に改変したものです。Remove.CMDも2000では動きません
非同期回避のループ文が有るとファイルが本来と違う場所に移動した後でエラーを吐きます
またD&D操作でなく、スクリプト内で削除するファイルを決め打ちにするとファイルは移動もしなくなります
2000のwshバージョンを5.7に上げても効果ありませんでした ttp://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list39.shtml
の
管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 06月 22日 22時 45分 04秒
に既出やね 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で動くものが出来上がるのでしょうか? すいません。 >>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を呼び出して選択した結果を受け取るのってどうやるの?
なんか参考になるサイトとかあったら教えていただけませんでしょうか ドライブに挿入された音楽CDの
CDシリアル番号を取得することってできる?
cdaファイルをパースするのはナシの方向で。
というのもCDがマルチセッションだと
cdaファイルにパス名でアクセス出来ないので。 >>167
お手軽なのは、連絡用ファイルを設定して、HTA側から結果をカキコ。
WSH側は.Sleep → Loop 辺りでテキト〜に待ち合わせ。
神ブログ:ttp://scripting.cocolog-nifty.com/blog/2007/07/hta_2d73.html
をパクって、CreateHTAObject()を作ってみたこともあったが、
アイ〜ン立ち上げて、またHTA≒アイ〜ン立ち上げるのは、やっぱ速度でほんのり難が^^ >>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部分の書き換えなんてしなくて良い >>171-179
皆様ありがとうございます。もう見放されたかと思ってましたw
HTAから標準出力を使いたかったのですが自力ではできなかったので、vb.netで挑戦しようかと考えていました。
これからレスと参考リンクを読んでいろいろやってみます。 ぐぐってたら、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 アプリケーションではありません。
悪い、変なエラーが出てて気になって再起動したら
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使ってメール送信してるんですが
受信したメールを転送できなくさせるプロパティや別の方法ありませんか?
ご教示を… もうちっと背景を晒せ
なぜメールを送りたいのか 相手は人間なのか
相手はどんなツールで転送するのか 相手が転送したら何がまずいのか >>191
>なぜメールを送りたいのか
システム上で使用する為
>相手は人間なのか
受信者は人間
>相手はどんなツールで転送するのか
超マイナーなメーラ
>相手が転送したら何がまずいのか
セキュリティ上の問題
本文コピペすりゃ意味ないんだけどねw
簡単に概略を説明を付け足す
VB系言語で使用しており、現に正常に機能している。
VB内でActiveXのCODオブジェクトを使用し、Message関数でメールをSMPT送信している。
この部分に機能を追加すると言う意味です。
欲しい機能は、受信者がそのメールを転送できなくする事。
メール送信時にMessage関数のプロパティとかで付加できないかなぁと淡い期待をいだいている。
そもそもメールが転送できなくなる機能がメールプロトコルに存在した事すら今日知った。
メールのオプションで「重要」とか「受信者がメール開いたら送信者へ受信確認を行う」とかの設定あるでしょ?
あんな感じで「転送不可」にする設定があるらしい。
それをWSHやらのWindows Scriptでちょちょいとハックしてやりたい。 解決した
Message.Sensitivityでできる
ただSMTP送信ではムリだったので諦めてVBのSendで結局やる事になりそうだわ Sensitivityって、ほとんどOutllookでしかサポートされてないのとちゃう? >>194
OL以外でもSensitivityが機能するメーラがあるんだな、これが
まぁ、普通はこんな機能使わないし本文コピペできるから意味ないけどw basp21のdllでメールの送受信するスクリプト書いてます。
sslの処理は、melonにお願いしてpop3で受信してます。
メールの受信でほかにもっと便利なActiveXのDLLはあるんでしょうか? いくらでもあるけど、何を以て便利と感じるかは人それぞれ
なので、いろいろ使って自分が一番便利だと思うのを使えば良い IE9を入れるとmshta.exeがバージョンアップし
sfcminiのCallBackが利かなくなるんだが
誰が解決策を見つけた人がいたら教えて。
何らかのセキュリティ制限に掛かっていると思うんだが。 >>153
PHPでも関数使えるでしょ(´・ω・`) 関数が使えるから関数型言語ってw
そんなアホなこと言う奴まだいたんだw JScriptを使い始めたんですが
関数の引数に使用できるオブジェクトの一覧みたいなのないですか?
ある関数Aでオブジェクト作って、それを引数にして別の関数Bに投げて、
戻り値をAでまた処理する〜みたいなことをやってるんですが
オブジェクトによって引数にできるものとできないものがあるみたいで…
試行錯誤してるうちに、ArrayオブジェクトとStringオブジェクトは使えるけど
FileSystemObject オブジェクトからGetFolderメソッドで取得したフォルダオブジェクトは使えない〜みたいな経験則は分かってきたんですが
時間がかかりすぎるんで一括で知りたいんです
でもういうドキュメントが見つからなくて……
ご存知でしたら教えくてください どんなオブジェクトでも関数の引数に使用できるが?
使えない〜って〜のがわからん Default Property のことだな。
そんなモン使うな。 Default Propertyがあるとオブジェクトそのものが渡せんてこと?
ならDefault Propertyがあるオブジェクトの一覧がほしいってこと? サーセン、なんか今日書き直してみたら普通にフォルダオブジェクトも渡せました
別の部分が間違ってたみたいです
>>208
使うとなんかマズイですか?
>>207,209
とりあえずどんなオブジェクトでも渡せるってことが分かれば十分です
ありがとうございました 色々弄繰り回してたら、wshで出来ないことを探す方が難しいかもしれないと思い始めている自分がいる...
wshでできることよりできないことのほうが多いが? >>213
何のためにバイナリを扱うの?
用途によっては、バイナリが扱えなくても、操作は出来たりするよ バイナリくらい扱えないでwsh使ってるような顔するんじゃねーよ どちらも正しい
WSHでは何も出来ない、バイナリも扱えない
出来るのはちょっとした計算と文字列操作、そしてそれをメッセージボックスやコンソールに表示する程度
でもWSHにはActiveXという強力なAPIがある
これを使えばほぼ何でも出来る
COMの自作が出来るようになれば、「出来ないことの方が多い」なんてことは無くなる
但し、COMの自作が出来る奴が、WSHに拘る必要は無いと思うけどね >>217
COM自作するんだったら最初からCだよな
COMも便利だけど ファイルを開く/保存ダイアログをXP限定じゃなく標準で使えるようにしてほしい >>217
別に自分でCOMを作らなくても、誰かが作ってるさ...とか思ったりして...
ある意味、非常に正しいオブジェクト指向だが... >>219
標準のPowerShellで使えるからWSHからRun/Execすれば使える
標準の.NETでdll作ればWSHで使える
officeが入ってればcommon dialog ocxが使えるんじゃなかった? Windows2000+WSH5.6で使える「ファイルを開く」ダイアログ
ttp://scripting.cocolog-nifty.com/blog/2007/02/windows2000wsh5_ee23.html 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) yoshioka.teruo@nifty.com 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
で合ってますよね? >>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)" て"ゴミ箱を空にする" と違うけどええの? >>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" は、どこを調べれば情報があるのでしょうか
キーワードで検索してもそれらしいものを見つけられないので
>>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 >環境変数に以下の二行を追加しましたが、
この場合、環境変数が何の関係がある?
関連付けを変えろボケ ありがとうございます
関連付けをどうすればいいか詳しく教えてください
BASP21を利用していないwshスクリプト(.jsファイル)はダブルクリックしただけで動きます
もちとんBASP21はインストール済みです
環境変数を変えたのは以下サイトを見て
32bit版のCscript.exe / WScript.exeを利用していないからだと思ったからです
http://blog.goo.ne.jp/cestaff/e/9a080184a3e6008e54e49e958e87503d >256
メールを送るだけならCDO.Messageでいいはずだぜ
他にもたとえば圧縮するならコマンドラインの7zipっていう手もあるはず
その用途だけのために関連づけを変えるのは
ちょっと他のスクリプトにも影響が出そうで怖いな HKEY_CLASSESROOT\jsfile\shell\open\command
それだけならショートカット作れば? いろいろアドバイスありがとうございます
デスクトップに置いていた.jsスクリプトファイルのショートカットをクリックしたときに
上記オブジェクトが作成できないのエラーが出ていたのですが、
.jsファイル本体をクリックした場合はエラーが出ませんでした
理由は分からないですが解決はできました。ありがとうございました。 >>262
forなど制御文は充実してる
(というかバッチにはほとんどない) バッチよりははるかにまともな構文とライブラリ
特に文字列処理、日付処理が充実している
COMが使える
ただWSHはシェルスクリプト特有の省文字表記が少ないからちょっと面倒だ
その意味でバッチの直系はPowerShellだな 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 は見捨てられたのか? WinXPだって10年前のものだよな
未だに超現役だけど >>271
Popupの文字を引数で複数行書くにはどうすれば・・ >>285
'1行目' + \r\n + '2行目' 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で書くとか
抜け道はいろいろあるんだけど。 >>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 で
起動しなおしてるけど WSHスクリプトを64/32bitが違っていたら起動し直す。
ttp://scripting.cocolog-nifty.com/blog/2011/02/wsh6432bit-b32d.html 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
よく読み返してみたら日時じゃなくて「日付比較は〜」ってしっかり書いてありましたね
いつも日付+時間のセットで使っているのでうっかりしました。
ネットワークドライブの方でズレるというのは初めて知りました。
こちらは別に注意してみます
ありがとうございました。 電波テロ装置の戦争(始)
魂は幾何学、コピー出来る公安はサリンオウム信者の子供を40歳まで社会から隔離している
オウム信者が地方で現在も潜伏している
それは新興宗教を配下とする公安(慶應卒T)の仕事だ発案で盗聴器を開発したら霊魂が寄って呼ぶ来た
<電波憑依>
スピリチャル全否定なら江原三輪氏、高橋佳子大川隆法氏は、幻聴で強制入院矛盾する日本宗教と精神科
<コードレス盗聴>
2004既に国民20%被害250〜700台数中国工作員3〜7000万円2005ソウルコピー2010ソウルイン医者アカギ絡む<盗聴証拠>
今年5月に日本の警視庁防課は被害者SDカード15分を保持した有る国民に出せ!!<創価幹部>
キタオカ1962年東北生は二十代で2人の女性をレイプ殺害して入信した創価本尊はこれだけで潰せる<<<韓国工作員鸛<<<創価公明党 <テロ装置>>東芝部品)>>ヤクザ<宗教<同和<<公安<<魂複<<官憲>日本終Googl検索
WindowsXP Pro SP3 + WSH 5.7
test.js に、フルパスが258Byte以上のファイルをD&Dすると、
WScript.Arguments(i) がバラバラになってしまいます。(日本語は2Byteとして計算)
何とかこれを、バラバラにせずに処理する方法はないでしょうか?
よろしくお願いします。
WMIService.ExecQueryでwscript.exeを検索して、CommandLineを見てみても、
"が外されてバラバラになっています。
また、Argumentsでも、WMIでもフルパスが長いと後ろの方が切れてしまうようです。 >>321
2byte文字をAsciiにエンコードするとか ファイル名を指定して実行にドロップしたらどうなる?
それで駄目ならドラッグ&ドロップできんてことだろ? うーん・・・ とりあえず作っているスクリプト晒します
WSHの仕様なのかなぁ?
D&Dされたショートカットファイルや実行ファイルをDropMyRightsで実行するWSH
http://www1.axfc.net/uploader/Sc/so/297301.zip windowsのファイルパス名の最大長は256 Bytes(MAX_PATH=256)
でもAPIでのバッファ長は260 Bytesだから、ファイル移動とかで
256-259Bytesになることはある。
ただし、256Bytesを超えるファイルパスは削除とかできなくなるのは有名。
CMD.exeもこの制限を免れることはできない。 >>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異常 開く・移動・削除不能 あれ 日本語を含む場合、開く・移動・削除は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ものパスを作れてしまったのかを
追求もすべきじゃね? その原因を防がないと再発するだろ。 OLEのドラッグ&ドロップ用インターフェイスを実装できれば
MAX_PATHからは解放されるんだけどね。 >>336
それはパス名取得にWINAPIを使わずに独自にファイルシステムへの
アクセスを構築するってことか?
FSへのアクセスでWINAPIを使わないなんてDISK解析ツール並みだな。 この制限をほぼ 32,000 ワイド文字へ拡張するには >>336
それって何を作ればいいの?
デスクトップ上でのドラッグドロップってexplorerの機能じゃなかったっけ?
explorer作れってこと? wshのドロップハンドラはバグってるからな
代わりに使えるまともなドロップハンドラがほしいな 「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!");
です。
初歩的なことだと思いますがよろしくお願いします。 エラーメッセージのダイアログのタイトルは「Windows Script Host」です。
このファイルの種類を開くプログラムは「Microsoft (R) Windows Based Script Host」です。
どのプログラムに関連付ければいいんですか? 意味がわかりました。できました。すみません。ありがとうございます。 >>346
解決策くらい書いてけよ
どうせダブルクォーテーション抜けてただけなんだろうけど >>348
自己解決しましたはリソースのゴミになる事もしらないのか? 最初から一貫して>>344のレスを受けてできたと書いてあるだけで
自己解決したなんて一言も書いてないし実際に自己解決でもないよねこれ
回答レスに対してできたとレスがある。それで完結してるわけだし。
ただ煽りたいだけなんだろうけど曲解した上に執拗すぎる 神経質なクソムシを放し飼いにしている池沼夫婦が一番のゴミ コントロールパネルの拡張子cplファイルをスクリプトで実行したいのですが、どう記述すればいいのでしょうか?
system32上の実体パスを直接Runしてみましたが「アプリケーションに関連付けられていません」と叱られてしまいました
windows7 64bitです 自己解決しました
control をつけたら動作しました すみません。主戦場適当な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で判断する方法をご存知の方がいましたら教えてください。 すみません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>
<?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のタグは存在しません');
[操作するコード続き]
// -----------------------------------------------------------
// ここからが別の方法があるのか知りたかった待機処理
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>
// 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
いじるのはやぶさかではありませんが、見るといろいろいじるみたいで、若干
不安。なにか特徴的にほかに重大な影響与えたりするんですかね、、、。
テストマシンではないので、不安定なのは避けたいかなあと思っておりまして、、、、、、。 >>396
素人仕事でbatも書いてはいるんですが、すでにWSHで完成してるものを
わざわざまた1からというのもどうかと思い、、、、。目の前にあるこのVBS
をそのまま流用できないかと思っているわけでして。
しかも、batはbatで例の全角スペース問題があるのでまたいろいろ面倒で
もうVBSでいかせてくれ、という気分なのです。
なんでこうどれも中途半端なんですかね? M$さん。 >>395
何をどう苦闘してどんな結果になったから「どうもできず」という判断に至ったのかサッパリわからんわけだが……
if WScript.FullName <> "cscript.exe" then
Run "cscript.exe //nologo " & WScript.ScriptFullName & 引数
end if
みたいなことをすればいいんじゃね? いろいろありがとうございます。ちょっとアタマが痛いので、本日は失礼します。
書いてあることを参考にまたいろいろいじってみます。
ありがとうございます。あー頭が痛い。もう仕事やだorz >>395
> いじるのはやぶさかではありませんが、見るといろいろいじるみたいで
色々って…お前全然文章読んでないだろ。
2か所を一文字変えるだけだろが。 >>402
久しぶりに来たら止まってるので激遅レスしますが、そのちょっとした変更が
重大な破滅を及ぼしませんですか、ってことですよ。
だってたった3文字の言葉で世界が滅びちゃうんですよ。ムスカさんだって
「目が目があぁぁぁ」とかなっちゃうんですよ。慎重にやらないと。この1ヶ月
まるでプライベートの記憶がないですが、ちょっといじってみましょうかな。ははは。 MTP(Media Transfer Protocol)/PTPデバイスのフォルダやファイルにアクセスするには
どうやればいいの? こだまでしょうか、いいえWScript.Echoです sfcmini入れとくと暇な時にJScriptで色々なことができる。
開発環境はどこにでも入れられるわけじゃないからな。 そういうとこでは逆にexcel.applicationが使えるだろ JavaScriptでブラウザの自動操作した後に、完了画面を取りたいのですが、
スクリーンショットは調べたら無理そうとのこと。(VBA使えば可)
どのようにするのが1番いいでしょうか?
名前をつけて保存とか? WSH(・∀・)スレッド! Part 4
なくなった? Win8ってJSでしょ
JSからならWSH使うんじゃんあいの? Win8ってPSでしょ
PSからならWSH使わないんじぁあいの?
>>418
1000いってそのまま立ってないっぽいね >1
久しぶりに、
アドミ権限がなくMS-WORDが導入されている環境で
rtfファイルをMS-WORD以外のソフトでオープンさせるのに
wshを使いますた。
サイバー戦争勃発 ? アメリカ・イスラエルの新作マルウェア
「Flame」の脅威とスクリプト言語「Lua」の概要
http://blog.livedoor.jp/hardthink/archives/51940478.html
同じスクリプト言語同士
スクリプト言語「Lua」についても語ろうぜ。 外部コマンドの標準出力を処理したい。
以下のようにやってみたが、ファイルができる前に開こうとしてエラーになる。
WshShell.Run "%comspec% /c aaa.exe > " & outFileName
Set FSO = CreateObject("Scripting.FileSystemObject")
Set outFile = FSO.OpenTextFile(outFileName,1) コマンド実行が同期でできていないのが問題に思えるが、
調べた限りではWshShell.Runは同期実行のはず。
リダイレクトでファイル作成の部分だけ、非同期で行われているのでしょうか。
コマンドの実行時間は時によって変わるので、一定時間待つ、
という対応もできないのですが、
ファイル出力が完了してから次の処理を行うには
どうすればよいのでしょうか。 これ便利だった。サンクス。
↓
COMコンポーネント Hyon.RunObject
Running Object Serverオブジェクトを公開するコンポーネント
http://hyon.s5.xrea.com/prog/index.html
助けてください。
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とパスワードが抽出出来ることだけは避ける仕様にしといたほうがいいかなと考えてます。 >>439
A.exeで設定したプロセスの環境変数の値は、別のexeやスクリプトから見えるんですか?
A.exeから起動したB.vbsからなら、継承されたプロセスの環境変数の値が見えるのは理解できるんだけど。
他のexeやスクリプトから、どうやったら覗けるんでしょうか? 不正行為にも流用できる方法なので
知りたければ他人を不正幇助のリスクに巻込まずに自分で調べましょう ttp://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx すみません、お尋ねしたいのですが
eventquery.vbsでタスクスケジューラのログ(microsoft-windows-taskscheduler/operational)の内容を
表示させることって出来るのでしょうか?
家のPCがWinXP-Homeなので試すことが出来ず、ググってもよくわかりませんでした・・・
間違えました。
× eventquery ⇒ ○ eventquery.vbs あれ?拡張子「.vbs」を付けたのになぜか消えますね。
2chの仕様なのかな?
もう1度書きます。
× eventquery ⇒ ○ eventquery.vbs
VBScriptは昔のノートン先生が結構誤反応をすることが多かったの。
Loveletterウィルスと間違えてDATを消してしまうし
それを逆手にとった荒らしも多かった。
ファイル名やソースを張るときには「対策」されて変換されてしまう。 443,444ともに拡張子までちゃんと見えてるけど? 自分でreplacestr設定したの忘れてるだけじゃね? おっしゃる通りギコナビのオプションで「セキュリティ対策ソフトの誤反応対策」というチェックを外したら
拡張子まで表示されるようになりました。
お騒がせしました・・・ 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)") 結局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 させるとかして) スクリプトの実行が成功するか
どうかは、やった事ないんで不明。やる気と時間があったら
結果報告ヨロです。 ありゃ間違えてた、恥ずかしい(/ω\;)
×「Scripting.Encoder」
○「ScriptControl」 <?xml version="1.0" encoding="utf-8" ?> 回答ありがとうございます。
>>468
ADODB.StreamでUTF-8のjsを読み込み、ScriptControlに渡して実行できました。
今後、自分用のスクリプトを、どの文字コードで記述するかを検討してました。
あまり凝ったことはしたくないので、標準で使えるShift_JISとUTF-16で悩んでみます。
>>470
script要素のsrc属性に指定する、別ファイルのjs/vbsをUTF-8にしたいです。
ご指摘の記述で、wsf自体はUTF-8にできることを確認済みです。
分かりづらくてすみません。 >>470の通りだろバカが。やって見てから文句言え。 >>472
BOM付きだといけました
UTF-8のBOM無しにしたかったので、BOM付きは試してませんでした
できる事は分かったので、あとは自分的にBOMを許容するか考えてみます
みなさん、ありがとうございました BOM付きだと>>470なしでいけるわ
>>470だとBOM無しでいけるわ UTF-8のwsfからUTF-8のjsをインクルードし、
XML宣言のencoding指定の有無と、BOMの有無で、
正常に動作する組み合わせを確認してみました。
長くなったので、コードと結果は分けて投稿します。
結論としては、外部のjsはBOM無しでは動作しませんでした。
>>474
インクルードする外部のjsもBOM無しでいけました? 使用したコードは以下の通りで、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有 マルチバイト文字'); 結果は以下のようになりました。
encoding:○ wsfBOM:○ jsBOM:○ → ○
encoding:○ wsfBOM:○ jsBOM:× → ×
encoding:○ wsfBOM:× jsBOM:○ → ○
encoding:○ wsfBOM:× jsBOM:× → ×
encoding:× wsfBOM:○ jsBOM:○ → ○
encoding:× wsfBOM:○ jsBOM:× → ×
encoding:× wsfBOM:× jsBOM:○ → ×
encoding:× wsfBOM:× jsBOM:× → × 「Alt+F4」で強制終了みたいな動作をVBScriptやJScriptで実現可能ですか?
実現可能ならばどの関数やオブジェクトからできるのかどうか教えてくれませんか createobject("wscript.shell").sendkeys "%{f4}" WMIのWin32_Processで特定のプロセスをTerminateProcess()ってのは? Windows XPです
User権限でフォントをインストールするには
コントロールパネルのフォントから
「フォントの追加」で「フォント フォルダにフォントをコピーする」のチェックをはずして追加する
またはコントロールパネルのフォントにフォントファイルを右クリックでドラッグ&ドロップして
「ショートカットをここに作成」をする等といった方法じゃないとインストールできません
(コントロールパネルのフォントのアイコンにはショートカットのマークが付く)
しかしこれだとWindowsを再起動するとインストールされていない状態に戻ってしまいます そこでWindows起動時に上記の処理を自動でさせようと思い検索してみたところ
//gallery.technet.microsoft.com/scriptcenter/b5acfc13-3c7b-4168-b9c9-792e005304e6
に手順が書いてありました
がうまくいきません
コピーしようとしているからうまくいかないんだ、ショートカットを渡せばいいんだ
と思い 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();
みたいなことをしてみましたがこれもうまくいきませんでした 上記のページによるとNamespaceメソッド経由でフォントフォルダを取得しないといけないっぽいです
でもそうするとCopyHereかMoveHereしかなくShortcutHereのようなものありません
(そもそもショートカットを渡せばうまくいくのかどうかも定かではありませんが)
別のアプローチはないかと思ってフォントをインストールする際にレジストリやファイルに変化がないか確認してみましたが
Administrator権限での通常のインストールとは違ってレジストリにもファイルにも何も変化が起きていないようで(そんなことあるの?)
違う方法を探すこともできませんでした User権限でフォントのインストールを自動化させる方法があれば教えてください
外部コンポーネント等なしで自動化できればwshでもcmdでもinfでも構いません
連投すみませんでした ちゅーかそんなことができたら怖くね?
メイリオをUsersで上書きできたらまずいだろ
よく知らないけどフォントのインストールは
基本はAdministratorなんじゃないの? >>483のような一時的なフォントのインストールはUser権限でもできます
それをWindows起動時に自動的に処理させたいと思っています コマンドラインスレ落ちたのか……。
ジャンクション機能を使ってマウントしたボリュームの
空き容量を知る手がかりを探しに来たのに,ないとはなあ >>490
ついでに言うと普通にフォルダ内でdirすると表示される
空き容量はリンク先ドライブのものだが。 ポップアップダイアログがどうにも最前面に出せないのは不具合なのか仕樣なのか
回避がメンドいな
それともVista以降なら問題ないのだろうか ポップアップダイアログってmsgboxのことかい?
最前面指定があるだろ? メッセージボックスならポップアップダイアログとは呼ばんだろ wscript.shellのpopupのことじゃろ ジャンクション機能を使ってディスク・ボリュームをマウントする − @IT
http://www.atmarkit.co.jp/fwin2k/win2ktips/985junction/junction.html
この機能でマウントしたボリュームの空き容量を取得する手段ってVBSでは提供されてないんだな。 必要な機能はCOMで賄えってのはVBSというかWSHのスタイルだからな
マウントしたボリュームどころか、普通のドライブの空き容量を取得する手段すら
VBSそのものにはからは提供されていない
WSHのパッケージと同梱なので当たり前に使っているが、FSOだってVBSの機能ではなく
あくまで外部の汎用COMの一つ プリンターがオンラインかorオフラインか調べる方法を
あとに学ぶ人のためにカキコした方がいいと思う。
わしゃ知らん。 >>501
俺は簡単だと思うけど、君が簡単と感じるか否かは
君の能力次第だな
>>502
Google様に聞けばいつでもすぐ答えてくれる内容だから
わざわざここに書いておく必要は無いね
因みにネットワークに繋がってるか否かやIPアドレスなどを
調べる方法とやり方は一緒だ そういえばMS公式ドキュメントにWSHでCOM作る(not使う)方法を書いてあるセクションがあったな スクリプト コンポーネント(WSC)だろ
wshのヘルプにも載ってるぞ
確かにスクリプト コンポーネントはCOMだけど、今回のようにwshやVBSなどに無い機能を
COMで補うって用途には全く役に立たない
まあ外部ライブラリ的な物を作るにあたって、普通にvbsやjs作ってwsfのscriptタグのsrc要素で
インクルードするのに対して、いくつか利点も欠点もあるから、俺も適材適所で使ってるけど
別にそんな大層なものじゃないよ 若干スレ違い気味ですが、質問させてください。
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 Windows7にて入力文字をマスクする
CreateObject("ScriptPW.Password")
が使用できなくなってしまったのですが、
他に入力文字のマスクを実現できる手段はありますでしょうか? 教えてください
set shell = WScript.CreateObject("WScript.Shell")
do until shell.AppActivate("hoge")
WScript.Sleep(100)
loop
このあと shell.SendKeys で hoge ウィンドウを操作したいのですが
AppActivate しているにも関わらず hoge ウィンドウが前面に来ないことがあってランダムに失敗してしまいます
この時タスクバーの hoge ウィンドウアイコンはオレンジに点滅しています
OS は Windows7 で、コンポーネントというのはよく分かりませんが .vbs をバッチファイルから実行しています
よろしくお願いします >>516
これのXpと2003での現象と同じじゃね?
ttp://www.atmarkit.co.jp/fwin2k/tutor/cformwsh12/cformwsh12_02.html ちがう
ttp://support.microsoft.com/kb/886217/ja 職場のパソコンでアドミ権限がなく、autoItxが入れられないので、
マウスのカーソル位置を設定する実行ファイルと、
マウスをクリックした座標位置をクリップボードに格納する実行ファイルと
左クリックを自動でおこなう実行プログラムを作って
jscript 内から呼び出してみたら、ちきんと動いた。
しばらくは、wshで遊べそう。
あわよくば、仕事の一部を自動化できればありがたい。 >>516
Windows7で動いてたWSHが暫く同じ症状、AppActivate異常になっていた。
原因を調べても判らなかったが、今日のWindows7更新で正常動作に戻った。
きっと同じだと思う。 >522
そんなのがあるんやね。サンクス。
職場の情報課で、今度職場に新しいPCを入れるようだが
自動記録、自動実行するソフトも標準で導入してくれればいいなぁ。
サポートを必要とするソフトは極力導入したくないだろうが。
また、間違っても、wshを削除しないことを希望する。 正しく使えれば便利なんだが、皆が皆、正しく使えるとは限らないからね
また、普段は正しく使える人も、100%バグのない完璧なコートを書ける訳じゃないし
場合によっては1つのバグで億単位の損失を出すこともあり得る
そういうこと考えると、ミスっても故意犯で無い限り全額の損害賠償を請求できない
自社員にはそういうものを使わせず、必要が有れば、バグが有れば損害賠償を請求できる外部に
そういったソフトやシステムを委託した方が良いという考えになる
wshなどを使える者としては、COMや自動化ツールなどの導入も自由開放して
存分に活用できればいいのになぁと思うところだろうが、最悪の事態などのリスクまで考えて
決定されている会社の方針には従うのが会社員の義務であり、社会人のマナーだ
まあ中小企業だと、リスクを考えてではなく、良く解らないけど危なそうだからと禁止してる場合もあるだろうけどね 自動化は便利なんだけど、手作業では絶対しないようなバグを作りこんでて
それに気付くのが遅れたりすると悲惨だからなぁ… 人事異動のとき、
各人の力量の差のあるレベルだと
残業時間が違ってくるレベル程度なら
作成したものを一切引き継がないって手段しか残されていないつうか
実際、そうした。
2chにも、無料サポートいい加減にしろ!みたいなスレが昔はあったが
今もあるのかなぁ? 新しく作り替えるならまだしも・・・引き継ぎ拒否って単なる怠惰よな 手作業業務の自動化スクリプトだぞ?引き継がなくても、効率低下を除けば業務に支障は出ない
スクリプトの運用技術は業務範囲を逸脱してるだろうし、運用技術無しで使うのは只の自殺行為
精々使ってたスクリプトを資料として残しておいて、運用技術を持つ人間だけが引き継ぐ程度で良い。
手作業に戻した時に業務に支障が出るレベルの自動化だった場合は……
事情を説明して自動化を正式に(手製または外注で)実装させるか、後任を増員させるかあたりだろう。
どのみちスクリプトの"運用技術"を引き継ぐ必要はないと思うけどな。 いや俺(529)は526じゃ無いぞ?
「業務効率が落ちるだけで支障がないなら自動化は引き継がなくても良い」
って所に賛同してるだけだ。 >>533
659 : 名無し~3.EXE[sage] 投稿日:2005/05/12(木) 19:05:23 ID:xGQFP/QE [1/3回]
こんなレス引っ張ってくるならもっと有用な話題あるだろ・・・
いやこのセンスじゃ無理か 作成日を変えるコードを書いてる
まあ取得するだけみたいに簡単にはいかないけど 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で読みやすい形式でも構いません。
あとはデバッガ的な方法で外側から環境変数を書き換える事も出来る気がしますが全くオススメできません。 即レス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'); レス遅れてすみません
結局バッチファイル渡しとしました
実運用時(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では?
とか気になった。 >>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的な意味のシェルなのか。 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のソース頑張って読んだわ… レスありがとう
英語はダメだけどがんばってみますorz VBSでバイナリ操作したくて調べてみたけど、このページの読み取り時のバグが面倒くさすぎる。
ttp://www.isla-plata.org/wiki/pukiwiki.php?ADODB.Stream%A4%CB%A4%E8%A4%EB%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%A5%D0%A5%A4%A5%CA%A5%EA%A5%A2%A5%AF%A5%BB%A5%B9%A1%CA%C4%B4%BA%BA%CA%D4%A1%CB
JSとVBSでバグってる出力の結果が違うからJSでやるしかないみたいだし。 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を長めにしないとキー入力をとりこぼすようで
まんどくさ。 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にした人)」だろう 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 >>589
こんばんは、教えていただいた様に記述すると見事、希望の表示となりました。
感謝感激であります 素晴らしいです
http://uploda.cc/img/img531996d70acb8.png
この様にプログラミング言語を理解されている方を本当に尊敬いたします
私も少しで理解できるよう勉強していきたいと思います
大変勉強になりました お世話になりました ありがとうございます 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もどきみたいなツールを作りたいです >>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 を使うとデフォルトで上書きされてしまうようで、不都合です
他のオブジェクトのメソッドで、エクスプローラのあのダイアログを使えるようなものはないでしょうか? これででるんだっけ?
ttp://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx
ttp://www.happy2-island.com/vbs/cafe02/capter00304.shtml
ttp://d.hatena.ne.jp/miya2000/20061211/1165806376 >>599
おお!ありがとうございます!
さっそく試してみます >>599
フォルダまるごと、あるいは1個のファイルのコピーならば CopyHere が使えました
ありがとうございました
ただ、たとえばSendToにvbsファイルを登録して複数個のファイルのコピーをしようとすると
CopyHereの引数に複数ファイルを指定するやり方がググってみてもよく分からないため、
ループを回して1個ずつ個別にコピーしなければならず、
エクスプローラの「同じ処理を○個の競合に適用」が使えません
CopyHere に複数のファイルを渡すにはどうしたらよいのでしょうか? エクスプローラの「同じ処理を○個の競合に適用」が使えなくても
とりあえず使えればいいかな、と(テスト環境でなく)実際の環境で実践してみた結果・・・
「実行できません。引数一覧が長すぎます。」
Oh・・・こんな仕様があったとは・・・orz 事後報告
「送る」で多くのファイルをWSHに受け取るのは仕様上無理?っぽいので
結局WSHは諦めて、C#を使って↓のを参考に
クリップボードでファイルの受け渡し、コピー・移動は SHFileOperation を呼び出すことにしました・・・
ttp://uchukamen.com/Programming1/ToRecycleBin/
ttp://dobon.net/vb/dotnet/file/copyfiletoclipboard.html プログラム初心者です。
しょうもない質問で申し訳ないのですが、ご教授願います。
定時にアラートを鳴らす下記のスクリプト、二回目のポップアップ以降
タスクバーに隠れてしまいます。
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 >>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をダウンロードできるサイト知りませんか?
誰かアプロダにでも上げてもらえないでしょうか ググってもなんとか見つかるぞ
使い方:ttp://homepage2.nifty.com/pasocon/tanken/form.html
同梱してる事の確認:ttp://park15.wakwak.com/~ironrose/personalize.html
同梱してる物の入手:ttp://park15.wakwak.com/~ironrose/details.html 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);
} >>619
ありがとうございます。動きました。使わせてもらいます。
ただWScript.Sleep(100);の部分が短すぎるので
1000にしたところ上記と同じように止まってしまうのが不可解です
あと記載を忘れてましたがOSとIE11はインストールしたばかりで設定をいじってません
IE11でbusyとReadyStateがサポートされてない件は他の方も困ってるみたいです
http://www.moug.net/faq/viewtopic.php?t=67866
http://www.moug.net/faq/viewtopic.php?t=67282
http://d.hatena.ne.jp/O_Kohsuke/20131103/1383476948 もう一つ、上記サイトに言及のある拡張保護モードか、保護モードを無効にしても同じ所で止まります >>620
>IE11でbusyとReadyStateがサポートされてない件は他の方も困ってるみたいです
だって誰得?だもん 使ってる奴が居る以上誰得って言い方で切り捨ては出来ねぇと思うけどなぁ… windows7に移行したら、XPで動いてたvbsがうまく動かない
具体的には
・msgboxが最前に出てこなくなった
・Appactivateの効きが悪い気がする
なんか対策ありませんでしょうか >>624
前者については>>604と>>608>>610を参照すればいいと思う
後者は・・・泥臭すぎて微妙な対策だが、スリープ挟むとか、
スリープ挟んで複数回アクティブ化するとかで軽減できないか? ありがとうございます。なんかいろいろできるんですね
もう少し研究してみます
win7もIE9もキライ 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();で楽にヒアドキュメントモドキができるんだけどね。 WSHで画面のバックライトを消す方法ってありますか?
その手のツールやWin32APIを叩ける処理系使えば
できるのですがWin標準機能で出来る方法があれば・・・ >641
↓この1行でWindows標準のブランクスクリーンセーバーを起動できるけど、これじゃダメかな?
CreateObject("WScript.Shell").Run "C:\Windows\System32\scrnsave.scr" スクリーンセイバーでは、画面は暗く出来てもバックライトは消えないでしょ
つまり、消費電力低下もバックライト寿命延長も望めない
「画面を暗く」とかではなく、わざわざ「バックライトを」と言ってるって事は、そういうのが目的だと思われ ついでに細かいことを言うと、液晶モニタでは黒画面にすると
消費電力が増える場合がある。
ttp://www.itmedia.co.jp/pcuser/articles/1105/25/news001.html
ttp://www.excite.co.jp/News/bit/E1238429157129.html 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相当の物を叩いてるという認識で間違いないようです
原因がはっきりしてスカッとしました >>670
遅くなってスマン。レスありがとう
ドライブレターをUNCパスに変換するコードを書いて・・・っとやっていたんだけど
ふと管理者でもネットワークドライブをマウントしてしまえばいいんじゃね?と気が付いた
やってみたらいけそうな感じ
ネットワークドライブマウント用のスクリプトを改変するのが一番楽かも ie9以降のJavascriptエンジン(chakra)を使う方法
tp://subtech.g.hatena.ne.jp/mayuki/20111216/1324015296 スクリプトのダブルクリックで起動させたいなら>44の方法で >>675
wsh 5以降のバージョンアップ履歴がわからんので
だれもが興味ないと思われ。
便利な機能があったら使いたいが。 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にあることは確認していますが、これを読み込むのは
起動時のみのようで(起動後にレジストリエディタで書き換えても反映されない)、
起動のたびに設定がまっさらになるマシンでは、レジストリの書き換えでは
無理なように思います。
よろしくお願いします。 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
それとお礼を忘れてました(汗)
有難うございます。 >>686
もう解決しているようだけど…ちょっとみてみた
CStr()するとか文字列演算するとかするとエラーにならないね
JScriptで似たようなコードだと、そんな変換必要ないし不思議だね >>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)です > 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
だからでそ ファイルサーバ上にあるフォルダを共有フォルダにしたくて次のスクリプトをメモ帳にコピべして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だけにして、それ以外は比較演算子や判定関数に渡したほうが良いよ >>721 偽のときの戻り値がゼロと決めてあるのなら、
if function1()<>0 and function2()<>0 then
と書ける。
0の場合もあるけどFalseとか""とかの場合もある、ということになると
(VBというよりExcelのワークシート関数とかでよくある罠だが)、
一つ一つの関数の結果を変数にとるなりしなきゃいけない。
VBのAndにはもう一つ罠がある。単純な例だがこんなのはダメ。
if x<>0 and f(1.0/x)=2 then 右Windowsキーの右隣のMenu/Applicationのキーストロークを
送信しようとしているのですが、うまくいきません。
お助けください。
var x0 = WScript.CreateObject("WScript.Shell");
x0.SendKeys("{APPSKEY}");
---------------------------
Windows Script Host
---------------------------
スクリプト: C:***\***.js
行: 2
文字: 1
エラー: プロシージャの呼び出し、または引数が不正です。
コード: 800A0005
ソース: Microsoft JScript 実行時エラー
---------------------------
OK
--------------------------- //Shift+F10で出る右クリックメニューに'P'を送る
var x0 = WScript.CreateObject("WScript.Shell");
x0.SendKeys("+({F10}{PRTSC}{PRTSC}{PRTSC}{PRTSC}{PRTSC}{PRTSC}{PRTSC}{PRTSC}P)"); >>727
ありがとうございます。
どこにも回答がなかったので・・・
・・・しかし、なんで{PRTSC}を。。
と思ったらwaitの代わりなんですねこれ。 一部の環境で
WScript.CreateObject("〜")
がWScriptは宣言されていませんとエラーになる原因って何なんですかね?
記述として正しいはずなのにWScriptを削れ(ググると出てくる対処療法)と言うのも変な話ですし >>729
WScriptオブジェクトがあるのはWSHの時だけ
WScriptを削るとWScriptオブジェクトのCreateObjectメソッドではなく
VBScript自体が持ってるCreateObject関数の呼び出しになる
CreateObject関数はVBSが実行できるなら、どの環境でも使える
WScriptオブジェクトのCreateObjectメソッド
https://msdn.microsoft.com/ja-jp/library/cc364399.aspx
VBScriptのCreateObject関数
https://msdn.microsoft.com/ja-jp/library/cc410215.aspx WSHエンジンを叩いた時点でWScriptがインスタント化される
だからWSHを叩かなきゃ当然WScriptオブジェクトは存在しない wshでExcelの扱い方が分かるサイトご存知でしたら教えていただけませんか?
既存のワークブックのセルを外から操作とか オブジェクトの掴み方や制約事項が多い以外は基本的にVBAとやり方は同じだから、基礎はマクロの文献漁った方が早いよ。
そもそもWSHやVBAの基礎になってるActiveX/COMつーのは、Excelみたいなものを共通部品(コンポーネント)化して、VBAのようなアプリ付属のマクロやWSHのような独立した言語から同じように使えるようにする技術なので。 ちなみにActiveXのCOM違いについて悩むかもしれんので補足すると、ActiveXがバージョンアップでCOMに変わったと考えて貰えばよろし。
更に付け加えると
クリップボード→DDE→OLE→ActiveX→COM→DCOM→COM+という流れがあって、古い技術で覚えたことが新しい技術でも何らかの形で役立つようになってる。
またMSはそれをWindows DNAと呼んでる。 gVimでJSCriptを編集していますが、
JSHintが変なところに警告をだしてしまいます。
if(tagTitle != 'Internet Explorer ではこのページは表示できません')
↑だと「は」のところに "bad or unnecessary escaping." と警告を出します。
UTF8ではなく、CP932で編集していることが原因?
だと思うのですが、回避する方法はありますでしょうか? 職場のPC(win7/32bit)で、自由にソフトウェアをインストロールできない環境で
wsh/jscriptである程度自動化するのに
マウスを移動する、マウスの位置を検出する、
マウスを(D)クリックする、マウスを右クリックする
だけは、vc#(.net flamewalk2)でexeファイルを作成し
.exec()で、引数をつけ今までは使えていたのに
今日から、有効なwin32アプリケーションではありませんエラーで使えなくなった。
.exec()を経由しないで
別の単独実行可能なvc#(.net flamewalk2)で作成したexeファイルは
ダブリュークリックで普通に動く。
職場のPC管理者は陰険な妨害をしやがって、プンプン。
マウス操作なら、excelでwin32API叩ける関数で代用できるらしいが
勉強してないからなぁ。 >>739
ありがとうございます。
ネットで配布されているDLL があやしいか、あやしくないかですが
自己責任で使ってみるしかないかなぁ。
Visual C++ 2010 express 入れてみて
ライセンスキーも入れたけど
windows form によるUI表示がない場合で
マウスI/Oをどうすればいいか
調べるだけで敷居が高いわなぁー
このスレではすれ違いですがね。 スクリプト内のコマンドを管理者権限で実行したい場合は、自身をShellExecuteにrunas付きで起動しなおすと
昇格ダイアログの出現を最初の1回のみに出来るけど以降実行されるすべてのコマンドが管理者権限で
実行されてしまう
最初の1回の昇格ダイアログで
コマンド1(管理者)
↓
コマンド2(ユーザー)
↓
コマンド3(管理者)
みたいなことって出来ないのかな・・・ runasオプションで管理者かどうか変えるんだっけ?
コマンド2は別スクリプトファイルを生成して、そこだけexecで起動すればどうだろ Win10だと今のところ
cscript //e:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} hoge.js
または
wscript //e:{1b7cd997-e5ff-4932-a7a6-2a9e636da385} hoge.js
で、hoge.jsをIE11モードで実行できる
({1b7cd997-e5ff-4932-a7a6-2a9e636da385}はchakra.dllのCLSID) これすごくね
最新のjsライブラリよりどりみどりじゃん
wshはじまた それは以前にもあったネタだよね
http://subtech.g.hatena.ne.jp/mayuki/20111216/1324015296
WSHではどうやっても5.7互換モードでしか動かないって結論が出てたはずだけど、Win10ではまともに動くのかな Microsoft、Windows 10 IoT Core上でNode.jsを利用可能にする取り組みについてブログで解説
http://codezine.jp/article/detail/8722
Windows 10によるNode.jsのサポートは、現時点ではまだ開発の初期段階で、
Chakra JavaScriptエンジンと「Node.js v0.12」のコードを使用したV8 APIのホスティングによる
JSRT APIラッパーの開発を目指している。
GitHubで公開している最新のコードでは、Windows 10が動作するすべてのデバイスで、
Node.jsがクラシックWindowsアプリケーションとして動作するとともに、
ユニバーサルWindowsアプリケーションの内部でホストできる。
また、Node.jsアプリからUWP APIの全ての機能にアクセス可能で、
Windows 10上のVisual Studioにおける、Node.jsアプリのデバッグを実現している。
現段階では、Windows 10の動作するすべてのデバイスでNode.jsを利用した開発を実現するだけでなく、
クラシックWindowsアプリとして利用するか、ユニバーサルWindowsアプリとして利用するかを選択できる。 WORDで2セクションから成るWORDのファイルを
別々のファイルとして自動的に保存するサンプルはVBscript版はy!知恵袋にあるが
jscript版はなかったので、灯火。
var oWord = WScript.CreateObject("Word.Application");
var oDoc = oWord.Documents.Open("C:\\Users\\Public\\Documents\\01bunkatuMAE.doc");
oWord.Visible = true;
var newDoc,sec;
for(i=1;i<=2;i++){
sec = oDoc.Sections(i);
newDoc = oWord.Documents.Add();
oDoc.Range(sec.Range.Start, sec.Range.End - 1).Copy();
newDoc.Range().Paste();
if(i==1) newDoc.SaveAs("C:\\Users\\Public\\Documents\\02_section1.doc");
if(i==2) newDoc.SaveAs("C:\\Users\\Public\\Documents\\03_section2.doc");
newDoc.close();
}
oDoc.close(); >>755 は
win7sp1 64bit+word2000なら動くが、win7sp1 32bit+word2010だと動かないんで
ツルーしてくれ。 俺も投下。wshからexplorerを経由してhtaを利用するサンプル。ググってもIEを経由する方法しか無かったので
function createHta() {
var shellApp = new ActiveXObject("Shell.Application");
var existsExplr = !!shellApp.Windows().Count;
existsExplr || shellApp.ShellExecute("", "", "explorer.exe", "", 0);
for(; !shellApp.Windows().Count; WScript.Sleep(100));
var explr = shellApp.Windows().Item(0);
explr.PutProperty("hta", undefined);
var exec = new ActiveXObject("WScript.Shell").Exec("mshta.exe \"about:" +
"<head><meta http-equiv='X-UA-Compatible' content='IE=11' />" +
"<script>window.moveTo(window.screen.width, window.screen.length);" +
"new ActiveXObject('Shell.Application').Windows().Item(0)" +
".PutProperty('hta', window);</script></head><body></body>\"");
for(; explr.GetProperty("hta") === undefined; WScript.Sleep(100));
var window = explr.GetProperty("hta");
explr.PutProperty("hta", undefined);
existsExplr || explr.Quit();
return {window: window, exec: exec};
}
つづく 使用例
var hta = createHta();
function callback() {
WScript.Echo("this is wsh function");
}
hta.window.document.write("click here");
hta.window.document.body.addEventListener("click", callback);
hta.window.resizeTo(600, 400);
hta.window.moveTo(0, 0);
for(; !hta.exec.status; WScript.Sleep(1000));
metaタグで一応IE11モードで動くようにしてある
起動と同時に画面外に移動させ、初期化が完了したら呼び戻す
htaが終了するまでwshは待機する
wshからhtaのwindowオブジェクトにアクセスできる
逆にhtaからwshの関数をコールバックすることもできる
なおhtaにjqueryを読み込んでonメソッドでwshの関数をセットするのは無理だった
ブラウザ用のライブラリ使って高度なことやるなら普通にhtaでやったほうがよさそう
おわり 追伸
document.write()だとソース消えちゃうんだな
hta.window.document.write("click here");
↓こうで
hta.window.document.body.innerText = "click here";
今度こそおわり >>759-761だけど「単独のjsファイルでウインドウ付きのguiアプリを動かす」というだけならこんな面倒なことせずに済むことに気づいた
起動するhtaの外部ソースに自分自身を指定するだけ
(function() {
if ("WScript" in this) {
new ActiveXObject("WScript.Shell").Run("mshta.exe \"about:" +
"<head><meta http-equiv='X-UA-Compatible' content='IE=edge' />" +
"<script src=" + WScript.ScriptFullName + "></script></head><body></body>\"");
WScript.Quit();
}
})();
onload = function(){
document.body.innerText = "click here";
document.body.addEventListener("click", function() {
alert("success");
});
resizeTo(600, 400);
};
これを拡張子.jsにしてダブルクリックするとウインドウが立ち上がる
上の無名関数はwshで実行するとhtaを起動し、htaで実行するとスルーしてその後の処理を続ける
webサイト用のjsも頭にこれを付けると(うまくいけば)ローカルアプリになる
既出のテクかもしれないけど一応報告 すまんクォーテーションでくくるの忘れてた
"<script src=" + WScript.ScriptFullName + "></script></head><body></body>\"");
↓こうで
"<script src='" + WScript.ScriptFullName + "'></script></head><body></body>\""); 勉強がてらD3.jsを使ってCPU周波数を可視化するサンプル作った。.jsにしてダブルクリック
スクショ→http://i.imgur.com/IgY8wq5.png
if ("WScript" in this) {
new ActiveXObject("WScript.Shell").Run("mshta.exe \"about:" +
"<head><meta http-equiv='X-UA-Compatible' content='IE=edge' />" +
"<script src='http://d3js.org/d3.v3.min.js'></script>" +
"<script src='" + WScript.ScriptFullName + "'></script>" +
"<script>moveTo(screen.width, 0);</script>" +
"<title>" + WScript.ScriptName + "</title></head><body></body>\"");
WScript.Quit();
}
onload = function() {
var service = new ActiveXObject("WbemScripting.SWbemLocator").ConnectServer();
var svg = d3.select("body").style({margin: 0, overflow: "hidden"}).append("svg").attr({width: 300, height: 300});
var circle = svg.append("circle").attr({cx: 150, cy: 150, fill: "white", stroke: "black", "stroke-width": 6});
var text = svg.append("text").attr({x: 150, y: 160, "text-anchor": "middle", "font-size": 25, "font-family": "sans-serif"});
setInterval(function(){
var records = service.ExecQuery("SELECT MaxClockSpeed, CurrentClockSpeed FROM Win32_Processor");
var record = new Enumerator(records).item();
var rScale = d3.scale.linear().domain([0, record.MaxClockSpeed]).range([0, 145]);
circle.data([record.CurrentClockSpeed]).transition().attr({r: rScale});
text.text(record.CurrentClockSpeed + " Mhz");
}, 1000);
resizeTo(320, 340);
moveTo((screen.width - innerWidth) / 2, (screen.height - innerHeight) / 2);
}; ここの人たちはどうやってWSHを勉強しているんだろう
本屋行っても2種類くらいしか書籍ないし、ネットでもほとんど情報ないし
JavaScriptが分かるからこれで作業自動化なんて考えたけど難しい JavaScriptとMSDNにあるWSHのリファレンス >>768
何かやりたいことが先にあって、それを実現するにはとうしたらいいかを調べていけばいい
学校の授業のように教科書があって順に読んでいけば良いとか無い
またそんな曖昧な目的しかなければ何時まで経っても身に付かないと思う >>768
scd56jp.exe をダウンロードして
ムリヤリ解凍して得られる script56.chm をエディタの外部ヘルプにしている。 >>768だけど情報ありがとう
そういえば今まで行き詰まったらずっと教科書的なもの探してたわ
通りでプログラミングに限界感じてたわけだ
無駄に買った本はプライスレス jscript を chakra で実行すると WScript.quit って使えないの? というか>>745って動く?
Win10 Build10130だけど「スクリプトエンジンが見つかりません」ってなる >>775
言われてみれば,自分の使っているのとは違ってる。 自分は,
cscript //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} hoge.js
だた。 Build 10158で>>745動いた
よかったよかった
でもclass構文はまだなのね
アロー関数が使えるだけでも十分だけど
>>776
なぜかBuild 10130だとそれも動かなかったんだよね
うちの環境がバグってただけかもしれないけど Alt+tabのときに出てくる画面選択できるウィンドウを表示させたままにしたいのですが、これはwshで実現可能ですか?
ソフトのダウンロードではなくメモ帳でjseやvbsで作成したいです。
検索かけてもキーの自動入力くらいしか見つからなくって VBS → CreateObject("Shell.Application").WindowSwitcher
JS → new ActiveXObject("Shell.Application").WindowSwitcher(); >>780
ありがとうございます!
switcherのような名前で検索するとマイクロソフトの公式で調べられたんですね。
あとはウィンドウを表示させたままにする方法を探してみようと思います。
使っているファイルが多いのと、最近目が疲れているせいかalt+tabで開いてもどれが目的のウィンドウか探すのに地味に時間がかかってしまって…… chakra(>>745)だとEnumeratorがないからFileSystemObjectのfilesコレクションとか列挙できないな
せっかく書きやすくなったと思ったのに残念 >>784
shell.exec(`cmd /c "dir ${path} /b"`)
で頑張ろうとしてたけど、そんな方法もあったのね
ありがとう vbsやwsfやhtaって10でも使えるって考えていいの?
powershellに統一されることはないの? パワーシェルはバッチと組み合わせないと使えないのでめんどくさい。 Windows7のタスクスケジューラで問題なく起動していたjsが
Windows10にアップグレードしたら「このファイルを開く方法を選んでください」ダイヤログが出て動かなくなった
半日悩んだがファイル名に半角スペースが含まれていたからだった
この糞仕様は常識なの? アップグレードでダブルクォーテーション取れたとかじゃなくて?
半角スペース云々の話は常識っていうか…
それを糞と言っちゃう人の頭が糞仕様としか >>765をSJISで保存して漢字を入れると盛大に文字化けするんだけど文字コードってどうやって指定するんでしょうか。
<meta http-equiv='Content-Type' content='text/html; charset=shift_jis' />を入れても解消しませんでした。
ファイルをUTF8で保存すると文字化けせず大丈夫なんですが任意の文字コードが使えないとちょっと。 ちょろっとやってみたらhtaのロード部分はなんの問題も無いみたいだね
問題はonload部分の文字コードがutf-8決め打ちで読み取られてる、と言う訳でscriptタグ部分にcharsetを指定してやればいい
"<script charset ='shift_jis' src='" + WScript.ScriptFullName + "'></script> ホスト自作してchakraでスクリプティングとかの実例は無いんかのう。 Set DW = CreateObject("DynamicWrapper")
とメモ帳に入力し、C\直下にDW.vbsで保存。コマンドプロンプトを管理者権限で起動し、
c:\windows\SysWOW64\cscript.exe DW.vbs
と実行すると、ActiveXコンポーネントはオブジェクトを作成できません。というエラーを吐く
何で?
Win7 64bit 会社に命じられてWindows7 64ビットに移行させられたんですけど、一部のvbsが動きません
32ビットのwscriptエンジンを使えばいいかなと思うのですが、
今まで通りダブルクリックやファイルをドロップする実行方法で32ビットのエンジンで実行する方法ありましたら教えてください
ファイルの関連付けを変える方法を試したのですがうまくいきませんでした >>796
レジストリいじっていいならregeditで
HKEY_CLASSESROOT\vbsfile\shell\open\commandに
C:\windows\SysWOW64\wscript.exe "%1" %*入れる
C:\Windows\System32\WScript.exe "%1" %*があったら上に変更
駄目だったら戻してね >>796
方法その一
259 名前:名無し~3.EXE[sage] 投稿日:2011/09/26(月) 00:25:36.97 ID:CKbYoUCB
WSHスクリプトを64/32bitが違っていたら起動し直す。
http://scripting.cocolog-nifty.com/blog/2011/02/wsh6432bit-b32d.html
方法その二
32bitアプリのファイラを使ってvbsファイルを操作する >>798
ありがとうございます。ひとまず動くようになったみたいです。本格稼働してみて何かあればまた相談させてください
>>799
なんか難しそうですね。動かないスクリプトの先頭行にこれを書けばいいのでしょうか
解読してみます >>801
コマンドラインのパラメータ全部。
いつのまにかイテレータがうごくようになってるな。 var a;
a = eval("[\"abc\",\"def\"]");
WScript.Echo(a[0]);
→abc
は実行出来るけど
var a;
a = eval("{\"abc\":\"def\"}");
WScript.Echo(a["abc"]);
はevalでエラーになります。これはどうにもならないのかな・・・ >>804
a = eval("({\"abc\":\"def\"})"); >>804
ttp://language-and-engineering.hatenablog.jp/entry/20081022/1224597688
{x:1}
は,なんと「ラベル付きの文が中括弧でくくられている」とみなされ,
obj = eval( "{x:1}" );
の結果,objの値に数値1が代入される。
プロパティが複数ある場合には,
{x:1, y:2}
の最初の x: のあとの部分が「文」にならないので,「セミコロンがありません」というエラーになる。
一つの解決法は,丸括弧 () でくくること。
var str = "({x:1})";
とすれば,evalで評価した時にハッシュとして正常に解釈される。
丸括弧によって「中身はオブジェクトです」という意思表示ができるのである。 >>805-806
おぉ、出来ました。ありがとうございました ADODBのStreamで限定的ながらバイナリファイルを読み書き出来ますけど
裏技っぽい感じですしWSHが使えるすべてのWindowsで期待した動作をするのでしょうか?
この実装でバイナリファイルを正常に読めることを前提としたスクリプトの配布を
考えているのですがちょっと不安です >>810
多分大丈夫っぽいけど、書き方によってはセキュリティソフトの一部(Aviraとか)で誤検出されるので注意 むしろこれがないとバイナリ扱えないでしょ画像を扱えなくなる
裏技っぽいとか今更言われても困るわ ありがとう。大丈夫らしいとのことなのでとりあえず組んでみるかな・・・
あまりにも遅かったらRubyにしよう
>>812
読み込んだ値をテーブルで変換したりビット演算したりしないと
正しい値を得られない仕様を正攻法と呼ぶのは違和感があります
このために1byteずつしか読み込めませんし >>815
ADODBそのものじゃなくて、
iso-8859-1で1バイトずつテキストリードして変換する方法がイリーガルだと言ってるんだろう これは>>814のレス内容からの推測なので違ってるのかも知れない
jscriptだと勝手に思ったし、jscriptでも
wsfとかでvbscript連携して読むなり
Msxml2.DOMDocumentでhex文字列に変換するなり別の方法はあるとは思う VBScriptの記事だとこの辺か。
ttp://history-music.net/vbscript-base64-hex-binary/
ググると「iso-8859-1で...」みたいなページが多いから勘違いするのも仕方がないけど,
Microsoft.XMLDOMかMsxml2.DOMDocumentオブジェクト使って,
16進文字列とバイナリを相互変換する方がいいよ。
1byteずつなんて制限はないし,十分早いと思う。 ごめん、変換とかいうはなしはどこから出てくるんだろう。
「バイナリファイルを正常に読めることを前提」とあるから
まあバイナリファイルを読んで何かするんだろうけど。 >>819
>>814に以下のようにあることからの推測さ
>読み込んだ値をテーブルで変換したりビット演算したりしないと
>正しい値を得られない仕様を正攻法と呼ぶのは違和感があります
>このために1byteずつしか読み込めませんし >>816
なるほど。、ADODB云々というより「JScriptでバイナリ操作をする」ということ自体のことを言ってるんだろうか。
たぶん。 この辺の話か。なるほど。
FileStream.js - binary file manipulation for WSH
http://hp.vector.co.jp/authors/VA033015/fsjs.html
前提条件/制約とのトレードオフだろうね。
「OSの素のままの状態でスクリプトだけで動く」必要があるならWSHでやるしかなかろう。 >>822
だから結論はそんな歪なことしないで>>818の言うようにしろってことさ
WSHだけって言っても、ADODB使うのならMsxml2.DOMDocumentも使っても同じことだろ >>823
まったくその通りだ。
おかげでこんなのを見つけた。ありがとう。
JScriptでBase64 on @Qiita
http://qiita.com/tnakagawa/items/beaec98fd64b20894245 >>822
そのプログラムにはバグがあります。
ファイル終端付近に 0xBF があると,数バイトを読み落とします。
たとえば,半角カタカナで
クソミソ
とだけ書かれたファイルを dump.js に与えると,最初の1バイトしか出力されません。 ありがとうございます。試していて大分かかりました
>>818
>ググると「iso-8859-1で...」みたいなページが多い
はい、その通りでiso-8859-1を使う方法しかないと思っていました
ADODB.Stream&Type=1でAviraが騒ぐ以外は問題なさそうなので
これでいこうと思います。ありがとうございました
byte列の長さを容易に得られない?のがちょっと面倒ですね >>826
> byte列の長さを容易に得られない?のがちょっと面倒ですね
確かに。
バイナリオブジェクトには長さどころか,プロパティもメソッドも何もないように見えます。
ADODB.Stream で Read する前後の .Position の差を覚えておくのが最良ですが,
後から得ようとするのも,困難というほどでもないですね。
(1) ADODB.Stream で .Position = 0 からバイナリを Write した後の .Position を返す関数を作る。
(2) Msxml2.DOMDocument で .nodeTypedValue へバイナリをセットし,.text.length / 2 を返す関数を作る。
どちらもクロージャにした方が速いですね。 var fs = new ActiveXObject( "Scripting.FileSystemObject" );
fs.DeleteFile( "B:/VwCache/*.vch" );
fs = null;
これが該当ファイル無しのときエラー出なくしたい
こんなレベルの質問扱ってるスレ教えてください >>828
FileExistsでファイルがある場合に消す。
もしくは、on error resume nextでエラーを無視するとか。 いやjscriptだろ
try 〜 catch(e)で囲むだろ
だけど、*.vchがファイル名を隠しているんじゃなく、
ワイルドカードで複数ファイル指定のつもりならダメだろ JScriptで展開されていないコマンドライン文字列を取得することは出来ませんかね?
コマンドラインオプションを改変するラッパーを作りたいのですがWScript.Arguments
だと展開されて"が削除されていて再構成するのがかなり手間になってしまいます >>834
どうしても,というなら方法はないでもない。
WMIから自分自身のプロセスを見つけ出せば,
生のコマンドライン(Description)が得られるので,それを解析すればよい。
wsh WbemScripting.SWbemLocator Win32_Process
あたりをキーワードにググってください。 >>835
面白そうなので試してみた
自プロセスを特定するのと引数から無効なものを除外しなくてはならないのがマイナス点
・自プロセスの特定
wscript.exeまたはcscript.exeでイメージ名を検索するだけでも大抵は大丈夫だろうが
もう少し厳密にやろうとすると引数に自scriptファイル名があるかどうかをチェック
さらに多重起動の場合も考慮してもっと厳密に特定しようとするなら
何か子プロセスを起動(cmd.exeとか)し、そのPIDでクエリーを限定し、
親PID(これが自プロセスになる)を求める
もっと簡単な方法何かある?
・引数からcscript.exeの引数を削除する
例えば、 cscript xxx.js "a" 1 "b" //nologo "c"
とかだと、//nologoは取り除かないといけない ありがとうございます。作っている途中で親となるプログラムがcscript.exe hoge.jsな感じで
呼び出せないことが判りバッチファイルもどきになりました・・・
@if(0)==(0) ECHO OFF
set COMMANDLINE=%CMDCMDLINE%
cscript.exe //nologo //E:JScript "%~f0"
set COMMANDLINE=
GOTO :EOF
@end
var shell = new ActiveXObject("WScript.Shell");
var env = shell.Environment("Process");
command_line = env.Item("COMMANDLINE")
WScript.Echo(command_line); >>837
直接batを起動する場合はいいけど、コマンドプロンプトから起動するとダメですぜ
それにbatでいいなら、
@echo %*
の一行で終わる >>838
親となるプログラムは直接起動してくれるので問題ないです
コマンドプロンプトから起動する場合はcmd.exe /cを付ければ良いかと
実際には>>837の後ろで正規表現を使いコマンドラインオプションを
処理しているのでバッチファイルのみでは厳しいです var fso = new ActiveXObject("Scripting.FileSystemObject");
var ws = WScript.CreateObject("WScript.Shell");
WScript.Echo(fso.GetAbsolutePathName(args(0)));
「ハート?はーと.txt(?はユニコードのハートマーク)」と「ハート_はーと.txt」が同じフォルダに有る場合に、
ユニコードハートマーク付きのファイルを上記のバッチにD&Dするとアンダーバーの有る「ハート_はーと.txt」が返ってくる。
js vbs wsf 全部だめ。
アンダーバーだけでなく、ハートマークの場所にascii文字が一文字入る一字違いのファイルを誤検索しているみたい。
batファイルでフルパスをechoさせると正しい名前が返ってくるので、bat経由でjsに引数が渡すと正常になった。
でもbat使うのは癪なのでwshだけで回避する方法ありませんか? >>840
上手くいくか判らないけどWMIで自プロセスのコマンドライン文字列を取得するのはどう?
WSHだとプロセスIDの取得が難しいので工夫する必要があるけど >>841
>>834からのやり取りを読んだけど、自分にはまだ難しすぎる Windows7 64bitでIE10からIE11にしたら今まで使えていたログインスクリプトでエラーが出るようになりました
原因が分からないので助けてください
IE = WScript.CreateObject("InternetExplorer.Application");
IE.Visible = true;
IE.Navigate("https://hogehoge/login");
WScript.Sleep(10000);
IE.Document.forms(0).elements("id").value = "hogeID";
IE.Document.forms(0).elements("password").value = "hogePASS";//フォームに入力はできている
IE.Document.forms(0).all.tags("INPUT").item(2).click();//←IE11ではここでエラーが出るようになった
WScript.Quit(0);
エラーの内容は「IE.Document.forms(...).allはNullまたはオブジェクトではありません」です。
よろしくお願いします。 ちょっとは自分で調べようぜ、拾った物の使い回しで意味分かってないんだろうけど
原因はIE11からdocument.all等の独自APIが廃止されたから
そもそも今時allとかtagsとかつかわねーよ >>842
主観だけどWindows上で動くスクリプト言語でUnicodeの引数は結構鬼門な印象がある
最近RubyでUnicodeな引数を受け取りたくなってRubyスレで聞きながら試したけど
WMIかWin32APIでコマンドライン文字列を取得するくらいしか手は見つからなかった
スクリプトエンジンだけではなくcmd.exeとの絡みもあるので使える選択肢は少ないと思う
>>837の方法が嫌ならWMIから取得するしかないんじゃないかなと個人的には思う >>844>>845
遅れましたがお答えありがとうございました
エラーが出ていた箇所をこれにして動くようになりました
IE.Document.forms(0).getElementsByTagName("input")[2].click(); jsにデストラクタってないの?
ラップしたエクセルの終了処理をやらせたいんだが >>848
VBSでいう Set objExcel = Nothing 相当の処置のこと?
JSだと objExcel = null; でいいみたい。 >>849
Class ExcelWrapper
Private Sub Class_Terminate
' VBSでいうならこれ
End Sub
End Class
jsの言語仕様としては無いんだろうけどなんかトリック的に実現する方法はないんか >>848
OLEで起動したExcelがスクリプトが終了するまで終了してくれないという話? >>851
どこからも参照されなくなったら、メンバのExcel.ApplicationをQuitするようなオブジェクトを作れるかって話
やっぱり無理くさいな(´・ω・`) finallyでEXCELの終了処理でいいんじゃないの、それともフックの解放とかそういう意味なの >>853
finallyとか面倒くさい。オブジェクトにやらせたい
newしたらエクセルが立ち上がり、変数がスコープから外れたら自動的ににエクセルが終わるようにしたい
フックの解放っていうのはよくわからん(´・ω・`) 無いものねだっているようにしか見えないんだが
WSHに限らずGCを持つ言語でデストラクタが
あるのってほとんど無くね?
ファイナライザを持つ言語ならそれなりにあるみたいだけど
これは実行される保証がないしな 結論は、無いものは諦めて、newした者が責任を持って解放する (new ActiveXObject("Scripting.FileSystemObject")).DeleteFile(WScript.ScriptFullName,true);
みたいにやったら自分自身のファイルを削除できますが
実行開始された後はファイルがどうなろうが問題ないと考えていいでしょうか? >>858
捨てスクリプトファイル作って試してみればいいじゃない やってみた限りは問題なさそうなのですが
絶対に問題がないと言えるのか?と思いまして アクティブなウインドウを判定して、
キーを送りたいアプリがアクティブならキーを送る、ということをしたいと思い
探していたのですが
http://stackoverflow.com/questions/26341753/how-to-find-the-window-title-of-activeforeground-window-using-window-script-ho
ここを見ると、WSHでは出来ないというようなことが書いてありました
出来て当たり前の簡単な処理だと思うのですが、本当に出来ないのでしょうか? WSHで出来なければ出来る言語でやればいいだけ
こんな所でゴネてないで自分の不勉強を猛省しろ WSHのいいところは簡単に使えるところなので
わざわざたとえばCを使わないといけないとなると本末転倒なのですよ
どう考えても実装も難しくもない、あって当たり前の機能ですよね
本当にないのかどうかは知りませんが >どう考えても実装も難しくもない、あって当たり前の機能
だったらそーゆー機能があるCOMを自分で実装して
それをWSHから呼び出せばいい
難しくないんでしょ? いや、逆に難しいと思うんですか?
考えたら分かりますがめちゃくちゃ簡単ですよね?
「面倒くさい」と「難しい」は違うのです
分かりますね? いくら煽っても「ほら出来るやん」なんて誰も調べてくれないしやってくれないよ >>861
そんな事やろうと思ったことないし
「出来て当たり前」「あって当たり前」とか言われても違和感しかない そもそもwshの組み込み機能とは違い、COMの作り方次第になってくるんだから
そういうCOMを作るか探すかすればいい
WIN APIを呼び出すCOMなんてのも世の中には幾つかあるぞ windowキーは^{ESC}で送れると分かったのですが
windowキーを修飾キーとして使う場合はどう書けばいいですか? var result = GetObject("winmgmts:\\\\.\\root\\cimv2").
ExecQuery("Select * from Win32_Process where Name='hoge.exe'")
みたいな方法で返ってきたオブジェクトから
一つ目のアイテムを取得するにはどうすればいいですか?
ネットで探すと、
var list = new Enumerator(result);
みたいな形でEnumeratorに変換してから回すのが普通のようですが
結果が一つと分かっている時にこのやり方をするのは気持ち悪いです >>869
Windowsキー自体は多分送信できない
^({ESC})は、CTRL+ESCの送信であって、「スタートメニューを開く」という機能になる
結果はWindowsキーと同じ「スタートメニューを開く」という動作をするだけだと思う
>>870
配列等へのアクセスと異なり、COMのコレクションへの唯一のアクセス方法が
Enumeratorなので他の方法は無いと思われる
(VBSを呼び出してfor eachを使うと言うのは無しの方向で) >>871
むーん、そうですか
ありがとうございます >>870
Vista以降ならItemIndexメソッドが使える
XPならEnumeratorで頑張れ
GetObject("winmgmts://").ExecQuery("Select * from Win32_Process where Name='hoge.exe'").ItemIndex(0) やや亀レスだが,全部まとめて AutoItX をインストールというかdllを登録すればできる。
http://blog.livedoor.jp/blackcode/archives/1795724.html
登録しなくてもマニフェスト作ればできる。
>>861 は AutoItX の WinActive と Send を使え。
>>869 は AutoItX の Send('{LWIN}') か Send('{RWIN}') を使え。 WSHのメリットってWindows標準である事だと思う
オートメーションサーバーを持ち込むくらいならRubyなりPythonなりを
持ち込んで利用した方がより効率的に開発・実装出来るのでは >>877
Pythonだけではできないから Sikuli や WebDriver や AutoItX があるわけなのだが エンジニアのモチベーションを下げる方法
ttp://d.hatena.ne.jp/jflute/touch/20160221/downmoti
IT系のエンジニアは、なかなか世間一般の方々から、
やっていることを理解されにくいものです。
何が簡単で、何が難しいのか、なかなかわからないもの。
しかも、そう思われていることを、
エンジニア自身よくわかっていて、
それがコンプレックスでもあったりします。
開発しようとしている画面があったとして、
画面の見た目から来るイメージと、
実際のプログラミングの難しさはなかなか比例しません。
簡単そうな画面でも作るのは難しい、よくあることです。
なので、よくわかってないフリして、
「えっ、こんなの簡単に作れるでしょ?」
って言ってあげると、大抵「はぁ!?」って表情をします。
ちょっと納得がいかないだけなら、
モチベーションを下げたことにならないですが、
そういうことを何度も何度も言い続けることで、
「難しいことを実現しても評価されないのでは...」
って気持ちになるので、
しっかりモチベーションを下げられます。
実際に、難しい画面を頑張って速く作り上げたエンジニアに、
「あー簡単そうな画面だったもんね、じゃあすぐ次これ作って」
と、軽くあしらってあげると効果が相当高いです。 WScript.CreateObject("InternetExplorer.Application")
を利用してIEの自動操縦をしています
win10へのアップグレードを考えていたのですが
この手のスクリプトはwindows10で動くのでしょうか? htmlfileコンポーネントでダミーのwindowを作ってjsライブラリをロードするのはみんなやってると思う
そこでローカルフォルダの構造をdomに変換してjQueryをファイルセレクタ代わりにしてみた
// カレントディレクトリ以下の構造をbody内に再現する。File/Folderオブジェクトのプロパティはdata-*属性にしている
(function($folder, folder){
var keys = "Attributes DateCreated DateLastAccessed DateLastModified Drive Name Path ShortName ShortPath Size Type".split(" ");
for(var subFolders=new Enumerator(folder.SubFolders); !subFolders.atEnd(); subFolders.moveNext()) {
var subFolder = subFolders.item();
var $subFolder = $folder.append("<div>").find("div:last");
$subFolder.addClass("folder");
$.each(keys, function(){$subFolder.attr("data-"+this, subFolder[this]);});
arguments.callee($subFolder, subFolder);
}
for(var files=new Enumerator(folder.Files); !files.atEnd(); files.moveNext()) {
var file = files.item();
var $file = $folder.append("<div>").find("div:last");
$file.addClass("file");
$.each(keys, function(){$file.attr("data-"+this, file[this]);});
}
})($("body"), new ActiveXObject("Scripting.FileSystemObject").GetFolder(new ActiveXObject("WScript.Shell").CurrentDirectory));
// 例:テキストファイルをすべて選択
$(".file[data-Name$='\.txt']").each(function(){WScript.Echo($(this).attr("data-Path"));});
とりあえずアイディアを形にしただけなんでカスタムして使ってくれ(´・ω・`) エクセルのマクロをVBAやVB以外の言語で使いたいのですがWSHというのでJavaScriptを使うくらいしかないですか?
なんか難しそうなので扱えるかはわからないですが Win10 64-bit で、WSCの登録を、
64-bitで行えば、32-bitアプリから起動したスクリプトで使えず、
32-bitで行えば、64-bitアプリから起動したスクリプトで使えず。
後から登録したほうだけが有効になる。
どうしたものか。 どっちかに統一してwscriptなりのパスを絶対パス指定すりゃいいんじゃないの
今後bit幅判定は避けて通れないだろうし 32bit(64bit)で起動されたかを判断し違ってたら起動し直すってのは検索すれば出てくるので、
WSCをどっちかでのみ処置するようにするか、両方で別々に32bit用、64bit用の両方登録するかとか JScriptでreplaceによる正規表現の置換で、
置換後文字列にキャプチャ文字列参照の特殊変数とその直後に数字を書きたい場合
どのように書けばいいですか?
例えば、$1で参照した文字列の直後に0を書きたいとかで
"$10"とやると、10番目のキャプチャ文字列の参照になっちゃう
他環境だと、"${1}0"と書けるみたいだがWSHでは参照にならない >>890
thx!
でも何でJScript(JavaScriptも同様だが)ってPerlとかと合わせなかったんだろう
鬼車やPerlだとこの記述じゃダメなんだよね、ややこしい C:\Windows\SysWOW64\cmd.exe
から
C:\Windows\System32\wscript.exe
を実行したら、
C:\Windows\SysWOW64\wscript.exe
が起動された。
C:\Windows\System32\cmd.exe
から
C:\Windows\SysWOW64\wscript.exe
を実行したら、これが起動した。
択一なら、32bitに統一する方が汎用性が高いということか。
そうしておくよ、ありがとう。>>887-888 おいぽまいら教えろ下さい、dotnetのライブラリを叩く際にだね
これは動かない
var random = new ActiveXObject("System.Random");
random.Next(1, 10);
これは動く
var random = new ActiveXObject("System.Random");
random.Next_2(1, 10);
上が動かないのは分かる、型宣言が出来ないからだ
じゃあ下は何故動くんだ、この_2は何を意味するの ああ何となく事故解決した、オーバーロードなんて仕様ないからケツに数字付けて区別するのか
型宣言とか全く関係なかった、数字の振り方の規則性がこれまたよく分からんがトライアンドエラーしかないのか
ちなみにSystem.Randomだとこうなるみたい
Next()→Next()
Next(Int32)→Next_3(Int32)
Next(Int32, Int32)→Next_2(Int32, Int32) すみません、全くの素人です。
アプリのアプリケーションキーの「(T)」を出力するだけのファイルを作りたいです。
どう書いたらいいですか。 自己解決
Set objShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep 50
objShell.SendKeys "%(T)" vbsを使って社内システムへの自動ログイン処理をしたいと思っています。
yahooへは問題なくidpassを入れてログインできるのですが、社内システムの場合はエラーが表示されidpassも表示されません。
"エラーを特定できません"のエラーが表示されます。
どうも信頼済みサイトに登録されていることが原因というようなwebの記載を見つけました。
この場合は回避策はないのでしょうか。 クリップボードを加工する処理を書いています
内部はユニコードなので
SJISの範囲を越えた文字がクリップボードに入っていることがあります
それをEchoで表示させてみたりしても普通に表示されますし
文字列の結合をしても特に問題ないようです
しかしソースコードがSJISなので、
その文字に関する処理をソースコードの中に書けません
こういう場合どうするのがいいでしょうか?
クリップボードへのアクセスをUTF-8に出来たら
コードもUTF-8に出来るのですが、この処理はSJIS決め打ちですよね? >>900
案1:スクリプトをunicodeで書く。
案2JScript:SJISに無い文字は String.fromCharCode(code1, code2, ...) を使う。
案3VBScript:SJISに無い文字は ChrW(code) を使う。 >>901
ありがとうございます
案2で行きました // 以下のような例で * が消えてしまうのはなぜでしょうか? バグ?
var FS = WScript.CreateObject('Scripting.FileSystemObject');
WScript.Echo(FS.GetAbsolutePathName('C:\\Windo*'));// → C:\Windo*
WScript.Echo(FS.GetAbsolutePathName('C:\\Window*'));// → C:\Windows …なぜ?
WScript.Echo(FS.GetAbsolutePathName('C:\\Windows*'));// → C:\Windows* *が1文字のワイルドカードとして使えるということかね。 2016/9/1 jscript.dll がwindows updateされたせいで
今までいけていた win7/32bit(@職場)/wsh(jscript)で
エラーが多発するのは俺だけ? そうですよね。失礼しました。
こちらも、職場でのエラーメッセージまで覚えていないので
解決はあきらめて、情報をカキコだけしますが。
エクセルでInputBoxを使うやつで、
変数のvar 宣言が厳密?になったような印象で
動くやつとエラーで動かないやつとInputBoxが出ないパターンあるような。
var objXL = WScript.CreateObject("Excel.Application");
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var f = fs.GetFolder("\\\\file01\\○○課\\....\\Afoldername");
var folderlist = "";
//すべてのサブフォルダ
var subfc = new Enumerator(f.SubFolders);
for(; !subfc.atEnd(); subfc.moveNext())
if ( ((subfc.item().Name+"").indexOf("e"))==-1 ) folderlist += subfc.item().Name + "\r\n" ;
var strRet = objXL.InputBox(folderlist, "選択", "otamesi");
objXL.Quit();
のたぐいのやつです。
こんなことがあったということで。 Windows7にて、管理者権限(High)で起動しているプログラムから、
別のプログラムを標準ユーザー権限(Medium)で実行する方法はないでしょうか?
具体的には、
管理者権限で常駐しているAutoHotkeyから、
標準ユーザー権限でWSHスクリプトを起動したいと考えています。
管理者昇格で実行する方法は検索すれば出てくるのですか、
その逆は見つからなくて・・・
ログオンスクリプトから実行されたプログラムも
全部管理者権限になってしまいます。
これも解決したいと思っています。 「管理者として実行」されたコマンドラインから、「標準ユーザとして実行」する。
ttp://scripting.cocolog-nifty.com/blog/2010/01/post-5259.html >>912
ありがとうございます!まさにこれです。
しかしタスクから実行とは・・・
やっぱり降格実行って、すんなりには出来ないんですね
>>911
それは多分、ShellExecuteを使った昇格(Middle→High)のやり方だと。
WSHでは、Runでも、Execでも、ShellExecute でも
降格で実行する方法はありませんでした(探せませんでした) >>913
> >>911
> それは多分、ShellExecuteを使った昇格(Middle→High)のやり方だと。
コマンドラインのことじゃないの?
試したことないから実際できるかは知らないけど CreateObject("Shell.Application").ShellExecute("hoge.exe", "", "", "runasuser")
>>912と違ってユーザー名とパスワードを入力する必要があるのが面倒 >>915
> CreateObject("Shell.Application").ShellExecute("hoge.exe", "", "", "runasuser")
おお、runasuser という引数で可能だったのですね。
今まで知りませんでした。ありがとうございます。
確かにユーザとパスの入力にはリスクがありますし、配布には不向きですが、
場合によって使えそうです。 >>913
解決しているようですが、>>911 は RunAs.exe を使うことを意味していたつもりでした。 >>917
ありがとうございます。
runas.exeという存在も知りませんでした・・・。
確かにこの方法でも、/userをAdmin以外に指定すれば、
High→Mediumの降格は可能みたいですね!
でもやはり、userとpassまで入力するのがネックですね。
むしろこっちが当たり前で、912の方法はかなり特殊な方法でしょうか。 runasに/savecredオプションを付けるとパスワードが保存されるから
2回目以降はパスワードを入力しなくてよくなる
psexecってツールならユーザー名とパスワードをオプション引数で指定できるから毎回手打ちする必要は無くなる
https://technet.microsoft.com/ja-jp/sysinternals/bb897553.aspx
もちろんそれぞれデメリットもあるからご利用は計画的に えと、Windows7環境で質問です。
あるアプリが起動している間は、スリープに入らないって
設定ができるでしょうか?
ファイルメーカーなんですが、スリープしちゃうとネット
ワークが切れちゃって再起動しなくてはならないんで。 >>920
5分ごとにShiftを押す。じゃダメ?ctrl+Cで終了。
Set objShell = WScript.CreateObject("WScript.Shell")
Do
WScript.Sleep 1000*60*5
objShell.SendKeys "+"
Loop
メディアプレイヤーをずっと再生しておくっていう手もあるらしい。 超亀レスだがShiftじゃキー入力の妨げになるでしょ
マウスの空MOVEを定期的に送るのが常套手段
もろちんwshだけでやる方法はない /*
cscript.exe //nologo 特定プロセス実行中のスリープを抑止.js
副作用無しの SendKeys( Shiftの代わりにPRTSC(キャプチャ効果無し)を送ってもスリープを抑止できるようだ 先日何故か書き込みが途切れたので再書き込み
var exeName = "notepad.exe";
var interval = 60;
var oShell = WScript.CreateObject("WScript.Shell");
var objWMIService = GetObject("winmgmts://./root/cimv2");
while(true){
if(!new Enumerator(objWMIService.ExecQuery("select Name from Win32_Process where Name='" + exeName + "'")).atEnd())
oShell.SendKeys("{PRTSC}");
WScript.Sleep(1000 * interval);
}
WMIって面白い JScriptで再帰的なマッチを高速に行う方法ってありませんかね?
A(B(C(3),"a"),"$")
みたいな文字列を
({<3>,"a"},"$")
みたいにしたいです。Rubyみたいに再帰処理に対応した正規表現を
持っていれば対応する括弧をマッチさせることが出来ますが・・・ 2017.5.15に今どき、wshの本の改訂版が今ごろ出版されるとか。 >>886の件、
レジストリのCLSID(classid)を、登録した方から登録してない方へコピーするか、
wscファイルの中でCLSIDを指定しておけば、両方で使えた。
思うに、レジストリ上では、ProgID(COMコンポーネントID)は64/32bitで共通なのに対し、
CLSIDは64/32bitそれぞれで登録されているところ、
CLSIDはwsc登録時にランダムで生成されるため、
後から登録した方でProgIDのCLSID情報が異なる値で上書きされてしまい、
先に登録した方はProgIDから元々CLSIDにたどり着けなくなってしまった、
ということなのかなと。
なので、CLSIDが64/32bitで同じになるようにしてやればよいと。 関数呼び出し、ネスト2,3回位が限界なのかな。
変なところで戻ってくる。
使えない野郎だ、くっそマイクロソフトw 今更javascriptの学習兼ねてjscript勉強中
inputboxとmsgboxが64bit環境で呼び出せないのが割と辛いね
powershellだとC#埋め込んだりフォーム使い放題なんだよなー
↑スリープ抑止はC/C++/C#でさくっと空SendInput呼んだ方が楽だよ Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Logs")
Wscript.Echo objFolder.Size
→これでC:\Logsのフォルダサイズが取得できるのに
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Program Files")
Wscript.Echo objFolder.Size
→同じスクリプトでC:\Program Filesのサイズが取得できない
なぜなんだぜ? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) 管理者権限で実行しても "C:\Program Files\Windows NT" に含まれるジャンクションにアクセス失敗してエラーになるみたい 情報ありがとう
こちらでも昨夜というか今朝まで調べて
配下にリバースポイントが含まれるフォルダは
(普通の方法では)サイズの取得ができないとわかったよ
Program Files配下の全フォルダを抽出して
ひとつずつ再帰的にサイズ取得して合計するという案もあったけど
その中にはサイズが取得できないフォルダがあるから
合計したところで数値が合わないんだよね 仕方ないのでバッチファイルで
dir "C:\Program Files" /s /a-d | find "個のファイル" > hoge.txt
ってやって、ファイル末尾の1行を取得する事にしたわ
これだと一応、フォルダのプロパティで見たのと同じ値が取得できる
もはやスクリプトじゃなくなっちまったけども 重箱の隅をつつくようであれだが、リパースポイントな。リバースじゃなく。 wshで数万行クラスの巨大スクリプト書く人いるかな?
自分で使うちょっとした自動処理ならわずか数行〜数十行程度で済むが、他人にあげることを
想定したものならファイルパス等のハードコードは絶対に避けてコマンドライン引数やXML形式の
設定ファイルから指定させる等汎用性を高めたり、きちんとエラー対策をとったり等、れっきとした
「アプリ」として「開発」するため余裕で数千〜数万行に達してしまう。 自分で使う自動処理が拡張に拡張重ねて数万行クラスになったのはあるよ 数万行もあるスクリプトを貰っても持て余すなあ
もっと機能を絞って分割するなりして欲しいもんだ せいぜい数百から一千行程度に小分けしたスクリプト50本くらいを
ひとつのフォルダに入れて連携させてるよ
小分けしとくと色々使い回しがきいてラクだわ >>937
> 余裕で数千〜数万行に達してしまう
ScriptControlで動的にWSHのソースを読み込んで実行するタイプなら普通 特に、Classの継承機能のないVBScriptで無理やりオブジェクト指向な
コードを書こうとして、似たような構造のClassを作るため親Classを
コピペしてちょっと改造するって手法を繰り返してたら、
あっという間に数千行に達してしまう それはあるね。コピペ部分が結構多くて行数だけインフレしてる感じ 友達がWindowsで稼げている情報など。ニュースというか参考までに。
⇒ http://kuchibeta.sblo.jp/article/181868190.html
興味がある方のために書きました。
M60W6DP7X5 レス数が900を超えています。1000を超えると表示できなくなるよ。