ConvertFrom-String
从字符串内容中提取并分析结构化对象。
语法
ConvertFrom-String
[-Delimiter <String>]
[-PropertyNames <String[]>]
[-InputObject] <String>
[<CommonParameters>]
ConvertFrom-String
[-TemplateFile <String[]>]
[-TemplateContent <String[]>]
[-IncludeExtent]
[-UpdateTemplate]
[-InputObject] <String>
[<CommonParameters>]
说明
ConvertFrom-String
cmdlet 从字符串内容中提取并分析结构化对象。 此 cmdlet 通过分析传统文本流中的文本,生成对象。 对于管道中的每个字符串,该 cmdlet 通过分隔符或分析表达式拆分输入,然后将属性名称分配给每个由此得到的拆分元素。 可提供这些属性名称;如果不提供,它们将自动生成。
该 cmdlet 的默认参数集 ByDelimiter 严格通过正则表达式分隔符进行拆分。 与 Import-Csv
cmdlet 不同,它不执行引号匹配或分隔符转译。
该 cmdlet 的可选参数集 TemplateParsing 从正则表达式捕获的组中生成元素。 有关正则表达式的详细信息,请参阅 about_Regular_Expressions。
此 cmdlet 支持两种模式:基本分隔分析和自动生成的示例驱动的分析。
默认情况下,分隔分析会在空格处将输入拆分,并为得到的组分配属性名称。
通过管道将 ConvertFrom-String
结果传递到其中一个 Format-*
cmdlet 中,可自定义分隔符,或者可使用 Delimiter 参数。
该 cmdlet 还支持 Microsoft Research 的 FlashExtract 研究工作的自动生成的示例驱动的分析。
示例
示例 1:生成具有默认属性名称的对象
"Hello World" | ConvertFrom-String
P1 P2
-- --
Hello World
此命令生成具有默认属性名称(P1 和 P2)的对象。
示例 1A:了解生成对象
此命令生成一个具有属性 P1、P2 的对象;默认情况下,两个属性的类型均为“字符串”。
"Hello World" | ConvertFrom-String | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
P1 NoteProperty string P1=Hello
P2 NoteProperty string P2=World
示例 2:使用分隔符生成具有默认属性名称的对象
此命令生成一个具有域和用户名(使用反斜杠 \
作为分隔符)的对象。 在使用正则表达式时,必须使用另一个反斜杠来转义反斜杠字符。
"Contoso\Administrator" | ConvertFrom-String -Delimiter "\\"
P1 P2
-- --
Contoso Administrator
示例 3:生成包含两个命名属性的对象
以下示例从 Windows 主机文件条目创建对象。
$content = Get-Content C:\Windows\System32\drivers\etc\hosts
$content = $content -match "^[^#]"
$content | ConvertFrom-String -PropertyNames IP, Server
IP Server
-- ------
192.168.7.10 W2012R2
192.168.7.20 W2016
192.168.7.101 WIN8
192.168.7.102 WIN10
Get-Content
cmdlet 将 Windows 主机文件的内容存储在 $content
中。 第二个命令使用与不以 (#
) 开头的任何行匹配的正则表达式删除主机文件开头的任何注释。 最后一个命令使用 Server 和 IP 属性将剩余文本转换为对象。
示例 4:将表达式用作 TemplateContent 参数的值,将结果保存到变量中。
此命令将表达式用作 TemplateContent 参数的值。 为简单起见,表达式保存在变量中。 Windows PowerShell 现了解到,在指向 ConvertFrom-String
的管道上所使用的字符串具有三个属性:
- Name
- phone
- age
$template = @'
{Name*:Phoebe Cat}, {phone:425-123-6789}, {age:6}
{Name*:Lucky Shot}, {phone:(206) 987-4321}, {age:12}
'@
$testText = @'
Phoebe Cat, 425-123-6789, 6
Lucky Shot, (206) 987-4321, 12
Elephant Wise, 425-888-7766, 87
Wild Shrimp, (111) 222-3333, 1
'@
$PersonalData = $testText | ConvertFrom-String -TemplateContent $template
Write-output ("Pet items found: " + ($PersonalData.Count))
$PersonalData
Pet items found: 4
Name phone age
---- ----- ---
Phoebe Cat 425-123-6789 6
Lucky Shot (206) 987-4321 12
Elephant Wise 425-888-7766 87
Wild Shrimp (111) 222-3333 1
每个输入行根据示例匹配情况进行评估。 如果行与模式中给定的示例匹配,则提取值并将值传递给输出变量。
示例数据 $template
提供两个不同的电话格式:
425-123-6789
(206) 987-4321
示例数据还提供了两个不同的年龄格式:
6
12
这意味着 (206) 987 4321
这样的手机号将无法被识别,因为没有与该模式匹配的示例数据(没有连字符)。
示例 5:为生成的属性指定数据类型
此示例与上面的示例 4 相同。 区别是模式字符串包括了每个所需的属性的数据类型。
$template = @'
{[string]Name*:Phoebe Cat}, {[string]phone:425-123-6789}, {[int]age:6}
{[string]Name*:Lucky Shot}, {[string]phone:(206) 987-4321}, {[int]age:12}
'@
$testText = @'
Phoebe Cat, 425-123-6789, 6
Lucky Shot, (206) 987-4321, 12
Elephant Wise, 425-888-7766, 87
Wild Shrimp, (111) 222-3333, 1
'@
$PersonalData = $testText | ConvertFrom-String -TemplateContent $template
Write-output ("Pet items found: " + ($PersonalData.Count))
$PersonalData
Pet items found: 4
Name phone age
---- ----- ---
Phoebe Cat 425-123-6789 6
Lucky Shot (206) 987-4321 12
Elephant Wise 425-888-7766 87
Wild Shrimp (111) 222-3333 1
$PersonalData | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
age NoteProperty int age=6
Name NoteProperty string Name=Phoebe Cat
phone NoteProperty string phone=425-123-6789
Get-Member
cmdlet 用于指示 age 属性为整数。
参数
-Delimiter
指定用于标识元素之间边界的正则表达式。 通过拆分创建的元素将成为生成的对象中的属性。 最终,分隔符将在对 [System.Text.RegularExpressions.RegularExpression]
类型的 Split 方法的调用中使用。
类型: | String |
别名: | DEL |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-IncludeExtent
指示此 cmdlet 包括默认删除的扩展文本属性。
类型: | SwitchParameter |
别名: | IE |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-InputObject
指定从管道接收到的字符串,或包含字符串对象的变量。
类型: | String |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-PropertyNames
指定要向其分配生成对象中的拆分值的属性名称数组。 拆分或分析的每个文本行将生成表示属性值的元素。 如果元素是捕获组的结果,并且该捕获组已命名(如 (?<name>)
或 (?'name')
),则会将该捕获组的名称分配给属性。
如果提供 PropertyName 数组中的任何元素,则这些名称将分配给尚未命名的属性。
如果提供的属性名称超过字段数,PowerShell 将忽略多余的属性名称。 如果所指定的用于命名字段的属性名称数量不足,PowerShell 将自动向任何未命名的属性分配数值属性名称:P1、P2 等。
类型: | String[] |
别名: | PN |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-TemplateContent
指定一个表达式,或一个保存为变量的表达式,用于描述此 cmdlet 会将字符串分配到的属性。 模板字段的语法规范如下:{[optional-typecast]<name>:<example-value>}
。
类型: | String[] |
别名: | TC |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-TemplateFile
将文件指定为数组,包含所需的字符串分析的模板。 在模板文件中,属性和其值括在方括号内,如下所示。 如果属性(如 Name 属性)及其关联的其他属性多次出现,请添加星号 (*
),用于指示这会导致出现多个记录。 这样可避免将多个属性提取到单个记录中。
{Name*:David Chew} {City:Redmond}, {State:WA} {Name*:Evan Narvaez} {Name*:Antonio Moreno} {City:Issaquah}, {State:WA}
类型: | String[] |
别名: | TF |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-UpdateTemplate
指示此 cmdlet 将学习算法的结果保存到模板文件中的注释内。 这可加快算法学习过程的速度。 若要使用此参数,还必须指定具有 TemplateFile 参数的模板文件。
类型: | SwitchParameter |
别名: | UT |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
输入
输出
备注
Windows PowerShell 包含 ConvertFrom-String
的以下别名:
CFS