0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Powershell]Global Variable With Data Type データ型を指定してグローバル変数を定義する方法

Last updated at Posted at 2021-04-25

というのは例によってどこにも具体例がない

これは完全に書き忘れていましたが、Powershell5.1(64bit)で実験していますが、コメント欄でご指摘いただき、Powershell7でも同じであることが判明しました。

グローバル変数自体は

$Global:stringvarable

のように`$global:'をつけます。

もしくは
about_scopes(powershell-5.1)

New-Variable -Scope global -Name a -Value "One"

という場合もあります。しかし公式の解説にもDatetimeを使ったグローバル変数のサンプルありません。

データ型を指定したPowershellのグローバル変数の例

[System.String]::$global:vbCrLf ; $vbCrLf = "`r`n" 
[System.String]::$local:vbCrLf ; $vbCrLf = "`r`n" 
[System.String]::$Script:vbCrLf ; $vbCrLf = "`r`n" 

このように
[Datatype]::$scope:variablename
という形を取るようです。
Script Local のScopeでも定義できます
これで一応成功していると考えられる理由は、

Get-Variables -Scope Global

で出力するとGlobal変数の一覧に現れるからです。

型指定すると、直接値が代入できない?

これは現在原因が不明ですが型指定を行う場合、データ型を指定しつつ、値を代入することはできないみたいです。
オプションの定義かバージョンの違いなのかもしれません。
もしくは、New-varibaleでもデータの型を指定する項目がないらしいので、もとから指定できないのかもしれません。
と書いていたのですが、実はありました。コメント欄を御覧ください。

サンプルコードで比較

これはうまくいきますが、

$global:DT = "2021/01/01"

こちらは失敗します。

[System.DateTime]::$global:DT = "2021/01/01"

回避策

[System.DateTime]::$global:DT ; $DT = "2021/01/01" ;

とこのように型指定したあとに、代入するという方法を取ると成功します。もちろんこれ以外にもあると思います。
というかコメント欄でご指摘いただいたのですが、実はコロンがいらないようです。

サフィックス(リテラル)もある

もっとも、Powershellも代入する値によって、データ型を指定されます。
ところで、なぜ型指定しなくてもいいし、公式でも型は厳密ではないのにデータ型を重視するのかというと、演算誤差対策のためです。
ただ、公式では、Decimalは128bit浮動小数点型になっています
about_variables
数値リテラルについて
また、Powershellの6であらたにリテラル文字が増えています。
PowerShellを電卓として使う際のTips集

Currency型はない

VBSをやっている人は知っているけどVBAでも十進型(固定小数点4桁付十進型)がなくてCDecを使っている。
これと同じように型を変換することができるが、CDECのようにデータの型まで変換することはできないらしい。

型変換

しかし、それが結構わかるわけがない

PS > "{0:C}" -f 1000.12356
¥1,000

しかもこのときは

 $varCur = {0:C4} -f 1000.12356

変数に代入してもCurrencyではなくStringになっている。

Powershell基本
How-to: The -f Format operator
公式のページはわかりにくい
Use PowerShell and Conditional Formatting to Format Numbers
CがCurrencyとか書いているが、これはリテラルではなく、フォーマットの定義何である。
上記のような書き方は
Example 3A あたりから出てくる。
PowerShell - Composite Formatting references (-f Operator)
一般的には-f演算子(Format Operator)として意識されている。

まとめ

  1. Powershellのグローバル変数にもデータ型を定義することが可能である
  2. ただし、同時に値を設定することはできなりらしい
  3. サフィックス(VBA等ではリテラル文字)を加えることで値を代入するときに決めることもできる。
  4. VBAのCurrency型(4桁固定小数点付き十進)はPowershellにはない
  5. それは型変換というかFormatでしかVBAの通貨型が表現できない。
  6. Decimalは128bit浮動小数点と公式はしている
  7. 今までリテラル文字のDも十進型と思っていたが違うのかもしれない。
  8. Powershell 6.2からリテラル、データ型が増えているので後方互換に注意。

マイクロソフトが6.2とかで狙っているのはPythonみたいな技術計算に使ってもらうことらしい。
そんな暇があったらVBAから移植しやすいようにCurrency型を定義すべきではないのか。
なぜ常識的な手から打たないんだろう。他の言語と競争して勝ちたいなら、足元を固めて、VBAからの互換でもスムーズで事務処理でも使えることをアピールすべきなんですけどね。

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?