スコープと関数(GASの学習_09)

皆さんこんにちは。HiroCom777です。このたびノンプロ研のGAS(Google Apps Script)中級講座を受講することと相成りました。振り返ってみると、初級を受講したのが2023年の12月でした。普段ほとんどGASを使わないのですが、ノンプロ研技術同人誌のお手伝いでGASを理解する必要が出てきたため学んでいます。前回のブログに記録を残しています。

hirocom777.hatenadiary.org

今回、VBA、Pythonに続いてノンプロ研で学んでいるプログラミング中級講座で最後の受講となります。

中級の知識をマスターすることで、他言語の知識と相互に補強していきたいと考えています。

どうして受講を決意したのか

今回、VBA、Pythonに続いてノンプロ研で学んでいるプログラミング中級講座で最後の受講となります。中級の知識をマスターすることで、他言語の知識と相互に補強していきたいと考えています。

GAS中級講座

今回受講する講座は、GASの応用を学ぶ中級講座。カリキュラムは全部で5つ(+卒業ライトニングトーク大会)です。

  1. スコープと関数
  2. クラス・ライブラリ
  3. 組み込みオブジェクト
  4. Utility Services 1
  5. Utility Services 2

2週間に1つずつ学んでいきます。

スコープと関数

今回はスコープと関数です。

スコープ

GASのスクリプトには、「グローバル領域」と「ローカル領域」があります。グローバル領域は関数に含まれない領域、ローカル領域は関数内の領域です。以下のようになります。

// グローバル領域

function 関数() {
  // ローカル領域
}

関数を実行すると、先にグローバル領域のコードがすべて実行されます(別ファイルでも実行されます)。続いて呼び出された関数が実行されます。コード全体がわかりづらくなるので、グローバル領域にむやみにコードを書いてはいけません。

スコープとは、変数・定数・関数などを使用できる範囲のことです。3つのスコープがあります。

  • ブロックスコープ
    現在の{}で囲まれたブロック内

  • ローカルスコープ
    宣言した関数内

  • グローバルスコープ
    プロジェクト全体

ブロックとは、{}で囲って処理をグループ化したものです。{}で囲った任意の処理や、分岐、反復などの処理を指します。ブロック化することでスコープを閉じることができ、変数・定数などの命名・管理が楽になります。

スコープ内で宣言した変数・定数(varで宣言したものを除く)はスコープ外では使用できません。スコープの外で宣言した変数・定数は、スコープ内でも使用できますが、上下のスコープで名前がバッティングしたときは、より小さいスコープが優先されます。また、varは通常使用することは推奨されません。varはブロックスコープを持たず、関数スコープで管理されるため意図しない参照が発生しやすいからです。

関数

初級講座でも関数について学びました。ここでは、初級で扱わなかった内容について見てきましょう。

メソッド

関数にもメソッドを定義できます。以下は税込みの金額を返すメソッドを関数内に記述した例です。

function myFunction() {

  const tax = {
    taxRate: 0.1,

    getTaxInclude(price) {
      return Math.floor(price * (1 + this.taxRate));
    }
  };

  console.log(tax.getTaxInclude(100));
  // 110
}

プライベート関数

関数名がアンダースコア「_」で終わる関数はプロジェクト外からは呼び出せません。プロジェクトのプルダウンリストにも出てきません。

function 関数名_(仮引数1, 仮引数2,...) {
  //処理
  return 戻り値;
} 

引数

関数は呼び出し時に指定した引数が、仮引数に渡されます。引数と仮引数の数が合わない場合の挙動は以下のようになります。

  • 数が合わなくても動く
  • 引数の数 > 仮引数の数: 余った引数は捨てられる
  • 引数の数 < 仮引数の数: 余った仮引数にはundefinedが返される

また、指定されなかった場合にデフォルト値を指定できます。これを「デフォルト引数」と言います。

function 関数名(,,, 仮引数[ = デフォルト値]) {
  //処理
  return 戻り値;
} 

デフォルト引数には、以下のルールがあります。

  • 値が未指定(undefined)の時に適用される
  • デフォルト引数は任意の位置に定義できるが、可読性のため後ろに配置することが一般的
  • 左側で定義された引数は、その後のデフォルト引数で利用できる

関数が不定数の引数を配列として受け入れることができます。これを「残余引数」といいます。

function 関数名(,,, ...仮引数x) {
  //処理
  return 戻り値;
} 

残余引数には、以下のルールがあります。

  • 関数定義は、残余引数を1つしか持つことができない
  • 残余引数は関数定義において最後の引数でなければならない
  • 残余引数の後に末尾カンマは許可されない
  • 残余引数はデフォルト値を持つことができない

値渡し、参照の値渡し

仮引数に渡されたデータは、データの種類によって渡し方が異なります。

  • プリミティブ
    プリミティブとはデータを処理する上での最小単位、基本データ型のことです。数値、文字列、ブール値等が該当します。この場合、引数の値が仮引数に複製されて関数内では複製された値が使用されます。これを「値渡し」と言います。

  • オブジェクト
    オブジェクトは参照先が渡されるため、関数内で内容を変更すると呼び出し元にも影響します。これを「参照の値渡し」と言います。

値渡しでは関数内で仮引数を変更しても、引数自体には影響ありません。

function myFunction() {
  const coFunction = (y1, y2) => {
    y1 += 1;
    y2[0] += 1;
  };

  const x1 = 10, x2 = [10];
  coFunction(x1, x2);
  console.log(`x1:${x1},x2:${x2}`);
  // x1:10,x2:11
}

この例では、x1(数値型)は値渡しのため関数内の処理は影響ありません。対してx2(配列)はオブジェクトなので参照の値渡しになります。関数内の処理によってx2の値も変わります。

次回はクラス・ライブラリ

いかがでしょうか。今回はスコープと関数について見ていきました。次回はクラス・ライブラリです。お楽しみに!!

GAS関連記事まとめ - HiroCom777の学習記録

SQLite3_2(PowerShell_48)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、データベース「SQLite3」をPowerShellで使う方法を学びました。PowerShellはコマンドラインシェルであるため、SQLite3の実行ファイル(sqlite3.exe)をコマンドとして実行できます。

今回もSQLite3です。SQLite3の出力結果を変数やパイプ処理で受け取って活用してみましょう。いくつか注意点があります。

パイプライン経由の処理

SQLite3で処理した出力をパイプライン経由で受け取れると、PowerShellのオブジェクトとして扱えるようになるため、集計や検索などの処理を簡単に行えます。データベースファイル「Test.db」の内容は以下のようになっています。テーブル名は「employees」です。

id name department salary hire_date manager_id
1 山田 太郎 営業 300000 2021-04-01
2 鈴木 花子 開発 350000 2022-10-15 1
3 佐藤 次郎 営業 280000 2023-04-01 1
4 高橋 健太 開発 400000 2020-01-20 1
5 田中 美穂 総務 250000 2024-05-01

このファイルをパイプライン経由で、CSV形式の出力からPowerShellオブジェクトに変換します。

PS > $a = sqlite3 Test.db ".headers on" ".mode csv" "SELECT * FROM employees;" | ConvertFrom-Csv
PS > $a[0]

id         : 1
name       : 螻ア逕ー 螟ェ驛・,蝟カ讌ュ"
department : 300000
salary     : 2021-04-01
hire_date  : 
manager_id : 

なんだか表示が文字化けしていて、列の対応関係も崩れています。PowerShellとSQLiteで使用している文字エンコードが一致していないためです。文字コードの確認や設定には「[Console]::OutputEncoding」を使います。PowerShellからコンソールへ出力する文字エンコードを設定・取得するためのプロパティです。

PS > [Console]::OutputEncoding

EncodingName      : Japanese (Shift-JIS)
WebName           : shift_jis
...(以下略)

shift_jisに設定されています。sqlite3の出力はUTF-8であるため、こちらに合わせる必要があります。

PS > [Console]::OutputEncoding = [Text.Encoding]::GetEncoding(65001)
PS > [Console]::OutputEncoding                                      

Preamble          : 
BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
...(以下略)

utf-8に設定されました。

また、環境変数「$OutputEncoding」も同様に設定しておきましょう。PowerShellが外部プログラムとテキストデータ(標準出力など)のやり取りを行う際に使用する、文字エンコードを指定する自動変数です。

PS > $OutputEncoding = [Text.Encoding]::GetEncoding(65001)

この状態で、再度実行してみましょう。

PS > $a =  sqlite3 Test.db ".headers on" ".mode csv" "SELECT * FROM employees;" | ConvertFrom-Csv
PS > $a[0]

id         : 1
name       : 山田 太郎
department : 営業
salary     : 300000
hire_date  : 2021-04-01
manager_id : 

文字化けが直り、表示位置も正常になりました。shift_jisに戻すには、以下のように入力します。

PS > [Console]::OutputEncoding = [Text.Encoding]::GetEncoding(932)
PS > $OutputEncoding = [Text.Encoding]::GetEncoding(932)
PS > [Console]::OutputEncoding                                      

EncodingName      : Japanese (Shift-JIS)
WebName           : shift_jis
...(以下略)

オブジェクトの活用

こうしてSQLiteの結果をPowerShellオブジェクト化すると、他のコマンドレットと併用してデータ処理ができます。

PS > $a = sqlite3 Test.db ".headers on" ".mode csv" "SELECT * FROM employees;" | ConvertFrom-Csv
PS > $a | Where-Object salary -gt 350000

id         : 4
name       : 高橋 健太
department : 開発
salary     : 400000
hire_date  : 2020-01-20
manager_id : 1

設定を固定する

上にご紹介した設定は、現在のPowerShellプロセスだけに有効な設定です。再起動すると規定値に戻ってしまいます。設定を固定するには、PowerShellのプロファイルに以下の設定を記述します。プロファイルの場所は自動変数「$PROFILE」で確認できます。

$OutputEncoding = [Text.Encoding]::GetEncoding(65001)
[Console]::OutputEncoding = [Text.Encoding]::GetEncoding(65001)

次回は集計

いかがでしょうか。これで、SQLite3をスクリプトファイルにも適用できます。次回は集計です。PowerShellには集計に便利なコマンドレットが用意されています。お楽しみに!!

PowerShell基礎の連載はコチラから

SQLite3_1(PowerShell_47)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、正規表現の応用方法について学びました。比較演算子でも正規表現が使えます。

今回はデータベースです。PowerShellでデータベースソフト「SQLite3」を使ってみましょう。PowerShellはコマンドラインシェルであるため、SQLite3の実行ファイル(sqlite3.exe)をコマンドとして実行できます。PowerShellからSQLiteを使用すると、スクリプトを呼び出して処理を行うケースも多く見られます。

ここでは、正常にSQLiteがインストールされていることを前提にしています。

PowerShellからの起動

それでは実際にSQLiteを起動してみましょう。

PS > sqlite3
SQLite version 3.47.2 2024-12-07 20:39:59
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> 

このように、問題なく起動できることを確認してください。「.exit」または「.quit」で抜けることができます。上手く起動しない場合には、インストール状態やPath環境の設定状況を確認してみてください。

PowerShellから1行で実行

PowerShellから1行のコマンドでSQLiteを実行できます。以下のように記述します。

sqlite3 データベース名 SQL文

簡単な例を見てみましょう。SQlite3のデータベースファイル「Test.db」を見てみましょう。

PS > sqlite3 Test.db -cmd ".headers ON" "SELECT * FROM employees"
id|name|department|salary|hire_date|manager_id
1|山田 太郎|営業|300000|2021-04-01|
2|鈴木 花子|開発|350000|2022-10-15|1
3|佐藤 次郎|営業|280000|2023-04-01|1
4|高橋 健太|開発|400000|2020-01-20|1
5|田中 美穂|総務|250000|2024-05-01|

Test.dbの内容が表示されました。「-cmd ".headers ON"」は、ヘッダー付きの指定です。

CSVファイルへの変換

上で使用したデータベースファイルをCSVファイルに変換してみましょう。

PS > sqlite3 Test.db -cmd ".headers on" ".mode csv" ".once Test.csv" "SELECT * FROM employees;"

「Test.csv」の内容は、以下のようになりました。

id,name,department,salary,hire_date,manager_id
1,"山田 太郎","営業",300000,2021-04-01,
2,"鈴木 花子","開発",350000,2022-10-15,1
3,"佐藤 次郎","営業",280000,2023-04-01,1
4,"高橋 健太","開発",400000,2020-01-20,1
5,"田中 美穂","総務",250000,2024-05-01,

作成したCSVファイルをデータベースファイルに変換することもできます。

PS > sqlite3 Test_2.db -cmd ".mode csv" ".import Test.csv employees"

一時的にCSVファイルを読み込むには、メモリ上(:memory:)に一時的なデータベースを作成して実行します。

PS > sqlite3 :memory: -cmd ".headers on" ".mode csv" ".import Test.csv employees" "SELECT * FROM employees;"
id,name,department,salary,hire_date,manager_id
1,"山田 太郎","営業",300000,2021-04-01,""
2,"鈴木 花子","開発",350000,2022-10-15,1
3,"佐藤 次郎","営業",280000,2023-04-01,1
4,"高橋 健太","開発",400000,2020-01-20,1
5,"田中 美穂","総務",250000,2024-05-01,""

次回もSQlite

いかがでしょうか。今回ご紹介した内容は、スクリプトファイルにも適用できます。さて、ここまでくるとSQliteの出力結果を変数やパイプ処理で受け取って活用してみたいですよね。でも、それにはちょっとしたコツがあるのです。次回はその方法をご紹介します。お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから

正規表現_3(PowerShell_46)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、正規表現の応用方法について学びました。他のコマンドレットと併用することで、さまざまな応用方法が考えられます。

今回も正規表現です。比較演算子について見ていきましょう。

-matchによる検索

PowerShellでは比較演算子「-match」を使って正規表現による検索ができます。以下のように記述します。

検索対象文字列 -match 検索文字列

結果はTrue/Falseで返ってきます。

PS > 'ABCDE' -match 'ABC'                                                     
True

また、マッチした場合は、自動変数「$Matches」に格納されます。

PS > $Matches

Name                           Value
----                           -----
0                              ABC

PS > $Matches[0]           
ABC

\$Matchesはハッシュテーブルの形をとります。

PS > $Matches.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object

配列からの検索

配列からの検索も可能です。この場合、結果はマッチした文字列の配列となります。

PS > "ABC","abc" -match 'ABC'           
ABC
abc

キャプチャの使用

正規表現には「キャプチャ」という、マッチした文字列を一時的に記憶する機能があります。検索文字列のうち、記憶したい部分を「()」で囲むことで使用できます。

PS > 'ABCDE' -match '(AB)C'
True
PS > $Matches

Name                           Value
----                           -----
1                              AB
0                              ABC

PS > $Matches[0]
ABC
PS > $Matches[1]
AB

応用例を見てみましょう。「YYYY-MM-DD」の形で日付を表す文字列から、年、月、日をそれぞれ取り出してみます。

PS > '2026-05-22' -match '(\d{4})-(\d{2})-(\d{2})'
True
PS > $Matches[0]
2026-05-22
PS > $Matches[1]                                  
2026
PS > $Matches[2]                                  
05
PS > $Matches[3] 
22
PS > $Matches

Name                           Value
----                           -----
3                              22
2                              05
1                              2026
0                              2026-05-22

検索文字列中の「\d」は半角数字1文字を表し、「{数値}」でその繰り返し回数を指定します。これで年、月、日を切り離して取り出すことができました。

-replaceによる置換

比較演算子「-replace」を使うと、正規表現を利用した文字列置換ができます。以下のように記述します。

置換対象文字列 -replace 検索文字列, 置換文字列

結果は置換処理した文字列で返ってきます。

PS > '2026-05-22' -replace '(\d{4})-(\d{2})-(\d{2})', '$0 -> $1 年 $2 月 $3 日'
2026-05-22 -> 2026 年 05 月 22 日

置換文字列中の「$数値」には、マッチした文字列全体と各キャプチャの内容が反映されます。

その他の比較演算子

  • -notmatch
    -notmatchは、-matchと逆の結果を返します。マッチした場合はFalseとなり、$Matchesにも結果が格納されます。
  PS > '2026-05-22' -notmatch '(\d{4})-(\d{2})-(\d{2})' 
  False
  PS > $Matches

  Name                           Value
  ----                           -----
  3                              22
  2                              05
  1                              2026
  0                              2026-05-22
  • -cmatch -creplace
    -match、-replaceは、アルファベットの大文字/小文字を区別しません。区別するには -cmatch、-creplaceを使用します。
  PS > "abc" -match 'ABC'      
  True
  PS > "abc" -cmatch 'ABC'
  False
  • -like -clike
    -likeを使用すると、正規表現ではなくパターンマッチを使用して検索できます。「?」(任意の一文字)、「*」(0個以上の任意の文字)、「[a-b]」(範囲内の任意の文字)、「[ab]」(文字セット内の任意の文字)が使用できます。 パターンマッチで対応可能な場合は、こちらの方が処理がシンプルで高速になる場合があります。-clikeはアルファベットの大文字/小文字を区別します。
  PS > 'ABC123' -like 'ABC*'
  True

次回はデータベース

いかがでしょうか。比較演算子を用いた正規表現は、テキスト処理の大きな武器になります。次回はデータベースです。PowerShellでデータベースソフト「SQLite3」を使ってみましょう。お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから

正規表現_2(PowerShell_45)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、正規表現について学びました。PowerShellでは標準で正規表現が使えます。

今回も正規表現です。応用方法について見ていきましょう。

パイプライン経由の使用

前回は、コマンドレット「Select-String」を使用してテキストファイルから検索文字列を指定して検索結果を求めてきました。他にもパイプライン経由でデータを渡して検索する方法があります。以下は簡単な例です。

PS > @("ABC","DEF","abc","GHI") | Select-String -Pattern 'ABC'

ABC
abc

この例では、文字列で構成された配列をパイプライン経由で検索しています。

コマンドレットの出力結果を検索

Select-Stringは、他のコマンドレットの出力結果をパイプライン経由で取り込んで、検索を実行できます。

PS > Get-Process | Select-String -Pattern 'pwsh'

System.Diagnostics.Process (pwsh)

コマンドレット「Get-Process」は、PC上で実行中のプロセス一覧を取得します。Select-Stringは、パイプラインから渡された内容を文字列として検索します。この例では、取得したプロセス一覧から「pwsh」が含まれるものを検索して表示しています。

再帰的に検索

コマンドレット「Get-ChildItem」は、指定されたパスのファイル、フォルダーの一覧を出力します。パラメーター「-Filter」を使用することで効率的にファイルを絞り込み、「-Recurse」を使用することでその下のフォルダー内のファイルを再帰的に検索できます。

PS > Get-ChildItem -Recurse -Filter *.log |
    Select-String -Pattern 'ERROR'

ログ監視

コマンドレット「Get-Content」のパラメーター「-Wait」は、ファイルの内容を監視しながらリアルタイムに表示できます。ログファイルの監視に使用されます。

Get-Content app.log -Wait |
    Select-String -Pattern 'ERROR'

app.logに新しい行が追加されるたび、自動的に画面へ表示します。

MatchInfoオブジェクト

Select-Stringの検索結果は、MatchInfoオブジェクトの形で出力されます。

PS > $a = @("ABC","DEF","GHI") | Select-String -Pattern 'ABC'      
PS > $a.GetType()                                            

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    MatchInfo                                System.Object

検索結果が複数の場合には、MatchInfoオブジェクトの配列が出力されます。 MatchInfoオブジェクトの主なプロパティは、以下の通りです。

Line: 一致した行のテキスト全体 IgnoreCase: 大文字・小文字を無視したか(True/False) LineNumber: 一致した行の行番号。パイプライン経由の場合は入力順 Filename: 一致したファイル名。パイプライン経由の場合は「InputStream」となる Path: 一致したファイルのフルパス。パイプライン経由の場合は「InputStream」となる Pattern: マッチに使用した正規表現パターン Matches: 一致した文字列のMatchオブジェクト(正規表現のグループなど詳細情報) Context: 一致行の前後の行(パラメーターContextを使用した場合)

一致した文字列の情報は、Matchオブジェクトの各プロパティで取得します。主要プロパティは、以下になります。

Value: 一致した文字列 Index: 開始位置 Length: 長さ Success: 成功判定(True/False)

以下の例は、MatchオブジェクトのValueプロパティを使用して、検索した結果から重複した値を取り除いた結果を取得します。

Select-String *.txt -Pattern 'ABC' |
    ForEach-Object {
        $_.Matches.Value
    } |
    Sort-Object -Unique

コマンドレット「Sort-Object」のパラメーター「-Unique」を使用すると、並べ替えの際に重複した内容を取り除いた結果を返します。

次回も正規表現

いかがでしょうか。PowerShellでは他のコマンドレットと併用することで、色々な応用方法が考えられます。次回も正規表現です。その他の注意事項についても見ていきましょう。お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから

正規表現_1(PowerShell_44)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、Mathクラスについて学びました。数学などで出会う、さまざまな関数や数値処理が使えます。

今回は正規表現です。PowerShellでは標準で正規表現が使えます。

正規表現

正規表現(Regular Expression)とは、文字列のパターンを、特殊な記号を用いて1つの文字列で表現する方法です。メールアドレス、電話番号、郵便番号など、特定のルールを持つテキストの検索、抽出、置換を効率的に行うことができます。ここでは、正規表現の詳しい記法については扱いません。

コマンドレット「Select-String」を使用すると、PowerShellで正規表現を使うことができます。以下のように記述します。

Select-String -Path ファイル名 -Pattern 検索文字列

なお、検索文字列を直接指定する場合にはシングルクォーテーション「'」で囲みましょう。ダブルクォーテーション「"」も使用できますが、変数展開やエスケープ処理が行われるため、正規表現では意図しない動作になる場合があります。

指定したファイルから、検索パターンに一致した行を返します。実際の使用例を見てみましょう。以下のテキストファイル「Test.txt」を対象にします。

abc123
ABC456
def789
ghi.000
jkl999

実行してみると、以下の結果となりました。

PS >Select-String -Path Test.Txt -Pattern 'ABC'

Test.Txt:1:abc123
Test.Txt:2:ABC456

結果は、

ファイル名:行番号:検索結果

の形で表示されます。

Select-Stringのパラメーターのうち、代表的なものをご紹介します。

  • -Path
    検索対象のファイルを指定します。カンマ区切りで複数のファイルを指定できます。また、ワイルドカードを使用して指定できます。

    • -Exclude
      -Pathパラメーターで指定したファイル群から、指定したファイルを除外します。指定方法は、-Pathパラメーターと同じです。
    • -Include
      -Pathパラメーターで指定したファイル群から、指定したファイルに絞り込みます。指定方法は、-Pathパラメーターと同じです。
  • -Pattern
    検索するテキストを指定します。配列を使用して指定することもできます。

  • -CaseSensitive
    大文字小文字を区別して検索します。

  PS >Select-String -Path Test.Txt -Pattern 'ABC' -CaseSensitive

  Test.Txt:2:ABC456
  • -NotMatch
    検索結果で一致しない行を表示します。
  PS >Select-String -Path Test.Txt -Pattern 'ABC' -NotMatch

  Test.Txt:3:def789
  Test.Txt:4:ghi.000
  Test.Txt:5:jkl999
  • -Context
    行数を指定して、検索結果とあわせて前後行を表示します。前行、後行をカンマ区切りで別々に指定できます。
  PS >Select-String -Path Test.Txt -Pattern 'ABC456' -Context 1,2

    Test.Txt:1:abc123
  > Test.Txt:2:ABC456
    Test.Txt:3:def789
    Test.Txt:4:ghi.000

マッチしている行には、先頭に「>」が付きます。

  • -SimpleMatch
    正規表現ではなく単純文字列検索を実行します。正規表現には、特別な意味を持つ「メタキャラクター」があります。メタキャラクター自体を検索対象とするには、直前にエスケープ文字「\」を使用してエスケープ処理をしなければなりません。これを回避するには、パラメーター「-SimpleMatch」を使用して、単純な文字列検索に変更します。

    以下は、正規表現のメタキャラクターである「.」自体を検索した例です。

  PS >Select-String -Path Test.txt -Pattern '.' -SimpleMatch

  Test.txt:4:ghi.000

-SimpleMatchを指定しないと以下のようになります。

  PS >Select-String -Path Test.txt -Pattern '.'

  Test.txt:1:abc123
  Test.txt:2:ABC456
  Test.txt:3:def789
  Test.txt:4:ghi.000
  Test.txt:5:jkl999

次回も正規表現

いかがでしょうか。正規表現を使用すると、複雑な文字列検索や置換を効率良く実行できます。次回も正規表現です。正規表現の応用方法について見ていきましょう。お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから

Mathクラス(PowerShell_43)

この連載では、PowerShellについて学んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、日付と時間の取り扱いでTimeSpanオブジェクトについて学びました。TimeSpanオブジェクトは、日時の間隔を表します。

今回はMathクラスです。数学などで出会う、色々な関数や数値処理が使えます。

Mathクラス

Mathクラスは、三角関数や対数関数、およびその他の一般的な数学関数・定数を扱う静的メソッドを提供します。以下のように呼び出します。

[Math]::関数

以下は代表的なメソッドです。

数値処理

関数名 機能 使用例 -> 返り値 備考
Round 四捨五入 [Math]::Round(1.5) -> 2 桁数指定も可能
Ceiling 切り上げ [Math]::Ceiling(1.1) -> 2
Floor 切り捨て [Math]::Floor(1.9) -> 1
Max 最大 [Math]::Max(10, 20) -> 20
Min 最小 [Math]::Min(10, 20) -> 10
Sign 符号 [Math]::Sign(-10) -> -1 正の値なら1、負の値なら-1、0なら0を返す

数学関数

関数名 機能 使用例 -> 返り値 備考
Abs 絶対値 [Math]::Abs(-10) -> 10 負の値を正の値に変換
Pow 累乗 [Math]::Pow(2, 3) -> 8 2の3乗
Sqrt 平方根 [Math]::Sqrt(9) -> 3 ルート計算
Exp 指数 [Math]::Exp(1) -> 2.71828182845905 eの1乗
Log 自然対数 [Math]::Log(10) -> 2.30258509299405 底がeの対数
Log10 常用対数 [Math]::Log10(100) -> 2 底が10の対数
Sin サイン [Math]::Sin(0) -> 0 角度はラジアン指定
Cos コサイン [Math]::Cos(0) -> 1 角度はラジアン指定
Tan タンジェント [Math]::Tan(0) -> 0 角度はラジアン指定
Asin アークサイン [Math]::Asin(1) -> 1.5707963267949 逆三角関数
Acos アークコサイン [Math]::Acos(1) -> 0 逆三角関数
Atan アークタンジェント [Math]::Atan(1) -> 0.785398163397448 逆三角関数
Atan2 座標角度 [Math]::Atan2(1, 1) -> 0.785398163397448 X,Y座標から角度を取得
Truncate 小数切り捨て [Math]::Truncate(1.9) -> 1 小数点以下のみ切り捨て
Clamp 範囲制限 [Math]::Clamp(15, 0, 10) -> 10 指定範囲内に収める
BigMul 大きな乗算 [Math]::BigMul(100000, 100000) -> 10000000000 Int64で返す
DivRem 商と余り [Math]::DivRem(10, 3, [ref]$r) -> 3 余りは$rに格納
IEEERemainder IEEE剰余 [Math]::IEEERemainder(10, 3) -> 1 IEEE754準拠の剰余

定数

メンバー名 機能 使用例 -> 返り値 備考
PI 円周率 [Math]::PI -> 3.14159265358979 定数
E ネイピア数 [Math]::E -> 2.71828182845905 定数

次回は正規表現

いかがでしょうか。機能はかなり豊富ですね。PowerShellは.NETベースのため、豊富な数学関数が利用できます。次回は正規表現とパターンマッチです。PowerShellでは標準で正規表現が使えるんですよね。お楽しみに!!

hirocom777.hatenadiary.org

PowerShell基礎の連載はコチラから