\n
[ トップページ ]
[ ___ _CommandPrompt ]
[ ___ _JScript ]
[ ___ _MySQL ]
[ ___ _Cygwin ]
[ ___ _Java ]
[ ___ _Emacs ]
[ ___ _Make ]
[ ___ _Perl ]
[ ___ _Python ]
[ ___ _OpenGL ]
[ ___ _C# ]
[ ___ _StyleSheet ]
[ ___ _C++ ]
[ ___ _Winsock ]
[ ___ _Thread ]
[ ___ _VisualStudio ]
[ ___ _C ]
[ ___ _Win32API ]
[ ___ _Lua ]
[ ___ _PhotoShop ]
ヘッダ検索
■ Tutorial
■ ブラウザ上での実行
* 文字を表示させてみる
< body> の中に
< body>
< script language="JavaScript" >
< !--
alert( "test" );
// 画面に 文字を表示
document.write("Hello World!!" );
//-->
< /script>
< /body>
* EventHandler
* tag の属性部分に指定する
* 使用できる EventHandler は Version による
< form action="#" >
< input type="button" value="OK " onclick="alert('OK !!')" >
< /form>
* Function を呼び出すには
< head> 内で Function を定義
< script type="text/javascript" >
< !--
function test() {
alert("call function" );
}
// -->
< /script>
< /head>
< body>
< form action="#" >
< input type="button" value="OK " onclick="test()" >
< /form>
< /body>
アンカーをクリックしたらスクリプトを実行する
< a href="null.htm" onClick="test();return false" >test< /a>
REFERENCE glVertex
別ファイルにして include すると、管理が楽になる。
< script type="text/javascript" src="test.js" >< /script>
■ ブラウザ以外での実行
■ ファイルシステム(FileSystem)
WARNING
ActiveXObject を利用すると ブラウザー経由で
Local マシン上でファイル操作, プログラムの実行できてしまう
( だから Browser の警告がでる )
■ DeleteFolder
SYNTAX
DeleteFolder(
path, // 削除する Folder( 最後の要素に * を使用可能 )
[, force ] // 読み取り専用のファイルも消す Default: false
)
var fs = new ActiveXObject("Scripting.FileSystemObject" );
fs.DeleteFolder( "d:/foo" );
// wildcard 指定
fs.DeleteFolder( "d:/foo*" );
// Directory 内のファイルが使用中ならば, 削除できない( "書き込みできません" )
WARNING
存在しないフォルダを削除するとエラーになる
// パスが見つかりません
fs.DeleteFolder( "d:/foo" );
// チェックすること
if ( fs.FolderExists( "d:/foo" ) ) {
fs.DeleteFolder( "d:/foo" );
}
■ DeleteFile
SYNTAX
DeleteFile(
path // 削除するファイルパス
[, force ] // 読み取り専用のファイルも消す Default: false
);
var fs = new ActiveXObject("Scripting.FileSystemObject" );
fs.DeleteFile( "d:/foo.txt" );
// 読み取り専用は消せない.
// ERROR : 書込みできません
fs.DeleteFile( "d:/foo.txt" );
// ないファイルを消すとエラー
// ERROR : ファイルがみつかりません
fs.DeleteFile( "d:/foobar" , 1 );
パターンにマッチしたファイルを削除する。 ( フォルダは削除されない )
// test 以下のすべてのファイル
fs.DeleteFile( "d:/test/*" , 1 );
// .txt を削除
fs.DeleteFile( "d:/test/*.txt" , 1 );
■ CopyFolder
SYNTAX
CopyFolder ( src, dst[, overwrite] );
DESC
ディレクトリをコピーする。
fs.CopyFolder( "d:/src" , "d:/dst" , true );
■ CopyFile
SYNTAX
CopyFile ( src, dst[, overwrite] );
DESC
src の file を dst で指定したパスへコピーする。
ディレクトリをコピーするには CopyFolder を使う。
overwrite : DEFAULT true
// "c:/src.txt" を "d:/dst.txt" に copy
fs.CopyFile( "c:/src.txt" , "d:/dst.txt" );
// すでにファイルがあれば上書き
fs.CopyFile( "c:/src.txt" , "d:/dst.txt" );
// overwrite = false にすると , ERROR になる
fs.CopyFile( "c:/src.txt" , "d:/dst.txt" , false );
// dst の末尾に [/] をつけると Directory 指定とみなされる
// RET : d:/src.txt
fs.CopyFile( "c:/src.txt" , "d:/" );
// wildcard を指定すると コピー元に複数の指定ができる
fs.CopyFile( "c:/*.txt" , "d:/" );
// このとき dst は Directory として扱われる
fs.CopyFile( "c:/*.txt" , "d:/test" );
// マッチするファイルがないと ERROR
fs.CopyFile( "c:/*.txt" , "d:/test" );
// dst のパスがないと ERROR
fs.CopyFile( "c:/*.txt" , "d:/foobar" );
■ MoveFile
SYNTAX
MoveFile( src, dst );
DESC
src から dst へファイルを移動
var fs = new ActiveXObject("Scripting.FileSystemObject" );
WARNING
// dst に既にファイルがあるとエラー
fs.MoveFile( "c:/foo.txt" , "d:/bar.txt" );
// ERROR: 既に同名のファイルがあります
fs.MoveFile( "c:/foo.txt" , "d:/bar.txt" );
// dst が Directory 名でもエラー
fs.MoveFile( "c:/foo.txt" , "d:" );
// [ / ] で終われば OK
fs.MoveFile( "c:/foo.txt" , "d:/" );
// 同じディレクト内ならばリネームとなる
fs.MoveFile( "c:/src.txt" , "c:/dst.txt" );
■ FolderExists
SYNTAX
FolderExist( path )
DESC
Path の Directory があるか返す
RET
true : ある
false : ない
■ FileExists
SYNTAX
FileExists( path )
DESC
Path の File があるか返す
RET
true : ある
false : ない
if ( fs.FileExists( path ) ) {
}
■ OpenTextFile
SYNTAX
OpenTextFile(
OpenTextFile( file[, iomode[, isCreate[, format] ] ] )
);
OpenTextFile(
file, // path
iomode, // 1:R, 2:W, 8:A
isCreate, // true: Fileがなければつくる
// false:つくらない ( Default: false )
);
DESC
File を開く。
WARNING
指定したパスのディレクトリがない場合はエラーになる。
先にディレクトリをつくる必要がある
fs.OpenTextFile( "d:/foo/bar/goo/foo.txt" , 2, true );
// ReadOnly で "d:/foo.txt" をひらく
fs.OpenTextFile( "d:/foo.txt" , 1 );
// WriteMode ( File がないならつくる )
fs.OpenTextFile( "d:/foo.txt" , 2, true );
// File を開いてかく
var fp = fs.OpenTextFile("d:/foo.txt" , 2, true );
fp.WriteLine( "test" );
fp.Close();
// utf-16 のファイルを開く
var fp = fs.OpenTextFile("d:/foo.txt" , 2, true, -1 );
WARNING
// ないファイルを開くと ERROR
fs.OpenTextFile( "d:/foo.txt" , 1, false );
■ GetFile
SYNTAX
GetFile( path )
DESC
path で指定した File Object を取得する
var o = fs.GetFile( "d:/test.txt" );
// プロパティにアクセスする
o.Path;
//
■ GetFolder
SYNTAX
GetFolder( path )
DESC
Folder Object を取得する
WARNING
path が Directory でない場合はエラーとなる。
var fs = new ActiveXObject("Scripting.FileSystemObject" );
var f = fs.GetFolder ( "c:/Documents and Settings/" );
// コレクションを列挙するには
// Enumerator ( Iterator ) をつかう
var fc = new Enumerator ( f.SubFolders );
// File を列挙
var itrF = new Enumerator ( f.Files );
// Sub Directory をなめる
for ( ; !fc.atEnd(); fc.moveNext () ){
// Enumerator の各アイテムをとるには item()
// Folder Object がかえる
var oFolder = fc.item();
// "Name" Property をとる
// RET : All Users
WScript.echo( fc.item().Name );
// Path
// RET : C:\Documents and Settings\All Users
WScript.echo( fc.item().Path );
// 最終更新日
// 2000/05/24 7:41:57
WScript.echo( fc.item().DateLastModified );
}
■ Folder
フォルダをあらわすオブジェクト
パス名から参照をとる
var d = fs.GetFolder( "c:/Windows/" );
プロパティ
// フルパス
d.Path;
// フォルダ名
d.Name
// 直下のフォルダ
d.SubFolders;
var fs = new ActiveXObject("Scripting.FileSystemObject" );
var f = fs.GetFolder ( "c:/Documents and Settings/All Users/" );
// Folder のファイルのリストをかえす ( 隠しファイルなどすべて含む )
var fc = new Enumerator ( f.Files );
for ( ; !fc.atEnd(); fc.moveNext () ){
// コレクションから File Object をとりだす
var file = fc.item();
// Name Property
WScript.echo( file.Name );
// 最終更新日
file.DateLastModified;
}
■ File
DESC
var f = fs.GetFile ( "d:/test.txt" );
// ファイル, フォルダの種類に関する情報を返す
// xxx.txt -> "テキスト文書" を返す
f.Type;
// ファイルのフルパス
f.Path;
// 最終更新日
f.DateLastModified;
// サイズ ( byte 単位 )
f.Size;
■ 引数解析(CommandLine)
■ 名前なし引数
スクリプトに引数を渡すには script ファイルの後に続ける
すべての引数は 文字列型 として渡される
var oArgs = WScript.Arguments;
var nr = oArgs.length;
WScript.echo( "nr arg = " + nr );
for ( var i=0; i< nr; i++ ) {
var arg = oArgs.Unnamed(i);
WScript.echo( arg + " " + typeof ( arg ));
}
■ 名前つき引数
// 以下のように実行する
script.js /c:arg1 /d:arg2
cscript test.js /p:"d:/test.txt" /d:"d:/"
var oArgs = WScript.Arguments;
var path = oArgs.named("p" );
WScript.echo( path + " " + typeof ( path ));
■ REFERENCE
DESC
Javascript の標準関数
■ doucment
// 現在の URL をリロードする
document.location.reload();
// active ( focur が当たった )オブジェクトを取得する
document.activeElement
■ window.object
sW = window.innerWidth;
sH = window.innerHeight;
■ alert
SYNTAX
alert( str )
DESC
Dialog を表示
閉じるまで Script に制御を返さない
// quot は必須らしい
< input type=button value="押してみて^ ^/" onClick="alert('元気ですか?')" >
■ confirm
SYNTAX
bool confirm string
DESC
確認用の dialog を表示する。
var ret = confirm("test" );
alert( ret );
■ prompt
SYNTAX
string prompt( string, [ string ] )
var ret = prompt( "入力してください" , "初期値" );
alert( ret );
■ close
SYNTAX
close()
DESC
Window を閉じる
■ navigator.object
■ appName
SYNTAX
navigator.appName
alert( navigator.appName );
■ parseFloat
SYNTAX
float parseFloat( str )
DESC
文字列から float 値に変換
■ Regexp(正規表現)
SYNTAX
RegExp( patern [, flag] )
DESC
RegExp 型の Object を search() など各メソッドの引数にわたす
// コンストラクト
var re = new RegExp( "test" );
var s = "Test dayo" ;
// RET : -1
var idx = s.search( re );
// Insentive 指定
var re = new RegExp( "test" , "i" );
// Global マッチ
var re = new RegExp( "/" , "g" );
path = "d:/foo/bar/test.txt" ;
path.repace( re, "\\" )
// RET : 0
var idx = s.search( re );
文字列処理で使うと便利
var a = s.split( /[0-9]+/ );
var idx = s.search( /[0-9]+/ );
■ Enumerator
// FC
// この例では, item メソッド() で条件があっている
■ クラス(class)
DESC
言語構文にはクラスはないが Object 型に任意のプロパティを設定することで
クラスの機能を実装できる。
var o = {};
// attribute を追加
o.test = 1;
// attribute を削除
delete o.test;
// 関数オブジェクトを attribute に指定することで メソッドらしく利用する。
o.method = function() { return o.test + 1 }
o.method();
コンストラクタもどきの関数を作成して Object を返す。
function create( i ) {
// メンバ変数とメソッド
o.test = i;
o.method = function() { return o.test + 1 }
return o;
}
var o = create( 10 );
o.method();
■ new
SYNTAX
new constructor[( [arguments] )]
POINT
上のコンストラクタもどきの処理を new 演算子を使うことで自動化できる。
new 演算子は次の処理を実行する
new 演算子をつかうと次のように簡略化できる。
// コンストラクタ関数
function MyObject( i )
{
// new 演算子によって作成された Object の参照は this として渡される。
this.test = i;
this.method = function() {
return o.test + 1;
}
}
var o = new MyObject( 10 );
o.method();
コンストラクタは、指定された引数でオブジェクトを初期化できる。
// メンバをもたない Object を作成
var o = new Object;
var a = new Array();
// 指定した引数で初期化
var d = new Date( "Jan 5 1996" );
■ クラスメソッド
function Object()
{
// instance 変数
this.i = 10;
this.s = "test" ;
// class 変数として 関数を設定する
Object.prototype.print = function() {
p( "call method" );
p( this.i );
p( this.s );
}
}
{
var o = new Object();
o.print();
}
function() を使ってクラスを定義する。
function Command( path )
{
// メンバ変数
this.path = path;
// メンバ関数
this.run = function() {
WScript.echo( "run path = " + path );
}
}
利用する。
var cmd = new Command( "d:/test.txt" );
cmd.run();
■ SYNTAX
■ 基本的なこと
JavaScript は statement-set
statement
1つ以上の式やキーワード、演算子などから成る
終端には、[ ; ]をつける ie. [;] がステートメントの終わり
Sensitive( 大文字, 小文字 のちがいあり)
// ERROR
var s = new string;
// OK
var s = new String;
■ コメント(Comment)
Comment は評価されないが, Read されるので処理が重くなる
( Interpreter が評価するため )
■ Function.関数
// 定義する場所は call する前ならばどこでも良い
// < head>〜< /head> 間 | 外部ファイル
function func(hour, min, sec) {
var ret = hour * 3600 + min * 60 + sec;
return( ret );
}
// call
ret = func(12, 34, 56);
■ 無名関数
addHandler ( function() { } );
■ 変数(Variable)
DESC
JScript の変数のスコープは 3 つ
ローカル変数
関数が実行されるたびに生成
関数をぬけると破棄
関数の外部からは、変数にアクセスできません
GUIDELINE
同一名は利用しない
WARNING
C++ のような BlockScope は使えない
関数内の i は同じ
// 3 * 3 = 9 回のループにはならない
function foo()
{
for( var i=0; i< 3; i++ ){
WScript.echo( "oya " + i );
// BlockScope はなし
if (0) {
for( var i=0; i< 3; i++ ){
WScript.echo( "kodomo " + i );
}
}
else {
for( var j=0; j< 3; j++ ){
WScript.echo( "kodomo " + j );
}
}
}
}
ローカル変数が宣言されている関数の中では
"ローカル変数だけ" が見える
Local変数は, Global変数をかくす
( "参照可能範囲" という )
// Global 変数
var aNumber = 100;
// 変数の宣言は Code の実行前に 処理される
function tweak()
{
// 外の "aNumber" のつもりだが, 関数内の "aNumber"
var s = "aNumber is " + aNumber;
return s;
if (false) {
// この宣言は, 外の "aNumber" をかくす( 上書きする )
var aNumber;
aNumber = 123;
}
}
変数および定数をすべて検出した後、関数内のコードが実行される
ローカル定数の値は、定数の宣言ステートメントが実行されるまで未定義です
関数で変数への代入が実行されるまでは、変数も未定義です
JScript では
変数と定数の宣言はすべてコードの実行前に処理される
宣言が条件ブロックや他の構造の内部にあるかどうかは処理には関係なし
変数, 定数をすべて検出した後
関数内のコードが実行される
ローカル定数の値は
定数の宣言ステートメントが実行されるまで未定義
また、関数で変数への代入が実行されるまでは、変数も未定義
function isEnvVista()
{
var ret = 0;
var sh = new ActiveXObject("WScript.Shell" );
var WshEnvironment = sh.Environment("Process" );
// これは 関数内 のみの Scope
var val = WshEnvironment.item("HOMEPATH" );
if ( val.search(/Documents and Settings/) >= 0 ) {
WScript.echo ( "env is XP" );
}
else {
WScript.echo ( "env is VISTA" );
ret = 1;
}
return ret;
}
print( isEnvVista() );
// val は宣言されてません ( Runtime Error )
print( val );
■ Include
DESC
Include という構文がないため eval() で代用する
eval は引数に渡された文字列を Interpreter で Code として評価する
WARNING
eval で評価する 文字列( code ) では file 操作が禁止になる
file 操作の関数は module にしないこと
TIP
変数は File 単位でとじる
C, C++ のように File をまたいで共有することはない
main 側で module にあたるファイルを Include( Eval )する
// 共通の module を Include( Eval )する
eval( new ActiveXObject("Scripting.FileSystemObject" ).OpenTextFile("d:/common.js" , 1).ReadAll() );
■ 演算子
SYNTAX
!exp
DESC
式の論理否定
//var b = true;
var b = false;
print( !d );
if ( !d ) {
print("true" );
}
// undefined はだめ
d=0;
// increment, decrement
var i = 0;
// 後置
i ++;
// 前置
++ i;
■ cast(キャスト)
明示的にキャストするには 型の識別子の後に式をかく
// string
var s = String( 123 );
// number
var n = Number( "123" );
文字列と 数値の比較 OK
if ( 10 == "10" )
{
WScript.echo("aaa" );
}
■ Bit(ビット演算)
var n = 8;
if ( n & 1 ) {
WScript.echo( "flag ON" );
}
else {
WScript.echo( "flag OFF" );
}
■ type(typeof)
SYNTAX
typeof( exp )
DESC
型情報を文字列で返す
"number" 、"string" 、"boolean" 、"object" 、"function" 、"date" 、"undefined" 、"unknown"
// string
var y = "Hello" ;
// object
var z = new Array();
// 未初期化の変数は "undefined" がかえる
if ( typeof ( gObj ) == "undefined" ) {
print( "not init" );
gObj = {};
// object
print( typeof( gObj ) );
}
// Array は object
{
var a = ["aaa" ];
print( typeof( a ) );
}
■ object
DESC
すべての Object の基本型
// in 演算子
if ( "prop" in obj ) {
}
// 文字列をかえす
string Object::toString();
// Function 型 Object "foo"
function foo() {
WScript.echo("foo" );
}
WScript.echo( foo.toString() );
toString() をすると val の配列が返る
a = ["a" , "b" , "c" ];
// a,b,c
a.toString();
■ null
DESC
Object がないことをあらわす Object
■ undefined
DESC
//var x = 10;
// 未定義 | 未初期化の変数を調べる
//
if ( typeof( x ) == "undefined" ) {
print("undefined" );
}
else {
print("defined" );
}
■ 制御構文
■ for
// 次の記述は OK
for( var i=0; i< 3; i++ ){
//
}
// すべての要素を繰り返す
for ( s in a ) {
// s には a の index が格納される
WScript.echo( a[s] );
}
■ do-while
var a = [1,2,3];
do {
a.pop();
var nr = a.length;
WScript.echo( a[nr-1] );
} while ( nr > 1 );
■ with
// 親 Object を省略できる
print( Math.PI );
// 上と同じ
with( Math ) {
print( PI );
}
■ Date(Timer)
SYNTAX
// Timer として使う
var s = ( new Date() ).getTime();
WScript.Sleep(1000 * 2);
var e = ( new Date() ).getTime();
// 2000
print( e - s );
WARNING
file.DateLastModified は Date オブジェクトではない。
Date オブジェクトを生成する必要がある。
var d = new Date( file.DateLastModified );
現在の日付を取得する。
var d = new Date();
var s = "log_"
s += "_" + d.d.getFullYear();
s += "_" + d.getMonth();
s += "_" + d.getDate();
s += "_" + d.getHours();
s += "_" + d.getMinutes();
s += "_" + d.getSeconds();
s += ".txt" ;
■ 配列(Array)
SYNTAX
arr.sort( [function] )
arr.push()
arr.pop()
String join( String sep )
■ 結合(concat)
var a, b, c, d;
a = new Array(1,2,3);
b = "test" ;
c = new Array(42, "foo" );
// [1, 2, 3, "test" , 42, "foo" ]
d = a.concat(b, c);
■ 追加(push)
var a = ["a" ];
a.push( "b" );
a.push( 2 );
■ 挿入.insert
SYNTAX
Object unshift()
■ 取得.削除
SYNTAX
Object shift()
DESC
配列の先頭の要素を削除し、削除した要素を返します。
var a = ["a" , "b" , "c" ];
// "a" が返り, ["b" , "c" ] となる
var s = a.shift();
■ 削除(pop)
末尾を削除するには pop() を使う。
var path = "c:/foo/bar/test.txt" ;
var a = path.split( "/" );
var file = a.pop();
配列の要素を削除するには単項演算子 delete をつかう
var a = ["a" , "b" , "c" ];
delete a[1];
■ 抽出.slice
SYNTAX
Array slice(
start : Number // 開始 index
[, end : Number] // 終了 index
)
DESC
配列の部分配列を返す。
a = [ 1, 2, 3 ];
// 先頭( 0 番目 )のみカット。 end は省略すると配列の最後まで
// [2,3]
a.slice( 1 );
// start に 負を指定すると後ろからの指定。 a.length + start 番目から開始となる。
// [3]
a.slice( -1 );
// end で指定したひとつ前の要素まで返す。 つまり [ start : end )
// [1,2]
a.slice( 0, 2 );
// end に 負を指定すると後ろからの指定。 a.length + end の指定となる。
// 最後だけ除去する
// [1,2]
a.slice( 0, -1 );
// これと同じ。
a.pop();
■ join
配列の要素をつなげる
var path = "c:/foo/bar/test.txt" ;
var a = path.split( "/" );
a.join( "/" )
■ ソート(sort)
辞書順でソートされる。
var a = [ "e" , "d" , "a" ];
a.sort();
// [ "a" , "d" , "e" ]
ソートをカスタマイズするには, 引数に関数型のオブジェクトをわたす。
比較関数のインターフェイスは 比較対象の Object を2個もらい, 大小に応じて 1, 0, -1 を返す。
// obj{ age, name }
function mySort( oA, oB )
{
if ( oA.age > oB.age ) return 1;
else if ( oA.age == oB.age ) return 0;
else return -1;
}
var a = [ { age:2, name:"Tanaka" }, { age:1, name:"Suzuki" } ]
a.sort( mySort );
// BAD
// このとき Interpreter が実行される前にとまる
// 逐次 Parse してるわけではないらしい
WScript.echo( "Global Code" );
// ERROR
//var a = new Array("aaa" "bbb" "ccc" ); // ここでとまる
// OK
var a = new Array("aaa" , "bbb" , "ccc" );
■ 連想配列(Hash)
DESC
任意の値( Val )を任意の文字列( Key )に動的に関連つけるデータ構造
添字演算子を使用すると
オブジェクトは "連想配列" 扱いになる
■ Objectを連想配列として使う
JScript の Object 型は、動的にメンバの追加、削除ができる。
これを利用して連想配列を実装する。
var tbl = {};
// name プロパティに "test"
tbl.name = "kato" ;
// age プロパティに 10 をセットする
tbl.age = 10;
// 上書きする
tbl.age = 20;
// プロパティの値に配列オブジェクト参照させる
tbl.friend = [ "taro" , "hanako" , "goro" ];
// プロパティの値に別のオブジェクト参照させる
tbl.family = { father : "taro" , mother : "hanako" };
プロパティを参照するには for - in を利用する
for( key in tbl ){
WScript.Echo( key + " " + tbl[key]);
}
■ プロパティに使える値
プロパティ名には数値を含む、任意の文字が使える。
tbl.test = "a" ;
tbl.0 = "1" ;
tbl.key0 = "b" ;
添字演算子 [] を使えば、任意の式の値をプロパティ名に使える。
プログラム内で動的に決まる値をキーの名前にするときに使うと便利。
tbl[ "test" ] = 10;
tbl[ func() ] = 10;
tbl[ 10 + 2 ] = 10;
obj = {};
tbl[ obj ] = 10;
WARNING
添字演算子をつかった場合は、すべてのプロパティは文字列として変換される。
そのため Object をキーとして利用する場合は注意が必要。
objA = { age : 10 };
objB = { name : "b" };
tbl[ objA ] = 10;
// ここで上書きされる( objA と objB は文字列表現が同じ )
tbl[ objB ] = 20;
文字列をキーとして利用するのが無難
tbl[ "objA" ] = 10;
tbl[ "objB" ] = 20;
// この書き方は OK
var a = new Array();
a[ "key" ] = "val" ;
var dic = new Object(
{
H:"Hokkaido" ,
T:"Television" ,
B:"Broadcasting" // WARNING 最後の[,] はコンパイルエラー
}
);
// WARNING
// 数値に変換できる文字を KEY にすると、数値で参照できる
a[ "0" ] = "val_0" ;
// val
print( a["key" ] );
tbl = { a:"foo" , b:"goo" };
WScript.echo( tbl.a );
WScript.echo( tbl["a" ] );
■ Object
// Key をかえす
for ( i in aa ) print( i + aa[i] );
var o = new Object();
// Property の追加 ( 名前は任意 )
o.a = "val1" ;
o.b = "val2" ;
o.c = "val3" ;
// Array も Object 扱い
// key == index
// RET
// 0 "a"
// 1 "b"
// 2 "c"
a = ["a" , "b" , "c" ];
for ( attr in a ) print( attr + " " + a[attr] );
//
// Object の Property を取得する
// Property 名がわからないときにこれを使う
for ( attr in o ) print( attr + o[attr] );
var fs = new ActiveXObject("Scripting.FileSystemObject" );
var d = fs.GetFolder ( "c:/Documents and Settings/" );
print( d.Name );
// 組み込み Object はだめ
for ( i in d ) print( i + d[i] );
if (1)
{
a = [ "obj_10" , "obj_00" , "obj_01" ];
var aSort = new Array;
for( i=0; i< a.length; i++ ){
s = a[i];
var num = s.split("_" )[1];
num = parseInt( num );
// obj{ 10, obj10 }
var obj = new Object;
obj.num = num;
obj.name = s; // obj10
// 追加
aSort.push( obj );
}
for( i=0; i< aSort.length; i++ ){
print( "before " + aSort[i].num + " " + aSort[i].name );
}
/*
a = [
{ 10, obj10 },
{ 1, obj001 },
{ 2, obj2 },
]
*/
■ Shell(シェル)
// CurrentDirectory の移動
sh.CurrentDirectory = "d:/" ;
print( sh.CurrentDirectory );
■ Exec
SYNTAX
Exec( cmd ) // command line 文字列
DESC
外部 Application を SubProcess で実行する
stdout を取得できるので, 連携できる
var sh = new ActiveXObject("WScript.Shell" );
// Exec() は Block されない
var oExec = sh.Exec("notepad" );
// プロセス ID
oExec.processID;
// SubProcess が実行中は 0 がかえる
while ( oExec.Status == 0 )
{
WScript.echo( "wait" );
WScript.Sleep(100);
}
WARNING
// サブプロセスが終了していないと 0 が常にかえる
// 正しい値をとるには, 処理の終了をまつ
// ExitCode は C での int main() の戻値
code = oExec.ExitCode;
var oExec = sh.Exec("notepad" )
// 3 sec まつ
WScript.Sleep(3000);
// 実行中の SubProcess を終了させる
oExec.Terminate();
// stdout がすべて取得するまで まつことで終了まちもできる
var s = oExec.StdOut.ReadAll();
var s = "" ;
while ( !oExec.StdOut.AtEndOfStream ) {
// 1 byte 読む
s += oExec.StdOut.Read(1);
// 1 行よむ ( 引数はなし )
s += oExec.StdOut.ReadLine();
if ( s.indexOf("Press any key" ) != -1 ) break;
}
■ Run
DESC
外部アプリケーションを SubProcess で実行する
Window を最小化して実行できる
stdout をとるには, Exec() を使うこと
SYNTAX
Run(
cmdline // cmdline 文字列
[, modeWindow ] // Window の表示 mode
[, isWait ] // SubProcess の終了をまつか
)
RET
ExitCode // 実行した Program の終了コード
Explorer
wscript.exe // Interpreter
notepad
var sh = new ActiveXObject("WScript.Shell" );
// notepad を非表示で起動
// 処理は Block される
sh.Run( "notepad" , 0, true );
// cmdline を渡すため
// 以下の記述でも OK
sh.Run( "notepad d:/foo.txt" , 0, true );
// Redirect はできない
sh.Run( "hostname > foo.txt" , 0, true );
// notepad を最小化で起動
// 処理は Block される
sh.Run( "notepad" , 7, true );
WindowMode
0 ウィンドウを非表示 && 別のウィンドウをアクティブにする
1 ウィンドウをアクティブ && 表示 ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻る
2 ウィンドウをアクティブにし、最小化ウィンドウとして表示する
3 ウィンドウをアクティブ && 最大化にして表示
4 ウィンドウを最新のサイズと位置で表示 アクティブ・ウィンドウは切り替わらない
5 ウィンドウを現在のサイズと位置で表示 && アクティブにする
6 指定したウィンドウを最小化し、Zオーダー上で次に最上位となるウィンドウをアクティブにする
7 ウィンドウを最小化ウィンドウとして表示. アクティブ・ウィンドウは切り替わらない
8 ウィンドウを現在の状態で表示する。アクティブ・ウィンドウは切り替わらない
9 ウィンドウをアクティブにして表示する。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻る
10 アプリケーションを起動したプログラムの状態に基づいて表示状態を設定する
■ SpecialFolder
SYNTAX
SpecialFolder( "path" );
DESC
Windows デフォルトの Directory パスをかえす
( MyDocument など )
// Documents and Settings/
var d = sh.SpecialFolders("MyDocuments" );
■ 環境変数(ENV)
SYNTAX
var sh = new ActiveXObject("WScript.Shell" );
var env = sh.Environment("Process" );
// Documents and Settings/usr
env.item("HOMEPATH" );
SYSTEM : 全ユーザーに適用
UEER : ユーザー環境変数。ログオン・ユーザーごとに適用
PROCESS : プロセス環境変数 現在有効な全環境変数( readonly )
VOLATILE : 一時環境変数。ログオフと同時に破棄される一時的な環境変数
// user ENV Object を取得
var WshEnvironment = sh.Environment("User" );
// .item( KEY ) で 値を取得
// 環境変数 "PATH" を参照
var val = env.item( "PATH" );
// .item( KEY )で値を指定
WshEnvironment.item( "PATH" ) = val;
// USERNAME は PROCESS になる
var env = sh.Environment("PROCESS" );
var usr = env.item( "USERNAME" );
■ レジストリ.Registery
// レジストリを作成
sh.RegWrite "HKCU\Software\ACME\FortuneTeller\" , 1, "REG_BINARY"
// KEY の値を取得
sh.RegName( "HKCU\Software\ACME\FortuneTeller\MindReader" );
// 消す
sh.RegDelete( "HKCU\Software\ACME\FortuneTeller\MindReader" );
■ 文字列(String)
DESC
TextData をもつ Object
変数に リテラルをいれることで暗黙的に生成
// 暗黙的に生成
var str = "aiueo" ;
// 明示的に生成
// JScript は 大文字, 小文字の違いがある
var str = new String( "aiueo" );
// マッチした Index値をかえす
var s = "ABCED" ;
// RET : 1
var idx = s.indexOf( "BC" );
// なければ -1
var idx = s.indexOf( "F" );
■ 置換
■ replace
SYNTAX
replace( RegExp, String )
// Replace
var s = "d:\\foo\\bar" ;
// RET
// d:/foo\bar
s.replace( "\\" , "/" );
// RET
// d:/foo/bar
s.replace( /\\/g, "/" );
■ 検索
■ match
SYNTAX
Object search( RegExp )
DESC
RegExp にマッチした index, lastIndex を返す。
lastIndex は最後に一致した文字の直後の位置がセットされる
RET
Object
null : マッチしない
var s = "0123456789" ;
var o = s.match( /234/ );
if ( o != null ) {
// 2
o.index;
// 5 ( 4 の直後 )
o.lastIndex;
}
■ search
SYNTAX
Number search( RegExp )
DESC
RegExp に Match する index をかえす
RET
N : Match した index
-1 : マッチしない
var s = "c:/foo/test.txt" ;
// RET
// 2
s.search( "/foo" );
// RET
// -1
s.search( "/foo$" );
// RET
// 0
// "." は RegExp としての扱い
s.search( "." );
// RET
// 11
// "." 自体を指定
s.search( "\\." );
var s = "c:\\foo\\test.txt" ;
// RET
// 2
// "\" 自体を指定
s.search( "\\\\" );
// 複数回の置換
path = "d:\\test\\test.txt" ;
path.replace( /\\/g, "/" );
// 大文字, 小文字指定なしで
path = "d:\\test\\test.txt" ;
path.replace( /d:/i, "/cygdrive/d" );
■ split
SYNTAX
split( String dlm )
split( Regexp dlm )
split( String dlm [, limit] )
split( Regexp dlm [, limit] )
RET
Array
DESC
指定した String( Regexp ) 区切り文字で分割して配列をかえす。
// [ "c" , "foo" , "bar" , "test.txt" ]
var path = "c:/foo/bar/test.txt" ;
var a = path.split( "/" );
// 2 コだけもらう
var a = path.split( "/" , 2 );
// file 名をとる
WScript.echo( a.pop() );
// 単一文字ではなく, 文字列を区切りに指定する
// [ "aaa" , "bbb" ]
var s = "aaa_foo_bbb"
var a = s.split( "_foo_" );
先頭、末尾に区切り文字がある場合は string, Regexp 型によって結果がかわる。
string の場合は最初、最後も空文字列のトークンになる。
Regexp にすると空文字列のトークンはカウントされない。
var s = "c:/foo/bar/" ;
// ["c" , "foo" , "bar" , "" ]
var a = s.split("/" );
// ["c" , "foo" , "bar" ]
var a = s.split( /\// );
Regexp を利用すれば 複数の文字で分割できる
path = "c:/foo/bar"
path.split( /[\/]/ )
WARNING
空文字列を分割すると 1 個の空文字列が返る
var s = "" ;
// a.length == 1, a[0] = "" ;
var a = s.split( " " );
■ 抽出.切り出し.部分文字列
■ slice
SYNTAX
String slice(
start : Number // 開始 index
[, end : Number] // 終了 index
)
var s = "012345" ;
// "2"
s.slice( 2,3 );
// 終了を指定しないと最後まで
// "2345"
s.slice( 2 );
// 負を指定すると後ろからの index 指定
// "45"
s.slice( -2 );
// "4"
s.slice( -2, -1 );
■ substring(substr)
SYNTAX
String substring( s, e )
String substr ( s, [ len ] )
DESC
指定された index にある文字列を返す。
var s = "012345" ;
// "123"
s.substring( 1, 3 );
substr は開始位置と長さをとる
// "23"
s.substring( 2, 2 );
// 長さを指定しないと末尾まで
// "2345"
s.substring( 2 );
■ splice
DESC
指定された数の要素を start の位置から削除し
新しい要素を挿入して配列を修正します。
削除した要素は、新しい array オブジェクトに格納して返します。
SYNTAX
splice( start, deleteCount [, item1 : Object [, ... [, itemN : Object ]) : Array
■ length
DESC
Byte 数ではなく文字数をかえす
var str = "aieuo" ;
// 文字数 5
WScript.echo( str.length );
// SJIS でセット
// RET : 5
str = "あいうえお"
WScript.echo( str.length );
■ charAt
DESC
指定 index の文字をかえす
WARNING
参照を返さないため, 代入はできない
var s = "012345" ;
// 1
s.charAt( 1 );
■ 変換
英字の大文字、小文字を変換する
var s = "aBc" ;
// "abc"
s.toLowerCase();
// "ABC"
s.toUpperCase();
■ WScript
POINT
Windows Scripting Host 環境で有効になるオブジェクト
ブラウザーから実行される( ブラウザがホストの )場合はこのオブジェクトは利用できない
WARNING
cscript で実行したときの有効
// stdout へはく
WScript.StdOut.WriteLine( "aaa" );
// DialogBox( Graphic ), Stdout へ出力
// wscript では stdout へはかれない
WScript.echo( "xxx" );
// cscript で出力すると space と最後に \n が追加
// RET : "a b c\n"
WScript.echo( "a" , "b" , "c" );
// stdout へ出力するには cscript を使う
cscript /NoLogo "echo.js" > log.txt
■ CreateObject
DESC
COM object を返す
var oNet = WScript.CreateObject( "WScript.Network" );
■ ActiveX(ActiveXObject)
DESC
ActiveXObect 経由で実行できる
Browser から実行するなら許可が必要
TIP
IE 設定
WARNING
Security 上非常に危険なので, OFF にすべき
var sh = new ActiveXObect( "WScript.Shell" );
// Commandline を記述することで, 任意の Program を実行
sh.run( "notepad" );
■ ActiveXObject.とは
DESC
機能単位にまとまったプログラムの部品
Script は各機能の 糊付け の役割をはたす
自作の ActiveXObject も作成でき Script 内から利用できる
■ こんなことができる
よくもわるくもこんなことできる
■ Windows標準でインストール済みのものとInternet経由で取得できるものがある
■ どのくらい危ないかやってみる
■ C:/直下にファイルを作成して消してみる
Local に次の HTML をつくる
これを IE で開いて Button を押すと C:/foobar がつくられる
< head>
< script type="text/javascript" >
< !--
function test() {
var fs = new ActiveXObject("Scripting.FileSystemObject" );
// C:/ の直下に "foobar" というディレクトリをつくる
fs.CreateFolder( "C:/foobargoo" );
// 消す
//fs.DeleteFolder( "C:/foobar" );
alert("ディレクトリを作成しました" );
}
// -->
< /script>
< /head>
< body>
< input type="button" value="OK " onclick="test()" >
< /body>
Shell Object を作成して, 任意のコマンドを実行する
< head>
< script type="text/javascript" >
< !--
function test() {
// Shell を操作する ActiveXObject を作成
var sh = new ActiveXObject("WScript.Shell" );
alert("RemoteDesktop を起動します" );
// RemoteDesktop 起動
sh.Run("mstsc" );
// 不正な Program が実行される
sh.Run( "xxx.exe" );
}
// -->
< /script>
< /head>
< body>
< input type="button" value="OK " onclick="test()" >
< /body>
■ 危険なことがわかったのでセキュリティ対策をする
DESC
■ セキュリティゾーンの設定をかえる
上の HTML は IE で開くと警告がでる
知らずに使ったら危ないよってこと
この警告レベルは変更できる
( Local での実験は反映されない http://hostname/test.htm)
POINT
Virus は HTML( Program ) という形式で提供もされる
10行ほどのスクリプトを含む HTML
IE で閲覧すると,とんでもないことが起こる
XPマシンに バックドア が仕掛けられてしまう
攻撃者がインターネット上に用意したサーバから「bkdr.exe」という実行形式のファイルを DL
「Welcome!」というメッセージをポップアップ表示
OK を押すと,bkdr.exe が実行される
ファイルがバックドア・プログラムなら,冒頭の悲劇が起こる
マシンはインターネットから,攻撃者に好きなように操作されることになる
スクリプトがローカルにある ActiveX コンポーネントを呼び出して
その機能を利用することができるから
Windows 98以降のWindowsは,
POINT
Script から汎用的に作成してよびだすのはこれ
ファイルやレジストリ操作
プログラムの実行
データベースへのアクセス
などが可能なActiveXコンポーネントを標準で備えている
スクリプトでアプリケーションを操作もできる
MS Office
スクリプトでOutlookを操作し,メールを送ることもできる
HTML中にローカルのActiveXコンポーネントやOfficeの機能を利用する不正なスクリプトが含まれていると
Webにアクセスしただけで
攻撃者の思い通りにパソコンの設定を変更されたり
ファイル操作やメール送信を実行される
インターネットから
怪しげなActiveXコンポーネントをダウンロードすることもない気づく可能性も低い
IEのデフォルト設定では禁止
攻撃をすべてのユーザが受けるわけではない
このスクリプトがデフォルト設定のIEで動かない
IEのセキュリティ設定の
VBScript, JScript(JavaScriptのMicrosoft版)の実行の可否を決める
「アクティブ スクリプト」
IEではこれらセキュリティの設定を
上から順に Security が厳しい
「制限付きサイト」
// 一般のWebサーバ
「インターネット」
// イントラネットのサーバ用
「イントラネット」
// ユーザが明示的に指定した信頼できるサイトと信頼できないサイト用の設定
「信頼済みサイト」 : *.xxx.xxx とか追加されている
という四つのゾーンに分けて決めている
[レベルのカスタマイズ] :
↑の 4 カテゴリを詳細設定するときに使う
インターネット 上にあるWebサイトをアクセスするとき
信頼済み/制限付きサイトに登録してないなら「インターネット」の部類になる
IEのデフォルトはこれ
デフォルトでは
ローカルのActiveXコンポーネントが動かず不正なスクリプトが実行されない
インターネットを利用していると,設定が甘くなる可能性がある
いったん甘い設定をしたら見直すことはほとんどない
「安全マークのないActiveXの実行」を許可するように求めているサイトは山ほどある
検索サイトでこの設定を推奨しているサイトを調べると
100以上のサイトが容易に見つかる
Webページを作る側が問題に対してルーズかがわかる
クロスサイトが危ない
このほか,クロスサイト・スクリプティングと呼ぶ手法を使い
ローカルのActiveXコンポーネントを強制的に実行させられるケースも考えられる
クロスサイト・スクリプティングとは
Webサーバが文字列を適切に処理していなとできる攻撃
信頼済みのWebサーバがこの欠陥を抱えていた場合
攻撃者の用意した不正なスクリプトが「信頼済みサイト」ゾーンの設定で動き
ローカルのActiveXコンポーネントが使われる恐れがある
POINT
IEのデフォルトでは
「信頼済みサイト」は「安全マークのないActiveXコントロール」の実行が「ダイアログに表示する」
「安全マークのないActiveXコントロール」が実行される前に確認メッセージが出る
( 普段よく見るメッセージ )
メッセージの意味はわかりにくいので ユーザは深く考えずに「はい」を押す
スクリプトとローカルのActiveXコンポーネントが動く
ActiveXコンポーネントを悪用した不正なWebページやウイルスは存在する
ローカルのActiveXを使った不正アクセスで有名なのが
メディアゲートが運営するオークション・サイト「プライスロト」にアクセスしたユーザの
パソコンが起動不能になったというもの
原因はプライスロトのページが何者かに改ざんされ
不正なスクリプトが埋め込まれていた
このスクリプトはWSHを使用し,起動に必要なレジストリを改ざんするもの
IE5.5が抱えるセキュリティ・ホールを突き
「安全マークのないActiveXコントロールの実行」が許可されていなくても
レジストリを改ざんすることができた
ウイルスの実体はスクリプトを埋め込んだ HTML メール
Outlook はHTMLメールの解釈にIEのコンポーネントを使っている
( Virus も Program ということ )
IEと同様にHTMLメールにスクリプトを埋め込むことで
ActiveXコンポーネントの実行が可能
感染するとメールの署名ファイルをVBScriptで記述したウイルス・ファイルに書き換える
ファイル操作にFSOを利用する
ユーザが作成するメールの書式がデフォルトでHTMLメールになるようにレジストリをかえる
感染したマシンを使ってメールを送るごとに,ウイルス(署名部分)付きのメールを送る
IEではなく,WSH上で直接動くスクリプト・ウイルスもある
これらを若干改造してHTMLに埋め込めば,Webページを見ただけで同様の動作を起こすことができる。
「I Love You」と書かれたメールに付いてくる添付ファイルを開くと感染し
Outlookのアドレス帳の全ユーザにウイルス付きメールを送信する
パソコン内のファイル削除という破壊活動もする
OutlookのActiveXコンポーネントと
Windowsが標準で持つファイルを操作可能なActiveXコンポーネントなどが利用されている
WSHを使って動くプログラムにNetlogと呼ばれるウイルスがある
実行すると適当なIPアドレスを生成, ネットワーク上でCドライブを共有しているマシンを探す
見つかれば,Jドライブとしてマップする
加えて,スタートアップ・フォルダにウイルスを登録する
破壊活動はしない
問題 は IE がローカルのActiveXコンポーネントを呼び出し
その機能を利用できることが原因
ActiveXはインターネットに関連する技術の総称だったが
COM(Common Object Model)を使って構築された技術をActiveXといい
ほぼ COM と同じ意味でいわれる
ActiveXコンポーネントとは機能単位にまとまったプログラムの部品
プログラマはこれらコンポーネントを呼び出すことで,
OS の機能を簡単に利用できる
レジストリを書き換える場合を例にすると
「レジストリのこの部分のこのキーの値を『A』という値にする」
を ActiveXコンポーネントに依頼するだけ
■ WindowsはActiveXコンポーネントの塊
スクリプト実行環境WSH(Windows Scripting Host)
ファイル操作用のFile System Object(FSO)以外に
データベース・アクセス用のADO(ActiveX Data Objects)
ディレクトリ・アクセス用のADSI(Active Directory Service Interfaces)などの
ActiveXコンポーネントも標準で備えている
POINT
標準のものもあるし, 特別に追加するのもある
Office, 一太郎 アプリケーションもActiveXコンポーネントを備える
-> ということは 遠隔操作できるのか
ActiveXコンポーネントは,IEからスクリプトの中からよばれる
IEは標準でVBScript,JScript
の二つのスクリプト・インタプリタを持つ
POINT
Browser が解釈して実行してくれる
どの言語で解釈するかはタグの中にある「<SCRIPT LANGUAGE="○○" >」の○○部分で
スクリプト内でActiveXコンポーネントを使うように宣言したすると
IEがそのコンポーネントを呼び出して処理を依頼する
IEは DL してきたActiveXコンポーネントを呼び出して処理を依頼することもできる
フォルダにダウンロードしたコンポーネントを呼べる
C:\WINDOWS\Downloaded Program Files( Windows NT/2000/XP )
ActiveXコンポーネントはEXEファイルなどと同様にマシン上で直接実行されるバイナリ
EXEファイルと同様の操作がOSに対して可能である
POINT
Exe なのか ( DLL ) と同等のものと考えればいい
ローカルにあるものだけではなく, 新規に DL もできる
ダウンロードした ActiveX が悪意あるプログラムなら
バックドアを開けたり OSの各種設定を変更もできるため、不用意にすると危険
■ Browser.は実行前に認証すみかどうかチェックする
IEは無条件にActiveXを呼び出し,その機能を利用しているわけではない
適切なセキュリティ設定がされていれば
不正なActiveXを呼ばない仕組みを用意
この仕組みはローカルにインストールされている
ActiveXコンポーネントとダウンロードしてきたActiveXコンポーネントで異なる
ローカルにインストールされているとき
ActiveXコンポーネントを起動する前に
レジストリ値を参照して
ActiveXコンポーネントを起動してよいかを決定する
IEでは,このレジストリ値を「安全マーク」という
-> ならここで はじかれるのか...
例
レジストリ・エディタで「Tabular Data Control」と呼ばれるデータ整形用の
ActiveXコンポーネントのパラメータが書かれた部分を表示させたものである
ActiveXコンポーネントごとのレジストリの中にある
HKEY_CLASSES_ROOT\CLSID
Implemented Categories/7DD95801-9882-11CF-9FA9-00AA006C42C4」(Safe For Scripting)
/7DD95802-9882-11CF-9FA9-00AA006C42C4」(Safe For Initializing)
というキーがあれば,IEは「安全マーク付き」と判断
このキーがなければ安全ではないと判断
IEのセキュリティ設定で
「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」
が許可していれば この認証機構はスキップ
DL したActiveXコンポーネントの場合は,ActiveXコンポーネントが
ディジタル証明書を持っているかどうかで認証する
証明書を持つときActiveXコンポーネントが改ざんされていないか調べてから実行
POINT
これを CheckSum という
証明書の発行は,米Verisign社などの証明書発行機関に依頼する
会社の登記情報など身元を提出/証明する必要がある
犯罪者は一般に自分の身元を知られたくない
悪意ある証明書付きのActiveXコンポーネントは作りにくい
認証機関はプログラムの善悪は判断しないため
危険なプログラムでないという保証はない
IEのセキュリティ設定で「未署名のActiveXのダウンロード」を許可すると
証明書なしのActiveXコンポーネントをチェックせずに実行してしまう
■ 信頼済みサイト.ゾーン
Internet Explorerのセキュリティ・ゾーンの一つ
安全であることがわかっているサイト用のゾーンで
デフォルトのセキュリティ・レベルは「低」
そのため
信頼済みサイト・ゾーンにWebサイトを追加すると
そのWebサイトからの DL/実行 には警告の表示がされず実行時の制限もない
TIP
ここに指定した Site ( page | PC ) からの
ActiveXObject の実行が許可される
信頼済みサイトへの設定手順
site を追加する
WebSite のところに 以下のような ( site == Domain )を追加
■ Excel
var e = new ActiveXObject("Excel.Application" );
try {
// WARNING
// POSIX path [/] では ERROR になるかも
e.Workbooks.Open( "d:\\test.xls" );
// 別名保存
e.saveAs("d:\\new.xls" );
}
finally {
// Process が残るので 必ず 削除
e.quit();
}
■ 数学(Math)
DESC
算術計算をするには Math モジュールを利用する。
Static class のため instance は作成できないので、class Method として使う
■ Math
// 11
Math.ceil( 10.5 );
Math.PI;
// 2
Math.floor( 2.2 );
Math.pow( 2, 2 );
// random [0 1)
Math.random();
// 1.2
Math.abs( -1.2 );
// 小数点を四捨五入する
// 4
Math.round( 4.4 )
// 5
Math.round( 4.5 )
var length = Math.sqrt((x * x) + (y * y));
■ Network
ActiveSheet.Shapes.AddPicture
var net = CreateObject("WScript.Network" )
WScript.Echo net.ComputerName ' コンピュータ名
WScript.Echo net.UserDomain ' 参加中のドメイン名
WScript.Echo net.UserName ' ドメインに入ったときのユーザー名
■ httpclient
XMLHTTP COMコンポーネントを利用することで, HTMLデータの取得ができる。
以下のコマンドで自分の環境にあるか確認できる。
{
var o = new ActiveXObject("MSXML2.XMLHTTP" );
o.Open( "GET" , "http://www.google.co.jp" , false );
o.Send();
WScript.echo( o.responseText );
}
■ Debug(デバッグ)
// ブレークポイントをかける
debugger;
jscript をコンパイルして実行可能ファイルをつくる
C:\Windows\Microsoft.NET\Framework\v4.0.30319\jsc test.js
■ 基本的なこと
DESC
Browser が解釈して実行する Script 言語
REF
■ Interpreter.の流れ
// 上から順番に評価するらしい
//
eval( fs.OpenTextFile("util.js" , 1).ReadAll() );
// ここは完全に シンボルエラー . だけど↑まで実行されてしまう
// eval しているから, global scope に 処理がかかれていると, 実行される
//
//
foobar; // < - ここまで Interpreter がきて処理がとまる
{
// ["] は quot として扱われる
cmd> arg.js "aaa bbb" "ccc"
// [\] は意味がない ?
var oArgs = WScript.Arguments;
for ( var i=0; i< oArgs.length; i++ )
{
var arg = oArgs.Unnamed(i);
WScript.echo( arg );
}
// 関数にわたす
main( msg );
}
WARNING
Opera で利用するときは ActiveXObject が利用できないかも.
Opera > Javascript Option > Error Console : ON
■ CScript.WScript
Interpreter 本体
// [wscript.exe ] が実は省略されているだけ
sh.Run( "d:/test.js" , 1, true );
// これと同じ
sh.Run( "wscript.exe d:/test.js" , 1, true );
■ DOM
■ DOM.とは
DESC
DOM は Document Object Model の略
HTML や XML で記述された各要素を取り扱うための標準インタフェースとして定義され
各言語からアクセスできる。
WARNING
これはブラウザがホストとして実行した時に扱えるオブジェクトであり
wscript, cscript の扱う対象ではない。
■ とりあえず使ってみる
DESC
HTML の各要素は Node として階層構造をもつので,
その参照をとって各操作をすることで, Document の内容を動的に制御する
< script type="text/javascript" >
< !--
function func() {
// < img> タグをつくる
var oImg = document.createElement('img');
// Attribute を指定する
oImg.setAttribute("src" , "icon.gif" );
// setAttribute の代わりに直接 Property を指定する
oImg.src = "icon.gif" ;
// 子供に指定する
// Node は id で検索できる
var oDiv = document.getElementById("test" );
oDiv.appendChild( oImg );
}
// -->
< /script>
< !-- OK をおすと 画像がでます -->
< div id="test" >< /div>
< input type="button" value="OK " onclick="func()" >
■ Object.の.property.をしらべる
POINT
Node を操作するには, Node の Property, Method を知る必要がある
JavaScript の for - in を利用すれば Property, Method 一覧を取得できる
コールバックなども Property として存在する。
// Property を d:/prop.txt へ出力
// IE で動作することを確認
< div id="test" >test< /div>
< script type="text/javascript" >
// for 文で Object の property 名を取得する
var o = document.getElementById("test" );
var fs = new ActiveXObject("Scripting.FileSystemObject" );
var fp = fs.OpenTextFile("d:/prop.txt" , 2, true );
var s;
for ( s in o ) {
fp.WriteLine( s );
}
fp.Close();
< /script>
■ Form
つくるには < form> の子に配置して name でたどる
< script>
function test()
{
alert("ボタンを押した" );
}
< /script>
< form name="test" >
< button onClick="test()" >
< /form>
■ Form.を利用して簡単な足し算をしてみる
A [ ]
B [ ] [=]
結果[ ]
< script type="text/javascript" >
< !--
function func() {
var a = parseFloat(document.F1.T1.value);
var b = parseFloat(document.F1.T2.value);
document.F1.T3.value = a + b;
}
// -->
< /script>
< form name="F1" action="#" >
< input type="text" name="T1" >
< input type="text" name="T2" >
< input type="button" value="=" onclick="func()" >
< input type="text" name="T3" >
< /form>
POINT
form の値をとるには document.F1.T1.value といった階層をたどれば OK
form に名前( ID )をつけておくこと
var xx = parseFloat(document.F1.T1.value);
■ Form.におこる.Event.をフックする
↑ですでに [ Button を押したとき ] といった Event を Hook する
* 他にもいろいろ
SYNTAX
window.document.form.handleEvent( Form 属性 )
■ Object
■ Node.Object
POINT
オブジェクト志向なので, 各ノードはクラス階層をもつ。
各ノードは階層構造をもち, 名前, id などの共通の属性をもつ
// 階層を参照する
element.childNodes ( 自分の直下の子供のリスト )
element.parentNode
element.firstChild
element.lastChild
element.previousSibling
element.nextSibling
WARNING
プロパティとしてアクセスすること。
■ window.Object
POINT
階層の最上位のノード
そのため省略をできる
POINT
子供には以下がいる
document、image、form、history、location
メソッド プロパティ
alert( msg ) アラーとメッセージの表示
blur ウィンドウを背面に移動させる。
clearInterval(timer) インターバルタイマーの解除
clearTimeout(timer) タイマーの解除
close ウィンドウを閉じる。
confirm(value) 確認ダイアログの表示
focus ウィンドウにフォーカスをあてる。
home ホームページへ移動
moveBy(x, y) x, y で移動量を指定してウィンドウを移動させる。
moveTo(x, y) x, y で座標を指定してウィンドウを移動させる。
open([url,] [name,] [option]) ウィンドウを開く
print 印刷
prompt(value) 文字入力形式のダイアログを開く。
resizeBy(x, y) x, y で移動量を指定してウィンドウサイズを変更
resizeTo(x, y) x, y で指定したサイズにウィンドウをリサイズ。
// スクロール
scrollBy(x, y) x, y で移動量を指定してページをスクロール。
scrollTo(x, y) 絶対値で指定した位置へスクロール ( x(左端), y(右下) )
setInterval(action, interval) 一定時間間隔に action をよびだす
setTimeout(action, time) 一定時間後に action をよびだす
stop 読み込み中止
// 現在のページを移動させる
window.location.href = "http://google.com" ;
// 登録する
< body>
< script>
setTimeout( function(){ setPosition() },500 );
// 2 秒ごとに起動する
setInterval( function(){ alert("call timer" ); },2000 );
< /script>
< /body>
WARNING
IE では 次のように指定すると handler が起動しなくなる
setInterval( moveDiv(), 2000 );
// 再度指定してもダメ
setInterval( function(){ moveDiv() }, 100 );
■ Document.Object
property
cookie
// ドキュメントの URL ( http://domain/foo/bar.htm )
// WARNING
// 参照だけで設定はできない. 設定する時は window.location.href を使う
URL
// Title
title
// body
body
// id で検索
var root = document.getElementById( "root" );
// 要素を作成( create )する
document.
function addElement() {
// tag 名を指定して作成する
var o = document.createElement('div');
o.id = "id" ;
o.innerHTML = "hoge" ;
o.style.backgroundColor = 'red';
var objBody = document.getElementsByTagName("body" ).item(0);
objBody.appendChild(element);
// body要素にdivエレメントを追加
}
■ document.getElementById(id)
DESC
id 属性で指定した名前で要素を参照します
oElement = document.getElementById("id1" );
function func2()
{
// id=imgA をとって
var img = document.getElementById( "imgA" );
alert( img.getAttribute("src" ) );
}
< body>
< img id="imgA" src="imgA.bmp" >
< input type="button" value="OK " onclick="func2()" >
< /body>
■ getElementsByTagName
DESC
tag名で検索する。
SYNTAX
Array getElementsByTagName( name )
// < ul> タグをすべて取得する。 Array Object がかえる。
var a = root.getElementsByTagName("ul" );
// 要素数 と 各要素
a.length;
a[0];
■ element.getElementsByName(name)
name 属性で指定した名前で要素リストを参照します
oElements = document.getElementsByName("namae" );
oElements = oElement.getElementsByName("namae" );
// < ul> をすべて取得
var a = root.getElementsByTagName("ul" );
function func4()
{
// id=imgB をとって
var img = document.getElementById( "imgB" );
alert( img.getAttribute("src" ) );
}
< body>
< img id="imgA" src="imgA.bmp" >
< input type="button" value="OK " onclick="func2()" >
< /body>
■ element.getElementsByName(name)
DESC
name 属性で指定した名前で要素リストを参照します
oElements = document.getElementsByName("namae" );
oElements = oElement.getElementsByName("namae" );
■ StyleSheet.を操作する
SYNTAX
obj.style.property
obj.className
DESC
DOM ( Script ) から StyleSheet を設定する。
POINT
property 名は StyleSheet 名と対応づいている
// css < -> DOM
font-size < -> fontSize
var o = document.getElementsById( "test" );
o.style.fontSize = "smaller" ;
o.style.display = "none" ;
class 全体を変更するには className プロパティを変更する。
o.className = "red" ;
o.className = "green" ;
■ Event
■ Scroll
DESC
Event Object を経由して, イベントがおきたときの各情報がとれる
(Context)
function getScrollPosition() {
var obj = new Object();
obj.x = document.documentElement.scrollLeft || document.body.scrollLeft;
obj.y = document.documentElement.scrollTop || document.body.scrollTop;
return obj;
}
■ agent.を取得
var isWin9X = (navigator.appVersion.toLowerCase().indexOf('windows 98')+1);
var isIE = (navigator.appName.toLowerCase().indexOf('internet explorer')+1?1:0);
var isOpera = (navigator.userAgent.toLowerCase().indexOf('opera')+1?1:0);
if (isOpera) isIE = false;
var isSafari = (navigator.appVersion.toLowerCase().indexOf('safari')+1?1:0);
■ onLoad
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
oldonload();
func();
}
}
< body onload="alert( 'Test' )" >
< /body>
■ mouse
■ onmousemove
WARNING
イベントオブジェクトの振る舞いはブラウザによって異なるので、
if文で処理を変える
REF
http://archiva.jp/web/javascript/get_mouse-position.html
// Event を hook する
function setPosition(){
target = document.getElementById('sampleform');
window.document.onmousemove = function(e){
target.onmouseX.value = getMousePosition(e).x;
target.onmouseY.value = getMousePosition(e).y;
}
}
// Mouse の位置を取得する関数
function getMousePosition(e)
{
var obj = new Object();
if(e) {
obj.x = e.pageX;
obj.y = e.pageY;
}
else {
obj.x = event.x + document.body.scrollLeft;
obj.y = event.y + document.body.scrollTop;
}
return obj;
}
■ onmouseout
■ onmouseover
DESC
マウスがオブジェクトの上に来たとき
< button onmouseover="alert(this)" > test < /button>
■ Focus
< input type=text value="test!" onFocus="alert('')" >
■ キーボードイベント
WARNING
3種類のイベントがある。
< input> の内容を反映するには onkeyup にフックすること。
■ OnKeyPress
DESC
Key が押している最中に, スクリプトがコールされる
OBJECT
< input type=text>
onkeydown…キーが押し下げられた時
onkeyup…キーを押した後、離された時
onkeypress…キーを押している最中
// false を返すことで Request がこなくなる ?
< input type="text" name="text1" OnKeyPress="if (event.keyCode == 13) {return false;}" >
// ページ自体にキーボードイベントをとるには document.OnKeyDown にフックする。
< head>
document.OnKeyDown = function() { alert( event.keyCode ); }
< /head>
■ timer
■ setInterval
DESC
一定間隔で処理を実行する
SYNTAX
window.setInterval( function, msec );
< body>
< script>
// 5秒毎に alert 実行
setInterval( function(){ "alert('test')" }, 3000 );
< /script>
< /body>
WARNING
// 第一引数は function 型かも
setInterval( "alert('test')" , 3000 );
setInterval( function(){ "alert('test')" }, 3000 );
< body>
< img id="img" >
< script>
// 一定時間ごとに, 絵をかえる
function func() {
var o = document.getElementById( "img" );
var n = Math.floor( 2 * Math.random() );
o.src = "test" + n + ".png" ;
}
setInterval( function(){ func(); }, 3000 );
< /script>
< /body>
■ Event.List
POINT
Event には, GUI ( button ) 固有の Event と Window ( これも GUI ) の Event がある
GUI 系の Event は button.onClick() など
// text area の scroll をえる
< textarea onscroll="test()" >
// onLoad は body に指定するらしい
< html>
< head>
< /head>
< body onload="alert('Hello!')" onunload="alert('See you!')" >
< p>Sample< /p>
< /body>
< /html>
■ object
POINT
各要素には 共通の property がある
< img id="test" >
// IMG
nodeName
tagName
// 1
nodeType
// test
id
var o = document.getElementById( "test" );
alert( "id = " + o.id + " nodeName = " + o.nodeName + " nodeType = " +
o.nodeType + " nodeValue = " + o.nodeValue + " tagName = " + o.tagName );
■ XML
■ DOM
< root>
< child name="A" >
< mago name="key" />
< /child>
< child name="B" />
< child name="C" />
< /root>
// XMLドキュメントをDOMで扱うためのオブジェクトを作る
doc = new ActiveXObject("Microsoft.XMLDOM" );
// 非同期でロードしない設定にする
doc.async = false;
// ロードする
doc.load("test.xml" );
// RootNode を取得する
root = doc.documentElement;
// ノード名を取得する
// "root"
print( root.nodeName );
// 子供ノードのリストを取得する
var a = root.childNodes;
for( var i=0; i< a.length; i++ ){
var n = a[i];
// アトリビュート値を名前から取得する
var s = n.getAttribute("name" );
// "A"
print( s );
}
■ クッキー(Cookie)
// 値の指定
document.cookie = "key1=value1;key2=value2;" ;
// 値の取得
var s = document.cookie;
// 有効期限つきで
document.cookie = "var1=value1; expires=Tue, 1-Jan-2030 00:00:00 GMT;" ;
var d = new Date;
d.setHours(d.getHours() + 1); // 有効期限を1時間後に設定
d = d.toGMTString(); //GMT形式の文字列に変換
document.cookie = "key=test;expires=" + d;
function getCookieValue( key ){
// すべての値が返るため、文字列を切り出す。
var s = document.cookie + ";" ;
var st = s.indexOf(key);
var e = s.indexOf("=" ,st);
var ep = s.indexOf(";" ,st);
return s.substring(e,ep);
}
■ DragDrop
HTML5 の File API を利用すると ローカルファイルをブラウザに DragDrop して任意の処理ができる。
ブラウザによって対応状況が異なる。
sample
d:/work/pro/htm/sample.htm
■ 標準入力.StdIn.StdOut
cscript をインタープリターとして実行すると stdin, stdout の入出力を利用できる。
var stdin = WScript.StdIn;
var stdout = WScript.StdOut;
while (!stdin.AtEndOfStream){
var str = stdin.ReadLine();
stdout.WriteLine("Line " + (stdin.Line - 1) + ": " + str);
}
コマンドプロンプトからパイプで渡す。
type test.txt | cscript /nologo test.js
REFERENCE cmd::type
■ printf
ないので次のようにする
function zeropad( n )
{
var s = String(n);
s = "0000" + s;
s = s.slice( -2 );
return s;
}
■ DATABASE.DB.データベース
接続先の ODBC ドライバをインストールすることで JScript から COM 経由でアクセスできる。
■ key.キー操作
{
var sh = WScript.CreateObject("WScript.Shell" );
sh.Run( "notepad.exe" );
WScript.Sleep( 1000 );
sh.SendKeys( "hello" );
}