18

PowerShellObjectNotationにいくつかのデータを含むファイルがあります。

@{ X = 'x'; Y = 'y' }

これをファイルから変数にロードしたいと思います。

4

6 に答える 6

24

(私は再現をまとめている間にそれを理解しました)

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

于 2012-05-24T19:18:09.780 に答える
11

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

于 2012-05-25T13:28:17.960 に答える
5

このファイルに拡張子を付けることができる場合.ps1、たとえば、次のdata.ps1コードよりも単純にすることはできません。

$data = <path>\data.ps1
于 2012-05-24T23:43:37.163 に答える
5

@Chadが提案したように、ConvertFrom-StringDataの使用で問題が発生しました。もし、するなら:

$hash = get-content .\test.txt | ConvertFrom-StringData

ハッシュテーブルではなくオブジェクト配列があることがわかりました。実際、ハッシュテーブルの配列があり、それぞれに1つのエントリがあるようです。私は次のように確認しました:

$hash.GetType()

ConvertFrom ..が使用する単一の文字列を確実に形成するために、丸呑みされた入力ファイルの各行を結合する必要があるようです。

$hash = ((get-content .\test.txt) -join '`n') | ConvertFrom-StringData
于 2013-04-18T14:45:49.827 に答える
3

PowerShell 5.0以降、

Import-PowerShellDataFile

.psd1-fileから値をインポートします。したがって、ファイルの名前を*.psd1に変更するだけです。

公式ヘルプはこちらです。

于 2019-03-06T17:29:40.333 に答える
2

これは古い投稿ですが、これは受け入れられているソリューションにひねりを加えたものであり、おそらく少し「安全」です。信頼できないファイルを覚えておいてください。

メモから、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ファイル)は単なるハッシュテーブルであるため、この概念はスクリプトブロックなどを取り込むのにも役立つ場合があります。

参照:https ://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.checkrestrictedlanguage?view = powershellsdk-1.1.0

于 2018-07-06T12:33:32.833 に答える