2015-05-06 22 views
0

我想解析http://up-for-grabs.net/#/以使用powershell獲取其CSV文件中的內容。我已經寫了下面的代碼到現在如何解析http://up-for-grabs.net/#/中嵌入的javascript變量數組?

$URL = "http://up-for-grabs.net/#/" 
$HTML = Invoke-WebRequest -Uri $URL 
$script_blocks = $HTML.ParsedHtml.getElementsByTagName("script") | Where{ $_.type -eq ‘text/javascript’ } 

$content = "" 
foreach ($script_block in $script_blocks) 
{ 
    if($script_block.innerHTML -ne $null -and ` 
     $script_block.innerHTML.trim().StartsWith("var files")) 
    { 
     $content = $script_block.innerHTML.trim() 
    } 
} 

在內容進一步看,這似乎是嵌入在JavaScript中,其初始行的格式如下變量數組。它的數組中沒有空格或是我創建的新行來提高可讀性。

<script type="text/javascript"> 
    var files = { 

    "aspnet-razor-4":{"name":"ASP.NET Razor 4","desc":"Parser and code generator for CSHTML files used in view pages for MVC web apps.","site":"https://github.com/aspnet/Razor","tags":["Microsoft","ASP.NET","Razor","MVC"], "upforgrabs":{"name":"up-for-grabs","link":"https://github.com/aspnet/Razor/labels/up-for-grabs"}}, 

    "fsharpdatadbpedia":{"name":"FSharp.Data.DbPedia","desc":"FSharp.Data.DbPedia - An F# type provider for DBpedia","site":"https://github.com/fsprojects/FSharp.Data.DbPedia","tags":[".NET","DbPedia","F#"],"upforgrabs":{"name":"up-for-grabs","link":"https://github.com/fsprojects/FSharp.Data.DbPedia/labels/up-for-grabs"}}, 

    "makesharp":{"name":"Make#","desc":"Use C# scripts to automate the building process","site":"https://github.com/sapiens/MakeSharp","tags":[".Net","C#","make","build","automation","tools"],"upforgrabs":{"name":"up-for-grabs","link":"https://github.com/sapiens/MakeSharp/labels/up-for-grabs"}}, 

    "stateprinter":{"name":"StatePrinter","desc":"Automating unittest asserts and ToString() coding.","site":"https://github.com/kbilsted/StatePrinter","tags":["TDD","Unit Testing","TDD",".NET","C#","ToString","Debugging"],"upforgrabs":{"name":"Help wanted","link":"https://github.com/kbilsted/StatePrinter/labels/Help%20wanted"}} 

</script> 

這立即其次是

var projects = new Array(); 

for (var fileName in files) { 
    projects.push(files[fileName]); 
} 

如何能夠做到在PowerShell中類似的快速解析,而無需編寫代碼的大串與符號化。

回答

0

經過一番研究,我發現這是一個JSON內容,需要使用powershell cmdlet ConvertFrom-Json。我不想在這裏複製整個腳本。請查看this GitHub location以瞭解如何有效使用此cmdlet。基本上,您需要記住此cmdlet返回的對象是需要枚舉以獲取各種屬性的自定義對象。它不是一個數組,所以只有foreach才能發現內容。小代碼示例如下

$file_json = $file_string | ConvertFrom-Json 
$delim = " ; " 

foreach ($item in $file_json | gm) 
{ 
    $props = $file_json.$($item.Name) 
    if($props.MemberType) {continue} 

    $row = $props.name.ToString() 
    $row += $delim + $props.desc.ToString() 
    $row += $delim + $props.site.ToString() 
} 

在網絡上搜索此cmdlet將爲您提供有關如何處理此轉換的更多詳細信息。