我想将一个哈希表写出到一个文件中,其中一个哈希表项是数组。我的数组项已写出,但它包含files=System.Object[]
- 注意--一旦这起作用,我将反向执行此过程,并再次读取哈希表。*
clear-host
$resumeFile="c:\users\paul\resume.log"
$files = Get-ChildItem *.txt
$files.GetType()
write-host
$types="txt"
$in="c:\users\paul"
Remove-Item $resumeFile -ErrorAction SilentlyContinue
$resumeParms=@{}
$resumeParms['types']=$types
$resumeParms['in']=($in)
$resumeParms['files']=($files)
$resumeParms.GetEnumerator() | ForEach-Object {"{0}={1}" -f $_.Name,$_.Value} | Set-Content $resumeFile
write-host "Contents of $resumefile"
get-content $resumeFile
结果
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Contents of c:\users\paul\resume.log
files=System.Object[]
types=txt
in=c:\users\paul
2条答案
按热度按时间cygmwpex1#
立即解决的方法是创建自己的数组表示,方法是枚举元素并用
,
分隔它们,并将字符串值包含在'...'
中:这并不是说所有的非基本.NET类型都用
.ToString()
表示法表示为 * string *,这可能不够好,也可能不够好。上面的输出类似于:
下面一节介绍了创建
*.psd1
文件的变体,该文件可以在以后用Import-PowerShellDataFile
读回到哈希表示例中。在文本文件中保存设置/配置数据的替代方法:
PSIni
模块,该模块使用Windows初始化文件(*.ini
)文件格式;参见X1 E2 F1 X的使用示例。Configuration
模块基于持久化的PowerShell * 哈希表文本*提供写入和读取***.psd1
文件**的命令,就像您在源代码中声明它们一样。Import-PowerShellDataFile
,如底部所示。Export-PowerShellDataFile
cmdlet。然而,在GitHub issue #11300中提出了添加该能力。Export-Clixml
创建的基于XML的CLIXML格式,正如Lee Dailey建议的那样,其输出可以在以后使用Import-Clixml
读取。然而,这种格式在 type fidelity 方面也有限制,如this answer中所述。
ConvertTo-Json
/ConvertFrom-Json
,是另一种选择,它使得输出比XML更人性化,但仍然不如纯文本表示**友好;值得注意的是,文件路径中的所有\
字符必须在JSON中转义为\\
。写入可使用
Import-PowerShellDataFile
读取的*.psd1
文件在所述的数据类型约束范围内(本质上,任何不是数字或字符串的内容都将成为 string),修改顶部的代码将PowerShell散列表文字表示写入
*.psd1
文件,以便可以通过Import-PowerShellDataFile
**将其作为[hashtable]
示例读回,这是相当容易的:如前所述,如果您不介意安装模块,可以考虑
Configuration
模块,它内置了此功能。如果稍后使用
Import-PowerShellDataFile settings.psd1
读取settings.psd1
,则会得到一个[hashtable]
示例,可以像往常一样访问该示例的条目,并生成以下显示输出:注意条目(键)的顺序是如何被 * 不 * 保留的,因为哈希表条目本质上是无序的。
在 * 写入 *
*.psd1
文件时,您可以通过将输入哈希表(System.Collections.Hashtable
)声明为[ordered]
来保留键(-creation)顺序,如上所示(这将创建一个System.Collections.Specialized.OrderedDictionary
示例),但不幸的是,在 * 阅读 **.psd1
文件时,该顺序丢失了。从PowerShell 7.0开始,即使您将
[ordered]
放在*.psd1
文件 * 中的@{
* 之前,Import-PowerShellDataFile
也会悄悄地忽略它,并创建一个 * 无序 * 哈希表。vmdwslir2#
这是一个我一直在处理的问题,它让我抓狂。我真的认为应该有一个专门针对这个动作的函数...所以我写了一个。
要使用此函数,请将函数复制到脚本中,运行它,然后
代码带有注解,但对它的功能进行了简要说明。逐步通过数组和哈希表,并将它们添加到字符串中,添加所需的格式,使字符串成为CSV文件,然后将其输出到文件。
这个方法的主要限制是数组中的哈希表必须包含相同数量的字段,如果哈希表中有一个字段不包含数据,要避免这个问题,请确保它至少包含一个空格。
更多关于这一点可以在这里找到:https://grumpy.tech/powershell-convert-hashtable-to-csv/