(PowerShell) .env ファイルを読み込んで環境変数にセットするスニペット

経緯

PowerShell で .env ファイルを読み込ませて環境変数にセットしたい、と考えました。

PowerShell においては csv 等であれば取り回しが楽ですが、 .env となるとデフォでは関数が用意されていないので自前で読み込ませる必要があります。

コード

.env

VARIABLE=ドットさん
PROPERTY=どっと笑う
ENTITY=どっと疲れる
PARAMETER=どっと舞い込む
ARGUMENT=どっとはらい

dotharai.ps1

# .env ファイルのパス
$dotenvPath = "PATH:\TO\DOTENV\DIRECTORYPATH\.env"

# 読み込み & 環境変数セット
 # Get-Content で .env のファイルパスを指定して読み込み (生、文字コード UTF-8 オプション指定)
# 設定ファイル読み込み
Get-Content -Path $dotenvPath -Raw -Encoding UTF8 | ForEach-Object {
    $raws = $_.split("`n")
    foreach ($raw in $raws) {
        $name, $value = $raw.split('=')
        if ([string]::IsNullOrWhiteSpace($name) -Or $name.Contains('#')) {
          continue
        }
        Set-Content env:\$name $value
    }
}

# 検証
Write-Host $env:VARIABLE
Write-Host $env:PROPERTY
Write-Host $env:ENTITY
Write-Host $env:PARAMETER
Write-Host $env:ARGUMENT

実行結果

> PowerShell -ExecutionPolicy Bypass .\dotoharai.ps1

ドットさん
どっと笑う
どっと疲れる
どっと舞い込む
どっとはらい

上手く行きました。

解説

ベースはこの Stackoverflow の回答から。

  1. Get-Content でファイル読み込みして、取得した文字列をパイプラインで ForEach-Object へ渡す
  2. 内部の $_.split("\‘n") で改行コードで分解して配列 $raws に格納
  3. $rawsforeach 文 でループ(=1行ごとに処理)して
    • $name, $value = $raw.split('=') でイコールで分解しつつ、左辺を $name, 右辺を $value に格納
    • $name が Null や空文字列だったり (空行を想定)、 # 始まりだった場合(コメント行を想定) は環境変数にセットせずにスキップ (continue)
    • Set-Content env:\$name $value で環境変数の $name キーに $value をセット

という段取りで処理する、という解釈です。

参考

環境変数

用語 ‘Get-EnvHashtableInternal’ は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。

用語 ‘Get-EnvHashtableInternal’ は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。

結局回避してしまったので根本的な原因追及はせず。

文字列分割→オブジェクト

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。