トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
JScript
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\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 ファイルの後に続ける すべての引数は 文字列型 として渡される
    cscript arg.js  1 2 3

    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 演算子は次の処理を実行する
   メンバを持たないオブジェクトを作成して、その参照を返す。
   次に作成したオブジェクトを this ポインタとしてコンストラクタ関数にわたしてコールする。
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 が評価するため )
  
  // comment 

  /* comment */

___

■ 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;    
      }

    }



    // 先に b というシンボルの宣言を処理するので, ここでは落ちない
    print (b);

    // この行まできて, "bbb" が代入
    var b = "bbb";

    // RET: bbb
    print( b );

    // ------------------------------------------------------

    // EEROR
    //    "bは宣言されていません"
    print (b);

    // この行まできて, "bbb" が代入
    b = "bbb";

    // RET: bbb
    print( b );

    // ------------------------------------------------------

    print (b);

    function() {

    // BlockScope はないので, "b" は Global Scope
    if (0) {
      var b = "bbb";
    }

    print ( b );

    // ------------------------------------------------------


    POINT
       宣言 と 代入は別
       宣言されていれば, Symbol がない といわれない
       代入されるのは, Code の実行順
      


変数および定数をすべて検出した後、関数内のコードが実行される ローカル定数の値は、定数の宣言ステートメントが実行されるまで未定義です 関数で変数への代入が実行されるまでは、変数も未定義です 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 設定

    ツール > インターネットオプション > [ セキュリティ ] 
           > イントラネット > [ レベルのカスタマイズ ]

    
    安全だとマークされていないActiveXの実行」の初期化と実行
      
       ダイアログを表示     // ON
       無効にする
       有効にする           // こらでもOK

WARNING Security 上非常に危険なので, OFF にすべき
    var sh = new ActiveXObect( "WScript.Shell" );

    // Commandline を記述することで, 任意の Program を実行
    sh.run( "notepad" );
___

■ ActiveXObject.とは

DESC 機能単位にまとまったプログラムの部品 Script は各機能の 糊付け の役割をはたす 自作の ActiveXObject も作成でき Script 内から利用できる
___

■ こんなことができる

よくもわるくもこんなことできる
     Internet 経由で, 遠隔マシンの操作ができる
     ActiveWindow を最大化することができる.
     ActiveX に準拠した 4 つのスクリプト言語という言い方があるらしい
___

■ 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版)の実行の可否を決める

   [ ローカルにあるActiveXコンポーネントを実行できるかを決定する ]
   [ スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行 ]

「アクティブ スクリプト」  IEではこれらセキュリティの設定を 上から順に Security が厳しい

   「制限付きサイト」

    // 一般のWebサーバ
   「インターネット」

   // イントラネットのサーバ用
   「イントラネット」

   // ユーザが明示的に指定した信頼できるサイトと信頼できないサイト用の設定
   「信頼済みサイト」 : *.xxx.xxx とか追加されている

という四つのゾーンに分けて決めている [レベルのカスタマイズ] : ↑の 4 カテゴリを詳細設定するときに使う インターネット 上にあるWebサイトをアクセスするとき 信頼済み/制限付きサイトに登録してないなら「インターネット」の部類になる IEのデフォルトはこれ

   インターネット」ゾーンで「アクティブ スクリプト」は許可する
   安全だとマークされていないActiveXの実行」は許可しない

デフォルトでは ローカルの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データの取得ができる。 以下のコマンドで自分の環境にあるか確認できる。
    bash> which  msxml3.dll
{
  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 プロパティとしてアクセスすること。
    var a = obj.childNodes;
___

■ 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" );
  }


NINJAIDX 1