経緯
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 の回答から。
Get-Content
でファイル読み込みして、取得した文字列をパイプラインでForEach-Object
へ渡す- 内部の
$_.split("\‘n")
で改行コードで分解して配列$raws
に格納 $raws
をforeach
文 でループ(=1行ごとに処理)して$name, $value = $raw.split('=')
でイコールで分解しつつ、左辺を$name
, 右辺を$value
に格納$name
が Null や空文字列だったり (空行を想定)、#
始まりだった場合(コメント行を想定) は環境変数にセットせずにスキップ (continue
)Set-Content env:\$name $value
で環境変数の$name
キーに$value
をセット
という段取りで処理する、という解釈です。
参考
環境変数
- powershell – How do I read a .env file from a .ps1 script? – Stack Overflow
- PowerShellで環境変数を取り扱う(現在のコンソール) #PowerShell – Qiita
- PowerShellでWindows環境変数を“一覧確認・作成・変更・削除”する方法
用語 ‘Get-EnvHashtableInternal’ は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
用語 ‘Get-EnvHashtableInternal’ は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
結局回避してしまったので根本的な原因追及はせず。