在Windows PowerShell中,我们会发现有两个类似的命令如标题所言:ConvertFrom-CSV 与 ConvertFrom-StringData 而从表现呈现的表单看他们的样子是一样的,但到底有何不同呢?
先来看看两者各自的命令说明我们在来进行一番比较:
ConvertFrom-StringData
ConvertFrom-StringData cmdlet 将包含一个或多个键-值对的字符串转换为哈希表。由于每个键-值对必须位于一个单独的行上,所以经常使用 here-string 作为输入格式。
可将 ConvertFrom-StringData cmdlet 视为可在脚本或函数的 DATA 节中使用的安全 cmdlet。在 DATA 节中使用时,字符串的内容必须遵循 DATA 节的规则。有关详细信息,请参阅 about_Data_Sections。
ConvertFrom-CSV
ConvertFrom-CSV cmdlet 通过 ConvertTo-CSV cmdlet 生成的 CSV 长度可变字符串来创建对象。
可使用 ConvertFrom-CSV cmdlet 的参数来指定列标题行(列标题行确定所获得的对象的属性名称)、指定项目分隔符,或指示 ConvertFrom-CSV 使用当前区域性的列表分隔符作为分隔符。
ConvertFrom-CSV 创建的对象是原始对象的 CSV 版本。CSV 对象的属性值是原始对象的属性值的字符串版本。对象的 CSV 版本不含任何方法。
也可使用 Export-CSV 和 Import-CSV cmdlet 将对象转为 CSV 字符串(或将 CSV 字符串转换为变量)。这些 cmdlet 和 ConvertTo-CSV、ConvertFrom-CSV cmdlet 一样,只是它们是将 CSV 字符串保存在文件中。
接下来让我们进行实际比较,先赋值一段内容给Process变量,内容如下。
PS C:\> $Process=@'
>> "Name","CPU"
>> "notepad","0.9828063"
>> "calc","0.436323"
>> '@
>>
然后将变量传递给ConvertFrom-CSV看下结果:
PS C:\> ConvertFrom-Csv -InputObject $Process
Name CPU
---- ---
notepad 0.9828063
calc 0.436323
再通过获得类型我们可以发现,ConvertFrom-CSV生成的其实是一个数组。
PS C:\> (ConvertFrom-Csv -InputObject $Process).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
以同样的形式我们将声明的对象赋值给ConvertFrom-StringData看下结果:
PS C:\> $b=@'
>> Name = Disks.ps1
>> Category = Storage
>> Cost = Free
>> '@
PS C:\> $b|ConvertFrom-StringData
Name Value
---- -----
Cost Free
Name Disks.ps1
Category Storage
而ConvertFrom-StringData生成的其实是一个哈希表:
PS C:\> ($b|ConvertFrom-StringData).gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object