2016-02-12 72 views
0

我只是试图适应the scripting guy's example使用ConvertFrom-StringData从一个文本文件中读取数据并解析哈希表:ConvertFrom-StringData是失败铸造Hashtable的

$PSVersionTable.PSVersion; 

[String] $loginsFileName = "$HOME\Logins.txt"; 

Get-Content $loginsFileName; 

[Hashtable] $logins = Get-Content -Path $loginsFileName | ConvertFrom-StringData; 

Write-Host got $logins.count lines from $loginsFileName; 
$logins.GetEnumerator() | Sort-Object Name; 

我被搞砸了:

Major Minor Build Revision 
----- ----- ----- -------- 
3  0  -1  -1  

Lisa=GanzGeheim 
Susanne=ganzgeheim 
Fritz=geheim 
Hans=Geheim 

Der Wert "System.Object[]" vom Typ "System.Object[]" kann nicht in den Typ "System.Collections.Hashtable" konvertiert werden. 
In Zeile:11 Zeichen:1 
+ [Hashtable] $logins = Get-Content -Path $loginsFileName | ConvertFrom-StringData ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : MetadataError: (:) [], ArgumentTransformationMetadataException 
    + FullyQualifiedErrorId : RuntimeException 

got 0 lines from E:\Users\Christian\Logins.txt 

我的猜测:管道出问题了。我试图强调Get-Content通过拥抱(Get-Content-Path $ loginsFileName)来传递一个数组 - 没有任何改进。任何人都可以给我一些提示吗?

回答

1

对不起,误导你更早。你遇到的问题是你得到了一组单键哈希表,因为Get-Content。对于我认为你正在寻找的东西,你应该把它作为一个字符串读入文件中。假设你至少有PowerShell v3:

$logins = Get-Content -Path $loginsFileName -Raw | ConvertFrom-StringData; 

这就是你得到一个单一的散列表应该是一个哈希表数组。自从PowerShell将输出很好地分组以来,这让我有一段时间了。

-Raw是3.0的一个特性。如果您无法访问3.0,则这些解决方案中的任何一个都足够。

$logins = Get-Content -Path $loginsFileName | Out-String | ConvertFrom-StringData; 
$logins = ((Get-Content -Path $loginsFileName) -join "`r`n") | ConvertFrom-StringData; 
+0

非常感谢,-Raw做到了! – Christian

+0

如果你不能使用'-Raw'开关,你应该可以执行'(Get-Content -Path $ loginsFileName) - 加入“'r'n”'来取得相同的结果。 – TheMadTechnician

+0

@TheMadTechnician我在想什么,我应该停止提及约2.0 – Matt