我在Powershell中有一个字符串,它是一个javascript对象。也就是说,它是从Javascript文件中剥离的一行文本,例如,我可能有
$theline = "{'prod_id':'123456789','prod_price':'100.00','prod_name':'Creative Software Package','prod_img':'https://mysite/images/123456789?$400x350$','prod_desc':'Software - Package - PC - Win7 - x64'};"
Javascript元素可能包含的值不仅包含字母数字字符,而且我认为我不能保证它们不会包含逗号。
我需要做的是将此变量转换为Powershell哈希表。
首先,我考虑将字符串转换为与ConvertFrom-StringData cmdlet匹配的语法。所以最终的结果就像......
$convertedstr = @'
prod_id = 123456789
prod_price = 100.00
prod_name = Creative Software Package
prod_img = https://mysite/images/123456789?$400x350$
prod_desc = Software - Package - PC - Win7 - x64
'@
$table = ConvertFrom-StringData $convertedstr
$table
Name Value
---- -----
prod_desc Software - Package - PC - Win7 - x64
prod_name Creative Software Package
prod_id 123456789
prod_img https://mysite/images/123456789?$400x350$
prod_price 100.00
但是我不知道如何去完成字符串替换。我还找到了ConvertFrom-JSON cmdlet,但由于我在Powershell 2.0上,因此我无法使用它。
我曾尝试过像
这样的东西$theline = $theline -Replace "\{'(\w+)':'(.+)',?\};",'$1 = $2`n'
但它并不像我想的那样匹配它。
$theline
prod_name = Creative Software Package','prod_id':'123456789','prod_price':'100.00`n
我明白为什么正则表达式匹配它是什么,但我不知道如何让它匹配每个“元素。”
对此有何想法?我愿意接受比这个字符串转换和正则表达式替换更容易的东西。
提前致谢。
答案 0 :(得分:2)
从一开始修剪{
,从结尾修剪};
,这基本上会留下一组Key:Value对。然后只需创建一个PSCustomObject,并通过在,
上拆分该数组并在每个数组上执行RegEx匹配为每对添加成员。
$theline = "{'prod_id':'123456789','prod_price':'100.00','prod_name':'Creative Software Package','prod_img':'https://mysite/images/123456789?$400x350$','prod_desc':'Software - Package - PC - Win7 - x64'};"
$JavaImport = New-Object PSObject
$theline.TrimStart("{").trimend("};").split(",")|?{$_ -match "^'(.+?)':'(.+?)'$"}|%{Add-Member -InputObject $JavaImport -NotePropertyName ($Matches[1]) -NotePropertyValue ($Matches[2])}
PS C:\Users\TMTech> $JavaImport
prod_id : 123456789
prod_price : 100.00
prod_name : Creative Software Package
prod_img : https://mysite/images/123456789?$
prod_desc : Software - Package - PC - Win7 - x64
我刚刚意识到你想要一个哈希表。我的错。让我修改一下头发。
$theline = "{'prod_id':'123456789','prod_price':'100.00','prod_name':'Creative Software Package','prod_img':'https://mysite/images/123456789?$400x350$','prod_desc':'Software - Package - PC - Win7 - x64'};"
$JavaImport = @{}
$theline.TrimStart("{").trimend("};").split(",")|?{$_ -match "^'(.+?)':'(.+?)'$"}|%{$JavaImport.add($Matches[1],$Matches[2])}
PS C:\Users\TMTech> $JavaImport
Name Value
---- -----
prod_desc Software - Package - PC - Win7 - x64
prod_img https://mysite/images/123456789?$
prod_id 123456789
prod_price 100.00
prod_name Creative Software Package
这已经被接受了,但我想我会在那里对原点进行评论。由于OP使用双引号输入它,我们实际上丢失了部分URL。我最终将其改为以下内容:
$theline = '''prod_id'':''123456789'',''prod_price'':''100.00'',''prod_name'':''Creative Software Package'',''prod_img'':''https://mysite/images/123456789?$400x350$'',''prod_desc'':''Software - Package - PC - Win7 - x64'''
这样我可以更好地匹配他想要的输入文本。之后我停止丢失URL上的$400x350
。此外,RegEx转义是一个好主意,因此用户的最终解决方案是:
$theline = '''prod_id'':''123456789'',''prod_price'':''100.00'',''prod_name'':''Creative Software Package'',''prod_img'':''https://mysite/images/123456789?$400x350$'',''prod_desc'':''Software - Package - PC - Win7 - x64'''
$JavaImport = @{}
[regex]::escape($theline).split(",")|?{$_ -match "^'(.+?)':'(.+?)'$"}|%{$JavaImport.add([regex]::unescape($Matches[1]),[regex]::unescape($Matches[2]))}