PowerShellObjectNotationにいくつかのデータを含むファイルがあります。
@{ X = 'x'; Y = 'y' }
これをファイルから変数にロードしたいと思います。
PowerShellObjectNotationにいくつかのデータを含むファイルがあります。
@{ X = 'x'; Y = 'y' }
これをファイルから変数にロードしたいと思います。
(私は再現をまとめている間にそれを理解しました)
PS> $content = ( Get-Content .\foo.pson | Out-String )
PS> $data = ( Invoke-Expression $content )
Get-Content
ファイル内の行を含む配列を返します。Out-String
それらを結合するために使用されます。
Invoke-Expression
次にスクリプトを実行すると、結果がキャプチャされます。これはインジェクション攻撃に対してオープンですが、私の特定のケースでは問題ありません。
または、PowerShellの簡潔さを好む場合:
PS> $data = gc .\foo.pson | Out-String | iex
(の短い形式は見つかりませんOut-String
)
ConvertFrom-StringDataを使用しました。このアプローチを使用する場合は、キーと値のペアをそれぞれ独自の行に格納し、引用符なしで格納する方法を変更する必要があります。
#Contents of test.txt
X = x
Y = y
get-content .\test.txt | ConvertFrom-StringData
Name Value
---- -----
X x
Y y
ConvertFrom-StringDataは組み込みのコマンドレットです。ここで利用可能な対応するConvertTo-StringData関数を作成しましたhttp://poshcode.org/1986
このファイルに拡張子を付けることができる場合.ps1
、たとえば、次のdata.ps1
コードよりも単純にすることはできません。
$data = <path>\data.ps1
@Chadが提案したように、ConvertFrom-StringDataの使用で問題が発生しました。もし、するなら:
$hash = get-content .\test.txt | ConvertFrom-StringData
ハッシュテーブルではなくオブジェクト配列があることがわかりました。実際、ハッシュテーブルの配列があり、それぞれに1つのエントリがあるようです。私は次のように確認しました:
$hash.GetType()
ConvertFrom ..が使用する単一の文字列を確実に形成するために、丸呑みされた入力ファイルの各行を結合する必要があるようです。
$hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData
PowerShell 5.0以降、
Import-PowerShellDataFile
.psd1-fileから値をインポートします。したがって、ファイルの名前を*.psd1に変更するだけです。
公式ヘルプはこちらです。
これは古い投稿ですが、これは受け入れられているソリューションにひねりを加えたものであり、おそらく少し「安全」です。信頼できないファイルを覚えておいてください。
メモから、Powershell構文を使用したハッシュテーブルを含むファイルがあります。その制約があれば、直接インポートできます。
$HashPath = ".\foo.pson"
# input file contents
$filecontent = Get-Content -Path $HashPath -Raw -ErrorAction Stop
# put the file in a script block
$scriptBlock = [scriptblock]::Create( $filecontent )
#check that the file contains no other Powershell commands
$scriptBlock.CheckRestrictedLanguage( $allowedCommands, $allowedVariables, $true )
#execute it to create the hashtable
$hashtable = ( & $scriptBlock )
$scriptBlock.CheckRestrictedLanguage
あなたはそれを次のように置き換えることができることに注意してください
$scriptBlock.CheckRestrictedLanguage([string[]]@(), [string[]]@(), $false)
文字列の空のリストを使用して、Powershellコマンドを許可しないようにします。ハッシュテーブルをインポートするとき、これはまさに私たちが望むものです。最後の1つはallowEnvironmentVariables
、この例ではそれをで制限するため$false
です。
ちなみに、Powershellモジュール(psd1ファイル)は単なるハッシュテーブルであるため、この概念はスクリプトブロックなどを取り込むのにも役立つ場合があります。