見出し画像

はじめてのJScript+WSH その9 JScriptで自作関数

はじめに

JScriptの自作関数を作ります。

関数とは

今までの記事でも使ってきましたが、
WScript.echo()やarr.push()など、()があるものが関数です。 ※数学のf(x)と同じ考え方です。
今回はこれを自作するお話です。

引数と返り値

この用語を覚えてください。
数学のy = f(x)でいうと、xが引数、yが返り値です。

下記のコードでは、引数aと引数bを基に、a+bの値を返すaddNumberという関数を作りました。

var addNumber = function(a, b){
  return a + b
}

WScript.echo(addNumber(1,3)); // => 4

下記のコードでは引数aと引数bのうち大きい数値を返す関数です。

var compareNumber = function(a, b){
    if(a>=b){
        return a;
    }else{
        return b;
    }
}

WScript.echo(compareNumber(1,3)); // => 3

下記のコードではreturnをしない関数の例です。
上から読んでいき、1行目~3行目で関数を宣言(ここでは関数は動かない)
7行目で関数を呼び出して、2行目の処理が実行されるイメージです。

var printAddNumber = function(a, b){
    WScript.echo(a+b);     // => 4
}

var a = 1;
var b = 3;
printAddNumber(a, b);

ファイル入出力

下記の例えはreadFile関数とwriteFile関数を作成しました。
今後「ここは良しなにしてくれる場所」と考えればよいので、
「// テキストを読み込み コメントアウト"!"や空行を無視して出力する」以下の行を修正すればよくなります。

// 変数宣言
var input_filename = "input.txt";
var output_filename = "output.txt";

var input_commands = [];
var output_commands = [];


// ファイル読み込み
var readFile = function(filename){
    var arr = []
    var fs = new ActiveXObject( "Scripting.FileSystemObject" );
    var file = fs.OpenTextFile( filename, 1, true, fileopen_state );		//  ファイルを読み取り専用で開く
    while( !file.AtEndOfStream ){
        arr.push(file.ReadLine());
    }
    file.Close();  // ファイルを閉じる
    fs = null;	   // オブジェクトを初期化
    return arr;
}

// ファイル書き込み
var writeFile = function(arr, filename){
    var fileopen_state = 0; // 0:ASCII -1:Unicode -2:SystemDefault

    if(arr.length > 0){
        var fs = new ActiveXObject( "Scripting.FileSystemObject" );
        var file = fs.OpenTextFile( filename, 2, true, fileopen_state ); // 2:新規に書き込み 8:追記
        for(var i=0;i<arr.length;i++){
            file.WriteLine(arr[i]);
        }
        file.Close(); //  ファイルを閉じる
        fs = null;    //  オブジェクトを解放
    }
}




// テキストを読み込み コメントアウト"!"や空行を無視して出力する
// また、EOC (end of command)を見つけたらそこで処理を終わりにする

input_commands = readFile(input_filename);

for(var i = 0; i < input_commands.length; i++){
    if(input_commands[i].search(/^!/) > -1) continue;	            // 先頭が!なら行を無視
    if(input_commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
    if(input_commands[i].replace(/\s/g,"")=="EOC") break;         // EOCを見つけたらforを抜ける

    output_commands.push(input_commands[i]);
}

writeFile(output_commands, output_filename);

また、inputファイルとoutputファイルが複数ある場合、ファイル入出力の処理をreadFile()とwriteFile()のみ書けばよくなるため、編集が楽になります。

// 変数宣言
var input_filename_1 = "input_1.txt";
var output_filename_1 = "output_1.txt";
var input_filename_2 = "input_2.txt";
var output_filename_2 = "output_2.txt";

var input_commands = [];
var output_commands = [];


// ファイル読み込み
var readFile = function(filename){
    var arr = []
    var fs = new ActiveXObject( "Scripting.FileSystemObject" );
    var file = fs.OpenTextFile( filename, 1, true, fileopen_state );		//  ファイルを読み取り専用で開く
    while( !file.AtEndOfStream ){
        arr.push(file.ReadLine());
    }
    file.Close();  // ファイルを閉じる
    fs = null;	   // オブジェクトを初期化
    return arr;
}

// ファイル書き込み
var writeFile = function(arr, filename){
    var fileopen_state = 0; // 0:ASCII -1:Unicode -2:SystemDefault

    if(arr.length > 0){
        var fs = new ActiveXObject( "Scripting.FileSystemObject" );
        var file = fs.OpenTextFile( filename, 2, true, fileopen_state ); // 2:新規に書き込み 8:追記
        for(var i=0;i<arr.length;i++){
            file.WriteLine(arr[i]);
        }
        file.Close(); //  ファイルを閉じる
        fs = null;    //  オブジェクトを解放
    }
}




// テキストを読み込み コメントアウト"!"や空行を無視して出力する
// また、EOC (end of command)を見つけたらそこで処理を終わりにする

// 1ファイル目の処理
input_commands = readFile(input_filename_1);

for(var i = 0; i < input_commands.length; i++){
    if(input_commands[i].search(/^!/) > -1) continue;	            // 先頭が!なら行を無視
    if(input_commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
    if(input_commands[i].replace(/\s/g,"")=="EOC") break;         // EOCを見つけたらforを抜ける

    output_commands.push(input_commands[i]);
}

writeFile(output_commands, output_filename_1);


// 2ファイル目の処理
input_commands = readFile(input_filename_2);

for(var i = 0; i < input_commands.length; i++){
    if(input_commands[i].search(/^!/) > -1) continue;	            // 先頭が!なら行を無視
    if(input_commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
    if(input_commands[i].replace(/\s/g,"")=="EOC") break;         // EOCを見つけたらforを抜ける

    output_commands.push(input_commands[i]);
}

writeFile(output_commands, output_filename_2);

次の記事

前の記事


この記事が気に入ったらサポートをしてみませんか?